언리얼 엔진/Gameplay Ability System - Udemy
Gameplay Ability System(GAS) - 캐릭터 움직임 및 하이라이트
mane
2024. 2. 5. 01:34
728x90
반응형
인사말
안녕하세요. 이번 포스트에서는 Aura Character 의 움직임과 Enemy Character 의 하이라이트(아웃라인) 표시에 대해 작성하겠습니다.
Aura GameMode Base
AGameModeBase를 상속 받은 AuraGameModeBase 클래스를 생성하였습니다.
게임모드를 만들어서 캐릭터 컨트롤러와 기본 폰에 BP_AuraCharacter 와 BP_AuraPlayerController를 설정해줬습니다.
Aura Character
Aura Character 는 Spring Arm 과 Camera 컴포넌트를 생성하고 아래와 같이 설정합니다.
생성자 부분에서 캐릭터 무브먼트와 컨트롤러 회전에 대한 설정을 변경합니다.
AAuraCharacter::AAuraCharacter()
{
GetCharacterMovement()->bOrientRotationToMovement = true;
GetCharacterMovement()->RotationRate = FRotator(0.0f, 480.f, 0.0f);
GetCharacterMovement()->bConstrainToPlane = true;
GetCharacterMovement()->bSnapToPlaneAtStart = true;
bUseControllerRotationPitch = false;
bUseControllerRotationRoll = false;
bUseControllerRotationYaw = false;
}
Aura Enemy
Enemy 의 하이라이트 표시는 인터페이스를 통해 수행한다.
IEnemyInterface 를 생성하고 Hightlight 와 UnHighlight 를 순수 가상 함수로 만들어줍니다.
// Copyright mane
#pragma once
#include "UObject/Interface.h"
#include "EnemyInterface.generated.h"
UINTERFACE(MinimalAPI)
class UEnemyInterface : public UInterface
{
GENERATED_BODY()
};
/**
*
*/
class AURA_API IEnemyInterface
{
GENERATED_BODY()
public:
virtual void HighlightActor() = 0;
virtual void UnHighlightActor() = 0;
};
그리고 AuraEnemy 클래스에 IEnemyInterface 를 추가합니다.
bHighlighted 를 통해 체크합니다. 해당 인터페이스는 Aura Player Controller 에서 호출합니다.
// Copyright mane
#pragma once
#include "Character/AuraCharacter.h"
#include "Interaction/EnemyInterface.h"
#include "AuraEnemy.generated.h"
/**
*
*/
UCLASS()
class AURA_API AAuraEnemy : public AAuraCharacter, public IEnemyInterface
{
GENERATED_BODY()
public:
protected:
virtual void HighlightActor() override;
virtual void UnHighlightActor() override;
private:
UPROPERTY(BlueprintReadOnly, Category = "Highlight", meta = (AllowPrivateAccess = "true"))
bool bHighlighted = false;
};
Aura Player Controller
플레이어 컨트롤러에서 CursorTrace 함수를 통해 Highlight 인터페이스를 동작시킵니다.
void CursorTrace();
IEnemyInterface* LastActor;
IEnemyInterface* ThisActor;
APlayerController 에 있는 GetHitResultUnderCursor 를 이용합니다.
void AAuraPlayerController::CursorTrace()
{
FHitResult CursorHit;
GetHitResultUnderCursor(ECC_Visibility,false,CursorHit);
if(!CursorHit.bBlockingHit) return;
LastActor = ThisActor;
ThisActor = Cast<IEnemyInterface>(CursorHit.GetActor());
/**
* Line trace from cursor. There are servarl scenarios:
* A. LastActor is null && ThisActor is null
* - Do nothing
* B. LastActor is null && ThisActor is valid
* - Highlight ThisActor
* C. LastActor is valid && ThisActor is null
* - Unhighlight LastActor
* D. Both actors are valid, but LastActor != ThisActor
* - Unhighlight LastActor, and highlight ThisActor
* E. Both actors are valid, and LastActor == ThisActor
* - Do nothing
*/
if(LastActor == nullptr)
{
if(ThisActor != nullptr)
{
// Cast B
ThisActor->HighlightActor();
}
else
{
// Cast A
// Do nothing
}
}
else // LastActor is valid
{
if(ThisActor == nullptr)
{
// Cast C
LastActor->UnHighlightActor();
}
else // both actors are valid
{
if(LastActor != ThisActor)
{
// Cast D
LastActor->UnHighlightActor();
ThisActor->HighlightActor();
}
else
{
// Cast E
// Do nothing
}
}
}
}
728x90
반응형