언리얼 엔진/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를 설정해줬습니다.

GameMdoe


Aura Character

Aura Character 는 Spring ArmCamera 컴포넌트를 생성하고 아래와 같이 설정합니다.

생성자 부분에서 캐릭터 무브먼트와 컨트롤러 회전에 대한 설정을 변경합니다.

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;
}

Component
SpringArm


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 를 이용합니다.

 

APlayerController::GetHitResultUnderCursor

 

docs.unrealengine.com

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
반응형