본문 바로가기

게임프로그래밍/실습2

[실습2] 7. 에너미 인터페이스 만들고 함수 호출하기

1. 에너미 인터페이스 만들기

 

에너미 인터페이스를 만들어 더 유연하고 확장성 있는 기능을 구현할 것이다.

 

 

인터페이스 클래스를 만들자.

 

가장 먼저 인터페이스에서 선언할 함수는 하이라이트 기능을 구현하기 위한 함수이다. 에너미에 마우스를 가져다 대면 하이라이트를 하는 기능을 구현할 것이다.

 

class PRACTICE2_API IEnemyInterface
{
	GENERATED_BODY()

public:
	virtual void HighlightActor() = 0;
	virtual void UnHighlightActor() = 0;
};

 

이제 이 인터페이스를 에너미 클래스에 상속 시키면 된다.

 

#include "CoreMinimal.h"
#include "Character/AuraCharacterBase.h"
#include "Interaction/EnemyInterface.h"
#include "AuraEnemy.generated.h"

UCLASS()
class PRACTICE2_API AAuraEnemy : public AAuraCharacterBase, public IEnemyInterface
{
  GENERATED_BODY()

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

 

이제 이 함수들을 구현해보도록 하자.

 

커서의 움직임을 추적하고 히트한 액터가 있으며 그 액터가 에너미 인터페이스를 가지고 있는지 확인하여 하이라이트 함수를 호출하는 작업을 할 것이다.


2. 에너미 하이라이트 함수 호출하기

 

마우스 추적은 비용이 많이 드는 작업이 아니기 때문에 Tick 함수에서 실시간으로 추적할 것이다.

 

플레이어 컨트롤러 클래스로 가자.

 

virtual void PlayerTick(float DeltaTime) override;

 

플레이어 틱함수를 선언해준다.

 

void CursorTrace();

 

그리고 커서 추적을 진행할 함수도 선언해주자.

 

void AAuraPlayerController::PlayerTick(float DeltaTime)
{
	Super::PlayerTick(DeltaTime);

	CursorTrace();
	
}

 

틱 함수에서는 그저 커서추적 함수를 호출하기만 하면 된다.

 

void AAuraPlayerController::CursorTrace()
{
	FHitResult CursorHit;
	GetHitResultUnderCursor(ECC_Visibility, false, CursorHit);
	if (!CursorHit.bBlockingHit) return;
}

 

커서 추적을 진행한다. 히트가 있을 경우 이 히트한 액터가 에너미 인터페이스로 캐스팅 되는지 확인하면 된다.

 

캐스팅은 두개의 포인터에 저장할 것인데 지난 액터와 현재 액터 두개를 만들 것이다. 프라이빗 섹션에 두개의 포인터를 추가하자.

 

TScriptInterface<IEnemyInterface> LastActor;
TScriptInterface<IEnemyInterface> ThisActor;

 

TScriptInterface 는 인터페이스를 저장할때 사용하는 클래스라고 한다.

 

void AAuraPlayerController::CursorTrace()
{
    FHitResult CursorHit;
    GetHitResultUnderCursor(ECC_Visibility, false, CursorHit);
    if (!CursorHit.bBlockingHit) return;

    LastActor = ThisActor;
    ThisActor = CursorHit.GetActor();

    if (LastActor != ThisActor)
    {
       if (LastActor) LastActor->UnHighlightActor();
       if (ThisActor) ThisActor->HighlightActor();
    }
}

 

현재 액터와 지난 액터가 같지 않으면 최소한 둘중 하나는 널포인트가 아니라는 뜻이다. 그렇기 때문에 널포인트가 아닌쪽에 하이라이트와 언하이라이트 함수를 호출하면 된다.

 

이제 이 하이라이트 함수를 구현하면 된다.

 

이 작업은 이어서 하도록 하겠다. 그전에 컴파일 하고 에디터로 돌아가 한가지 작업만 해두자. 에너미 블루프린트 클래스로 들어가 Mesh에서 가시성 채널을 차단하게 바꾸어야 한다.

 

 

이 작업을 까먹으면 하이라이트가 제대로 되지 않을 것이다.