본문 바로가기

언리얼엔진

[C++] GameModeBase 설정 / Stand, Crouch 애니메이션 / 인터페이스 생성

GPCPlayerController 사용하기

저번에 GPCPlayerController 클래스를 만들어 GPCCharacter의 이동 로직을 옮겨주었다.

언리얼 에디터에서 GPCGameModeBase 기반 블루프린트 클래스를 생성해준다(BP_GPCGameModeBase).

BP_GPCGameModeBase 블루프린트에서 Classes를 수정했다.

- Player Controller Class : GPCPlayerController 설정

사용할 컨트롤러 클래스를 넣어주었다.

 

- Default Pawn Class : BP_Character 설정

기본 Pawn 클래스가 무엇인지 설정해주었다.

 

 

 

 

 

마지막으로 편집 - 프로젝트 세팅 - 프로젝트 / 맵 & 모드 - 기본 게임모드를 BP_GPCGameModeBase로 바꿔주면 된다.


이제 GPCCharacter 클래스에 있던 Move() / Look() 함수와 SetupPlayerInputComponent() 함수를 지워준다.

그리고 Tick()함수의 매개변수에 const를 추가로 붙여주었다.(cpp의 정의 부분도 수정할 것!)

 

* C++에서 Tick() 함수 호출 여부 설정하기

AGPCCharacter::AGPCCharacter()
{
	PrimaryActorTick.bCanEverTick = true;
	.
    .
    .
}

생성자에 있는 PrimaryActorTick.bCanEverTick의 boolean값 설정 여부에 따라서 Tick()함수의 실행 여부가 나뉜다.

true라면 실행, false라면 실행하지 않는다.


BP_Character에 사용할 새 애니메이션 다운로드

새 애니메이션을 받아 사용해보기 위해 마켓플레이스에서 애니메이션을 다운 받았다.

언리얼 마켓플레이스의 무료 탭에서 애니메이션 스타터 팩을 검색하여 현재 GPC_CPP_12 프로젝트에 추가를 해줬다.

* 옛날에 제작된 애니메이션이라서 모션이 좀 이상할 수 있다.

 

그리고 콘텐츠 폴더에 추가된 AnimStarterPack폴더를 볼 수 있다.

AnimStarterPack 폴더 안에 있는 애니메이션 시퀀스들을 빼고 모두 지워주었다.(UE4_Mannequin 폴더는 놔둠)

그리고 모션이 이상한 pistol 애니메이션 시퀀스 3개도 지워주었다.

 

마지막으로 BP_Character 블루프린트에서 Mesh Component에 바인드 된 Skeletal Mesh를 방금 받은 애니메이션의 SK_Mannequin으로 바꿔주었다.(기존에 있던 Skeleton과 잘 구분할 것)

그리고 콘텐츠 폴더의 Mannequin폴더(저번에 이주시킨 에셋)은 그냥 지워주었다.


블렌드 스페이스 2D 생성

BS_Standing 블렌드스페이스 2D 생성

AnimStarterPack 폴더 안에서 블렌드스페이스2D(BS_Standing)을 생성했다.

BS_Standing는 무기 Rifle을 들고 이동하는 모션을 담을 것이다.

BS_Standing의 에셋 디테일에서 Axis Settings 값을 수정해준다.

* 가로 축

- Name : Direction

- Minimum Axis Value : -180.0

- Maximum Axis Value : 180.0

- Number of Grid Divisions : 4

 

* 세로 축

- Name : Speed

- Minimum Axis Value : 0.0

- Maximum Axis Value : 600.0

- Number of Grid Divisions : 2

 

 

 

그리고 이와 같이 그래프에 애니메이션을 배치해주었다.


BS_Crouching블렌드스페이스 2D 생성

이어서 블렌드 스페이스2D로 BS_Crouching도 생성해주었다.

BS_Crouching의 에셋 디테일에서 Axis Settings 값을 수정해준다.

* 가로 축

- Name : Direction

- Minimum Axis Value : -180.0

- Maximum Axis Value : 180.0

- Number of Grid Divisions : 4

 

* 세로 축

- Name : Speed

- Minimum Axis Value : 0.0

- Maximum Axis Value : 300.0

- Number of Grid Divisions : 1

 

 

 

그리고 이와 같이 그래프에 애니메이션을 배치해주었다.


애니메이션 블루프린트 ABP_Character 추가

마찬가지로 AnimStarterPack 폴더 안에 애니메이션 블루프린트(ABP_Character)를 추가해줄 것이다.

생성할 때 부모 클래스로 GPCAnimInstance를 선택하고, UE4_Mannequin으로 타깃 스켈레톤을 설정했다.


이렇게 생성한 ABP_Character 애니메이션 블루프린트의 AnimGraph에 아까 만든 BS_Standing을 올려주고,

최종 애니메이션 포즈와 연결해준 뒤, Coordinates에서 , Y에 Speed를 바인드 해주었다.

(X의 Direction 바인드는 밑에 GPCAnimInstance 클래스에서 Direction 변수를 추가한 뒤 가능)

ABP_Character의 AnimGraph

 

그리고 실행하기 전에 BP_Character 블루프린트의 Mesh 컴포넌트에서 Anim Class를 ABP_Character로 선택해주고

실행해보면 된다.


GPCAnimInstance 클래스 설정
class GPC_CPP_12_API UGPCAnimInstance : public UAnimInstance
{
.
.
.
protected:
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Meta = (ClampMin = "-180", ClampMax = "180"))
		float Direction;

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Meta = (ClampMin = "0", ClampMax = "600"))
		float Speed;
};

BS_Standing에서 필요한 Direction을 구하기 위해서 GPCAnimInstance 클래스에 Direction 변수를 추가했다.

protected: 접근 지정자로, UPROPERTY()를 걸고, Meta로 최소 최대값을 -180 ~ 180으로 설정했다.


void UGPCAnimInstance::NativeUpdateAnimation(float const DeltaSeconds)
{
    if (auto const PawnOwner = TryGetPawnOwner())
    {
        auto const Velocity = PawnOwner->GetVelocity();
        auto const Rotator = FRotator(0, PawnOwner->GetControlRotation().Yaw, 0);

        Direction = CalculateDirection(Velocity, Rotator);
        Speed = Velocity.Size2D();
    }
}

이제 GPCAnimInstance.cpp에서 Direction값을 구해준다.

먼저 Velocity값이 Direction과 Speed 둘 다 필요로 하기 때문에 처음부터 변수를 만들어 값을 따로 저장해주었다.

그리고 Rotator변수를 만들어 CalculateDirection()에 필요한 BaseRotation(기준)이 될 대상의 Rotation(Yaw)을 저장했다.

 

이후 Direction 변수에 CalculateDirection(Velocity, Rotator);값을 넣어주었다.

* CalculateDirection() 함수를 통해서 Direction을 구할 수 있다.

 

마지막으로 GPCCharacter.cpp의 생성자 정의부분에서 bOrientRotationToMovement와 bUseControllerRotationYaw를 서정한 부분은 지워주고 빌드하여 시점 회전에 따라 좀 더 자연스러운 Character 움직임을 구현한다.

* 꼭 빌드하고, 블루프린트 상에 반영이 되었는지 확인할 것.


Crouch 구현하기

블루프린트에서는 Crouch함수가 이미 존재한다.

Character Movement 컴포넌트의 Nav Movement를 보면 Can Crouch 변수 값에 따라서 Capsule의 크기가 달라졌었다.

 

이제 C++에서 Can Crouch 변수의 값을 설정해주도록 해보자.

GPCCharacter 클래스의 생성자 정의 부분에서 Can Crouch에 먼저 접근해보았다.

AGPCCharacter::AGPCCharacter()
{
	auto Movement = GetCharacterMovement();

	Movement->GetNavAgentPropertiesRef().bCanCrouch = true;
}

먼저 Movement 변수를 만들어 GetCharacterMovement() 함수를 통해 CharacterMovement 컴포넌트를 담아두었다.

그리고 여기서 CanCrouch에 접근하기 위해선 GetNavAgentPropertiesRef()를 거쳐 bCanCrouch에 접근할 수 있다.

여기서 bCanCrouch값을 true로 설정하였다.

 

BP_Character 블루프린트의 CharacterMovement 컴포넌트에서 Crouched Half Height를 70.0으로 설정하여

Crouch 시, Capsule의 높이를 바꿔주었다.


ABP_Character 애니메이션 블루프린트에 BS_Crouching을 올려주고, Crouch 키를 추가해주었다.

액션 패핑 - Crouch / C키 입력


ControlledPanwInterface 인터페이스 생성

GPCPlayerController에서 GPCCharacter의 멤버함수인 Crouch를 불러오기 위해 Interface를 만들었다.

새 C++ 클래스 생성 - 부모 클래스 선택에서 Unreal Interface를 선택하여 생성해주었다.(ControlledPawnInterface)

 

* 이름 글자 수 제한 : 프로젝트 명 : 20자 내 / 클래스 명 : 32자 내로 만들어주어야 한다.


#pragma once

#include "CoreMinimal.h"
#include "UObject/Interface.h"
#include "ControlledPawnInterface.generated.h"

// This class does not need to be modified.
UINTERFACE(MinimalAPI)
class UControlledPawnInterface : public UInterface
{
	GENERATED_BODY()
};

class GPC_CPP_12_API IControlledPawnInterface
{
	GENERATED_BODY()

	// Add interface functions to this class. This is the class that will be inherited to implement this interface.
public:

};

C++ 인터페이스 클래스를 만들면 두 개의 클래스가 있다.

먼저 위의 modified 주석이 달린 클래스는 수정하지 말라는 뜻의 클래스이므로 그냥 놔두면 된다.

따라서 우리가 작성할 부분은 그 밑의 클래스에서 Interface함수를 작성하게 될 것이다.