이번에는 몬스터의 블루 프린트를 만들어보고
추가적으로 플레이어와 몬스터를 위한 애니메이션 블루 프린트도 만들어보겠습니다.
1) 몬스터를 위한 기본 클래스 AAuraEnemy
#pragma once
#include "CoreMinimal.h"
#include "Character/AuraCharacterBase.h"
#include "Interface/EnemyInterface.h"
#include "AuraEnemy.generated.h"
/**
*
*/
UCLASS()
class AURA_API AAuraEnemy : public AAuraCharacterBase
{
GENERATED_BODY()
public:
AAuraEnemy();
};
#include "Enemy/AuraEnemy.h"
#include "Aura.h"
AAuraEnemy::AAuraEnemy()
{
GetMesh()->SetCollisionResponseToChannel(ECC_Visibility, ECR_Block);
}
몬스터 클래스의 생성자에서는 충돌처리를 진행할때
ECC_Visibility 채널에 대해서는 Block 하게끔 설정하였습니다.
에디터에서는 위와 같이 블루 프린트를 생성해주었습니다.
이제 대부분의 몬스터 블루프린트는 BP_EnemyBase로부터 만들수 있습니다.
위의 클래스를 통해 다음 2개의 몬스터의 블루 프린트를 만들겠습니다.
이제 각각의 블루 프린트에 사용할 애니메이션 블루 프린트를 만들겠습니다.
애니메이션 블루 프린트의 경우 C++로 만드는 것도 가능하지만,
사용하는 변수를 상황에 따라 추가하기가 힘들기에 언리얼 에디터에서 진행해보겠습니다.
2) 플레이어의 애니메이션 블루 프린트
플레이어의 애니메이션 블루 프린트는 다음과 같이 구성됩니다.
최초 초기화 단계에서 애니메이션 블루 프린트를 소유한 Pawn을 가져와 BP_Player로 캐스트합니다.
캐스트가 성공했다면 Pawn으로부터 CharacterMovement를 가져오겠습니다.
매 프레임마다 BP_Player가 유효한지 확인합니다.
유효하다마녀, CharacterMovement에서 Velocity 값을 가져오고
가져온 값에서 X, Y 값을 가져와 GroundSpeed라는 속도 변수로 가져와 설정합니다.
이 값이 3.0 보다 크다면 움직임을 판단하는 불리언 변수 bShouldMove를 true로 설정합니다.
기본적인 State의 구성은 위와 같습니다.
Idle -> Running 상태로의 전환은 bShouldMove가 true인 경우에 이뤄지고,
Running -> Idle 상태로의 전환은 bShouldMove가 false인 경우에 이뤄집니다.
Running의 경우 매 프레임마다 업데이트되는 Ground Speed 값에 의해
BlendSpace를 조정하여 연출됩니다.
Idle은 단순하게 Idle 애니메이션을 연출합니다.
이때 Loop Animation이 체크되야 애니메이션이 재생을 반복하게 됩니다.
3) 몬스터의 애니메이션 블루 프린트
몬스터의 경우 조금 다른 애니메이션 블루 프린트를 사용합니다.
특정한 애니메이션을 제외하고 기본적인 구조를 동일하게 사용하는 경우에는
일일이 애니메이션 블루 프린트를 만들지 않고 애니메이션 블루 프린트 인스턴스를 만들고
상속시켜 확장하는 것이 훨씬 설계하기가 쉽습니다.
따라서 위와 같이 애니메이션 블루프린트 인스턴스를 만들겠습니다.
구조는 다음과 같습니다.
처음 초기화될때 현재 PawnOwner를 가져와 AuraEnemy로 캐스트합니다.
캐스트가 성공했다면 CharacterMovement 컴로넌트를 가져와 변수로 설정합니다.
가져온 CharacterMovement가 유효한지 매 프레임마다 확인하고
유효하다면 Velocity를 가져오고 이 값을 X,Y값으로 반환하여 이를 GroundSpeed 변수로 설정합니다.
기본적인 State는 위와 같고,
IdleWalkRun State의 경우, GroundSpeed값을 통해 애니메이션을 연출합니다.
이후에 각각의 몬스터들로 하여금 애니메이션 블루프린트 인스턴스를 상속받게끔 설정합니다.
다음으로는 플레이어를 조작하기 위한 PlayerController를 설정하고
현재 게임을 결정하는 GameMode를 만들어보겠습니다.