Tip!!!
- 프로젝트 전체에 걸쳐 공통적으로 자주 사용되는 내용이 있다면 프로젝트명(GPC_CPP_12).h 헤더파일에 #include로
미리 포함시켜주고, 프로젝트명(GPC_CPP_12).h 헤더파일을 가져다 사용하면 좋다.
함수에 기본인수 추가하기
기본 인수를 추가하는 방법에는 정적 멤버변수, 매크로 두 가지 방법이 있다.
//매크로
#define DEFAULT_KEY (INDEX_NONE)
#define DEFAULT_DURATION (5.0f)
#define DEFAULT_COLOR (FColor::Cyan)
//정적 멤버변수
static int32 const Key1;
//다른 cpp파일에서 정의를 따로 해줄 수 있음
int32 const Logger::Key1 = 0;
정적 멤버변수는 선언과 정의를 나눠서 사용할 수 있다. 따라서 헤더파일에서 선언하고, cpp파일에서 정의해줄 수 있다.
하지만 정적 멤버변수를 사용하지 않은 이유는 인텔리센스에서 함수에 들어가는 변수의 값이 무엇인지 한번에 알아보기
어렵다는 문제가 있다. 또한, 정적 멤버변수에 인티저만 사용이 가능한 문제도 있다.
따라서 매크로를 사용하여 기본 인수를 추가해주었다.
그런데 매크로를 정의 후, 외부 파일에서 또 다시 매크로를 정의해줄 수 있는 문제가 있다.
따라서 매크로 선언하고, 사용 후에 바로 #undef로 정의 해제를 해줄 수 있다.
이렇게하면 #undef 이후로 같은 내용의 매크로를 정의할 수 없다.
//선언 및 정의
#define DEFAULT_KEY (INDEX_NONE)
#define DEFAULT_DURATION (5.0f)
#define DEFAULT_COLOR (FColor::Cyan)
.
.
.
//정의 해제
#undef DEFAULT_KEY
#undef DEFAULT_DURATION
#undef DEFAULT_COLOR
플레이 캐릭터 추가하기
Character 에셋을 가져오기 위해 언리얼 에디터의 새 프로젝트 - 게임 - 3인칭 프로젝트(블루프린트)로 하나 만들었다.
새 프로젝트에서 '콘텐츠 - Mannequin 폴더 우클릭 - 이주'를 이용하여(Animations 폴더의 맨 위 3개만 제외하고 이주) 우리가 사용하는 GPC_CPP_12 프로젝트의 Content 폴더로 이주시켜준다.
블렌드스페이스 추가
다시 언리얼 에디터 GPC_CPP_12 프로젝트로 돌아와서, 애니메이션 폴더에 블렌드스페이스1D를 하나 추가한다.
블렌드 스페이스 에셋 디테일에서 가로축을 이와 같이 수정했다.
그리고 가로축의 가장 좌측부터 Idle - Walk - Run 애니메이션을 지정했다.
AnimInstance 생성하기
이후 CPP 클래스를 하나 추가해줄 것이다. 부모클래스 선택에서 모든 클래스 표시를 하고 AnimInstance를 선택해준다.
GPCAnimInstance의 이름으로 클래스를 생성해주었다.
GPCAnimInstance 클래스에서는 애니메이션 블루프린트의 이벤트 그래프에서 처리하던 내용(속도, 방향 구하기)들을
처리할 것이다.
원래 블루프린트에서 사용되던 BlueprintUpdateAnimation 함수를 VS에서 구현하기 위해 NativeUpdateAnimation() 함수를
추가해주었다. 이는 매 초마다 불리는 Update이다.
#pragma once
#include "CoreMinimal.h"
#include "Animation/AnimInstance.h"
#include "GPCAnimInstance.generated.h"
UCLASS()
class GPC_CPP_12_API UGPCAnimInstance : public UAnimInstance
{
GENERATED_BODY()
public:
void NativeUpdateAnimation(float const DeltaSeconds) override;
protected:
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Meta = (ClampMin = "0", ClampMax = "600"))
float Speed;
};
* const의 유무 차이 : 원래 없던걸 새로 붙혀 보안성이 강화되는 건 상관없지만, 있던걸 없애서 약화되는 것은 불가능하다.
이제 Speed를 구하면 담아둘 변수 Speed를 만들어주고 UPROPERTY()를 붙여주었다.
- EditDefaultsOnly를 추가하여 애니메이션 블루프린트의 애님 프리뷰 에디터에 Speed변수 값을 나타낼 수 있음
- BlueprintReadOnly를 추가해 블루프린트에서 사용 가능하게 함
- Meta를 사용하여 Speed의 최소값, 최대값을 지정함.
void UGPCAnimInstance::NativeUpdateAnimation(float const DeltaSeconds)
{
if (auto* const PawnOwner = TryGetPawnOwner())
{
Speed = PawnOwner->GetVelocity().Size2D();
}
}
이제 NativeUpdateAnimation()함수의 정의를 만들었다.
if (auto* const PawnOwner = TryGetPawnOwner()) 조건문을 통해 애니메이션 블루프린트의 프리뷰 인스턴스 같은 곳에서
미리 Speed를 받지 못하도록 하기 위해 걸어두었다.
* 대입연산자는 좌측에 대입이 완료된 값이 반환
Speed변수에는 TryGetPawnOwner()로 받아와진 PawnOwner의 Velocity에서 2D(x, y) 평면 값을 받아준다.
애니메이션 블루프린트 추가하기
이제 언리얼 에디터로 와서 위에서 완성한 GPCAnimInstance 클래스를 기반으로 애니메이션 블루프린트를 추가해준다.
애니메이션 블루프린트의 부모 클래스로 GPCAnimInstance를 선택해주고, 타깃 스켈레톤은 우리가 이주해온 Mannequin의 스켈레톤을 선택하였다.(ABP_Character)
이제 ABP_Character의 AnimGraph에 아까 만들었던 블렌드 스페이스 BS_Unarmed를 최종 애니메이션 포즈와 연결한다.
BS_Unarmed의 디테일에서 x값만 우리가 만든 Speed 변수를 바인드 해주고, 나머지 Y, Z는 그냥 바인드로 뒀다.
이제 애님 프리뷰 에디터에서 Speed값을 조절하면서 확인해볼 수 있다.
Character 블루프린트 생성
이제 슬슬 캐릭터를 만들고 움직여주기 위한 준비를 한다. 먼저 편집 - 프로젝트 세팅 - 엔진 / 입력에 축매핑을 추가해줬다.
다음으로 새 CPP클래스를 추가해줬다. 부모 클래스로 Character를 선택하여 GPCCharacter 명으로 클래스를 추가했다.
그리고 GPCCharacter 클래스를 우클릭 - 기반 블루프린트 생성을 통해 BP_Character 기반 블루프린트 또한 만들었다.
BP_Character 블루프린트의 Mesh 컴포넌트에는 SK_Mannequin을 선택해주고 Mesh의 위치와 회전값을 수정해주었다.
'언리얼엔진' 카테고리의 다른 글
[C++] Move, Look 함수 정의 / PlayerController 클래스 (3) | 2023.09.14 |
---|---|
[C++] Character의 이동 구현 / SpringArm, Camera 컴포넌트 생성 (0) | 2023.09.12 |
[C++] Logger(UE_LOG, GEngine) (0) | 2023.09.07 |
[C++] UFUNCTION() (0) | 2023.09.06 |
[C++] 리플렉션 / UPROPERTY() (0) | 2023.09.06 |