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에서 가시성 채널을 차단하게 바꾸어야 한다.
이 작업을 까먹으면 하이라이트가 제대로 되지 않을 것이다.
'게임프로그래밍 > 실습2' 카테고리의 다른 글
어빌리티 시스템 컴포넌트 (Ability System Component) (0) | 2024.11.28 |
---|---|
[실습2] 8. 에너미 하이라이트 하기 (0) | 2024.11.28 |
[실습2] 6. 게임모드를 만들고 플레이어 이동 구현하기 (0) | 2024.11.28 |
[실습2] 5. 인풋 매핑하기 (0) | 2024.11.28 |
[실습2] 4. 커스텀 플레이어 컨트롤러와 향상된 인풋 (0) | 2024.11.27 |