1. PlayMontageAndWait 게임플레이 어빌리티 함수

(1) 몽타주 생성

Assets 폴더에서 Spear Goblin의 공격 애니메이션을 찾아 몽타주로 만든다.

 

(2) 몽타주 재생

GA_Attack에서 PlayMontageAndWait 노드를 사용하여 몽타주를 재생한다.

 

 

2. 몬스터에 모션워핑 적용

이제 플레이해보면 몬스터가 플레이어 캐릭터를 바라보지 않은 채로 공격할 때가 있다.

플레이어 캐릭터가 공격할때 해당 지점을 바라보며 공격하게 하기 위해 모션 워핑을 적용했던 것과 마찬가지로 BP_EnemyBase에 대해 모션 워핑을 적용할 것이다.

 

 

(1) 모션 워핑 컴포넌트 추가

 

(2) Update Facing Target 이벤트 구성

Update Facing Target 이벤트가 호출되면 워프 타겟을 변경하도록 지정한다.

 

 

(3) 공격 몽타주에 노티파이 스테이트 추가

- 몬스터의 회전만 원하므로 디테일 창의 설정에서 Warp Translation의 체크를 해제한다.

- 몬스터가 캐릭터를 마주보고 회전할 것이므로 Rotation Type을 Facing으로 지정한다.

 

 

3. 공격 대상

이제 모션 워핑을 할 타겟(공격 대상)에 대한 정보를 넘겨줘야 한다.

 

(1) AuraEnemy에서 공격 대상에 대한 포인터 선언

public:
	UPROPERTY(BlueprintReadWrite, Category="Combat")
	TObjectPtr<AActor> CombatTarget;

 

 

(2) EnemyInterface에서 블루프린트 네이티브 이벤트 선언

적이 공격 대상에 대한 종속성을 갖지 않게 하기위해 에너미 인터페이스를 활용할 것이다.

UINTERFACE(MinimalAPI)
class UEnemyInterface : public UInterface
{
	GENERATED_BODY()
};

class AURA_API IEnemyInterface
{
	GENERATED_BODY()
	
public:
	// 순수 추상화
	virtual void HighlightActor() = 0;
	virtual void UnHighlightActor() = 0;

	UFUNCTION(BlueprintCallable, BlueprintNativeEvent)
	void SetCombatTarget(AActor* InCombatTarget);

	UFUNCTION(BlueprintCallable, BlueprintNativeEvent)
	AActor* GetCombatTarget() const;
};

블루프린트에서 호출가능한 블루프린트 네이티브 이벤트 함수로 지정한다.

이 함수들은 해당 인터페이스를 상속받는 클래스에서 오버라이드 할 수 있다.

 

 

(3) CombatInterface에서 함수 오버라이드

public:
	virtual void HighlightActor() override;
	virtual void UnHighlightActor() override;

	// 전투 인터페이스 오버라이드
	virtual int32 GetPlayerLevel() override;
	virtual void Die() override;
	virtual void SetCombatTarget_Implementation(AActor* InCombatTarget) override;
	virtual AActor* GetCombatTarget_Implementation() const override;
	// 전투 인터페이스 끝
void AAuraEnemy::SetCombatTarget_Implementation(AActor* InCombatTarget)
{
    CombatTarget = InCombatTarget;
}

AActor* AAuraEnemy::GetCombatTarget_Implementation() const
{
    return CombatTarget;
}

 

 

(4) 블랙보드 키를 멤버 변수로 생성

CombatTargetSelector를 블랙보드 키 선택 툴 타입의 멤버 변수로 지정한다.

 

비헤이비어 트리에서 모든 BTT_Attack 노드에 대해 기본값에 위치한 Combat Target Selector를 TargetToFollow로 지정한다.

이제 BTT_Attack 내에서 CombatTargetSelector를 이용할 수 있다.

 

 

(5) BTT_Attack에서 블랙보드 키를 가져와 타겟으로 지정

블랙보드 키 값을 액터로 가져와 유효하다면 Set Combat Target으로 지정하여 Enemy 클래스가 AActor*로 대상을 가지고 있게 된다.

 

 

(6) GA_MeleeAttack에서 Update Facing Target 함수 호출

이제 Combat Target을 가져와서 Update Facing Target 함수에 인자로 넘겨준다.

이 때 액터의 EnemyInterface에서 타겟을 가져올 수 있다.

타겟에 대한 Location을 가져오고 CombatInterface에서 Update Facing Target 함수를 호출해서 Location을 전달한다.