Unreal 공부/UE5 GameDev

[UE5] ToonTank (1)

메카인 2023. 11. 17. 12:50

Pawn

Pawn

 

게임에서 사용자의 입력에 반응하고, 이동이나 다른 행동을 수행할 수 있는 액터의 기본 클래스입니다.

Pawn의 주요 특징

  1. 제어 가능: Pawn은 플레이어 또는 인공지능(AI)에 의해 제어될 수 있습니다. 예를 들어, 플레이어 캐릭터, 차량, 기타 조종 가능한 오브젝트 등이 이에 해당합니다.
  2. 입력 처리: Pawn은 사용자의 입력(키보드, 마우스, 게임패드 등)을 받아들여 게임 내에서 액션을 수행할 수 있습니다. 이를 위해 PlayerController와 연결될 수 있습니다.
  3. 이동 및 상호작용: Pawn 클래스는 이동 메커니즘을 구현하는 데 필요한 기본적인 인터페이스와 기능을 제공합니다. 이를 통해 개발자는 다양한 종류의 이동 방식을 구현할 수 있습니다.
  4. Camera와의 통합: Pawn은 종종 카메라 시스템과 통합되어 플레이어의 시점을 제어하는 데 사용됩니다.

Pawn 사용 예시

  • 플레이어 캐릭터: 게임 플레이어가 직접 조종하는 캐릭터.
  • 차량 및 기타 조종 가능한 오브젝트: 플레이어가 조종할 수 있는 차량이나 다른 탈것.
  • AI 캐릭터: 인공지능이 제어하는 캐릭터나 오브젝트.

Pawn의 기본 함수들

BeginPlay() : Called when the Game strats or when spawned
Tick() : Called every frame
SetupPlayerInputComponent() : Call to bind functionality to input

 

기본적으로 폰 클래스에는 이미 컴포넌트가 하나 있는데, 이를 루트 컴포넌트라고 합니다.

// Actor.h
USceneComponent* RootComponent;
  • 우리는 이 루트 컴포넌트를 재할당 할 수 있습니다, 씬 컴포넌트에서 타입이 파생된 다른 객체로 말이죠

 

UObject::CreateDefaultSubobject

클래스의 생성자 내에서 새로운 서브오브젝트(예: 컴포넌트)를 생성하고 초기화하는 데 사용됩니다. 이 함수는 주로 액터 클래스(AActor) 또는 그 파생 클래스에서 사용됩니다.

References

Module CoreUObject
Header /Engine/Source/Runtime/CoreUObject/Public/UObject/Object.h
Include #include "UObject/Object.h"

Syntax

template<class TReturnType, class TClassToConstructByDefault>
TReturnType * CreateDefaultSubobject
(
    FName SubobjectName,
    bool bTransient
)

 

기능 및 사용

  • 서브오브젝트 생성: CreateDefaultSubobject는 특정 타입의 서브오브젝트(컴포넌트)를 생성하고, 해당 오브젝트에 대한 참조를 반환합니다.
  • 초기화: 생성된 서브오브젝트는 클래스의 생성자에서 초기화됩니다. 이를 통해 액터가 게임 세계에 스폰될 때 필요한 컴포넌트를 자동으로 포함하게 됩니다.

사용 예시

class AMyActor : public AActor
{
public:
    AMyActor()
    {
        // MeshComponent라는 이름의 UStaticMeshComponent 생성
        MeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MeshComponent"));
        // 이 컴포넌트를 액터의 루트 컴포넌트로 설정
        RootComponent = MeshComponent;
    }

protected:
    UStaticMeshComponent* MeshComponent;
};

 

 

UObject::GetDefaultSubobjectByName

지정된 이름을 가진 서브오브젝트를 검색하고 반환하는 데 사용됩니다. 이 함수는 주로 클래스의 인스턴스 내에 이미 생성된 서브오브젝트(컴포넌트 등)를 찾을 때 사용됩니다.

References

Module CoreUObject
Header /Engine/Source/Runtime/CoreUObject/Public/UObject/Object.h
Include #include "UObject/Object.h"
Source /Engine/Source/Runtime/CoreUObject/Private/UObject/Obj.cpp

Syntax

UObject * GetDefaultSubobjectByName
(
    FName ToFind
)

 

기능 및 사용

  • 서브오브젝트 검색: GetDefaultSubobjectByName는 주어진 이름을 가진 서브오브젝트를 찾아 반환합니다. 이 함수는 UObject 클래스의 멤버 함수입니다.
  • 타입 캐스팅 필요: 반환된 서브오브젝트는 UObject 타입이므로, 적절한 타입으로 캐스팅이 필요할 수 있습니다.

사용 예시

class AMyActor : public AActor
{
public:
    AMyActor()
    {
        // 컴포넌트 생성 및 추가
        MeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MeshComponent"));
    }

    void SomeFunction()
    {
        // 기존에 생성된 MeshComponent 검색
        UStaticMeshComponent* FoundComponent = Cast<UStaticMeshComponent>(GetDefaultSubobjectByName(TEXT("MeshComponent")));
        if (FoundComponent)
        {
            // 컴포넌트를 사용한 로직
        }
    }

protected:
    UStaticMeshComponent* MeshComponent;
};

주의사항

  • GetDefaultSubobjectByName를 사용할 때는 서브오브젝트의 정확한 이름을 제공해야 합니다.
  • 반환된 객체는 항상 적절한 타입으로 캐스팅해야 합니다. 캐스팅이 실패하면 반환된 객체는 nullptr일 수 있습니다.

 

USceneComponent::SetupAttachment

메서드로, 하나의 컴포넌트를 다른 컴포넌트에 부착하는 데 사용됩니다. 이 메서드는 주로 액터의 컴포넌트를 구성할 때 사용되며, 부모-자식 관계를 설정하는 데 도움이 됩니다.

References

Module Engine
Header /Engine/Source/Runtime/Engine/Classes/Components/SceneComponent.h
Include #include "Components/SceneComponent.h"
Source /Engine/Source/Runtime/Engine/Private/Components/SceneComponent.cpp

Syntax

void SetupAttachment
(
    USceneComponent * InParent,
    FName InSocketName
)

 

사용 예시

class AMyActor : public AActor
{
public:
    AMyActor()
    {
        // 루트 컴포넌트 생성 및 설정
        RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComponent"));

        // 자식 컴포넌트 생성 및 부착
        ChildComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("ChildComponent"));
        ChildComponent->SetupAttachment(RootComponent);
    }

protected:
    UStaticMeshComponent* ChildComponent;
};

 

주의사항

  • SetupAttachment는 컴포넌트가 완전히 초기화되기 전, 즉 주로 생성자 내에서 호출됩니다.
  • 부모 컴포넌트가 없거나 잘못 지정된 경우, SetupAttachment 호출은 실패할 수 있습니다.

UCameraComponent

카메라 컴포넌트로, 게임 내에서 시각적 관점을 제공합니다. 이 컴포넌트는 3D 공간에서의 시점을 정의하고, 게임 플레이어가 게임 세계를 보는 방식을 결정하는 데 사용됩니다.

References

Module Engine
Header /Engine/Source/Runtime/Engine/Classes/Camera/CameraComponent.h
Include #include "Camera/CameraComponent.h"

Syntax : class UCameraComponent : public USceneComponent

 

주요 기능

  • 시점 제공: UCameraComponent는 게임 세계를 플레이어에게 어떻게 보여줄지 결정합니다. 이는 일인칭(FPS), 삼인칭(TPS), 탑 뷰 등 다양한 카메라 관점을 구현할 수 있습니다.
  • 커스터마이즈 가능: 위치, 회전, 필드 오브 뷰(Field of View, FOV), 클리핑 플레인 등 다양한 설정을 통해 카메라의 동작을 세밀하게 조정할 수 있습니다.
  • 액터에 부착: UCameraComponent는 일반적으로 액터(예: 플레이어 캐릭터)에 부착되어, 액터의 움직임에 따라 카메라의 시점이 변경됩니다.

 

 

 

USpringArmComponent

컴포넌트로, 카메라와 같은 다른 컴포넌트를 일정 거리와 각도를 유지하며 따라다니게 하는 기능을 제공합니다. 이 컴포넌트는 주로 삼인칭 카메라(TPS) 설정에 사용되며, 카메라가 플레이어 캐릭터 주변을 부드럽게 움직이도록 해줍니다.

 

References

Module Engine
Header /Engine/Source/Runtime/Engine/Classes/GameFramework/SpringArmComponent.h
Include #include "GameFramework/SpringArmComponent.h"

Syntax : class USpringArmComponent : public USceneComponent

 

주요 기능

  • 거리 유지: USpringArmComponent는 연결된 컴포넌트(예: 카메라)를 일정 거리만큼 떨어져 있도록 유지합니다. 이 거리는 조정 가능합니다.
  • 충돌 처리: Spring Arm은 연결된 컴포넌트가 세계의 다른 오브젝트와 충돌하는 것을 방지합니다. 예를 들어, 벽 뒤에 있을 때 카메라가 벽을 통과하지 않도록 거리를 자동으로 조절합니다.
  • 부드러운 카메라 이동: 카메라의 움직임이 보다 부드럽게 느껴지도록 해줍니다. 이는 플레이어의 움직임이나 카메라 컨트롤에 대한 갑작스러운 변화를 완화시킵니다.

사용 예시

class AMyCharacter : public ACharacter
{
public:
    AMyCharacter()
    {
        // 스프링 암 컴포넌트 생성 및 설정
        SpringArmComponent = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArm"));
        SpringArmComponent->SetupAttachment(RootComponent);
        SpringArmComponent->TargetArmLength = 300.0f; // 스프링 암 길이
        SpringArmComponent->bUsePawnControlRotation = true; // 캐릭터의 회전에 카메라 회전을 연동

        // 카메라 컴포넌트 생성 및 스프링 암에 부착
        CameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera"));
        CameraComponent->SetupAttachment(SpringArmComponent);
    }

protected:
    USpringArmComponent* SpringArmComponent;
    UCameraComponent* CameraComponent;
};

 

주의사항

  • USpringArmComponent의 설정에 따라 카메라의 거리, 회전, 움직임의 부드러움 등이 결정됩니다.
  • 충돌 처리 기능을 활성화하면, 카메라가 벽이나 다른 오브젝트에 가로막힐 경우 자동으로 거리를 조절하여 플레이어의 시야를 유지할 수 있습니다.
  • 스프링 암의 길이와 각도를 조절함으로써 다양한 카메라 효과를 구현할 수 있습니다.

 

ACharacter::SetupPlayerInputComponent

이 함수는 게임 내의 플레이어 컨트롤 설정을 담당합니다. 즉, 키보드, 마우스, 게임패드 등의 입력 장치로부터의 입력을 처리하고, 이를 플레이어 캐릭터의 동작으로 변환하는 역할을 합니다.  

 

References

Module Engine
Header /Engine/Source/Runtime/Engine/Classes/GameFramework/Character.h
Include #include "GameFramework/Character.h"
Source /Engine/Source/Runtime/Engine/Private/Character.cpp

Syntax

virtual void SetupPlayerInputComponent
(
    class UInputComponent * PlayerInputComponent
)

 
사용 예시
void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
    Super::SetupPlayerInputComponent(PlayerInputComponent);

    // 이동 관련 입력 바인딩
    PlayerInputComponent->BindAxis("MoveForward", this, &AMyCharacter::MoveForward);
    PlayerInputComponent->BindAxis("MoveRight", this, &AMyCharacter::MoveRight);

    // 점프 관련 입력 바인딩
    PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &ACharacter::Jump);
    PlayerInputComponent->BindAction("Jump", IE_Released, this, &ACharacter::StopJumping);

    // 기타 입력 처리 바인딩 (예: 사격, 상호작용 등)
}
void AMyCharacter::MoveForward(float Value)
{
	...
}
  • 이 예시에서 BindAxis는 연속적인 입력(예: 이동)을 처리하고, BindAction은 단발적인 입력(예: 점프, 사격)을 처리합니다. IE_PressedIE_Released는 각각 키를 누를 때와 떼었을 때의 동작을 나타냅니다.

 

AActor::AddActorLocalOffset

함수는 Unreal Engine에서 액터의 위치를 지역 좌표계를 기준으로 변경하는 데 사용됩니다. 이 함수는 액터의 현재 위치에 지정된 오프셋을 추가하여 액터의 위치를 이동시킵니다. 이때 이동은 액터의 지역 좌표계를 기준으로 적용되므로, 액터의 방향과 회전에 따라 오프셋이 다르게 적용됩니다.

References

Module Engine
Header /Engine/Source/Runtime/Engine/Classes/GameFramework/Actor.h
Include #include "GameFramework/Actor.h"
Source /Engine/Source/Runtime/Engine/Private/Actor.cpp

Syntax

void AddActorLocalOffset
(
    FVector DeltaLocation,
    bool bSweep,
    FHitResult * OutSweepHitResult,
    ETeleportType Teleport
)

 

주요 특징과 사용법은 다음과 같습니다:

  1. 지역 좌표계 기반 이동: AddActorLocalOffset은 액터의 지역 좌표계를 기준으로 이동시킵니다. 예를 들어, 액터가 회전한 상태에서 이 함수를 사용하면, 액터의 전방, 측면 또는 상하 방향으로 이동합니다.
  2. 오프셋 값: 이 함수는 FVector 타입의 오프셋 값을 인자로 받습니다. 이 오프셋은 액터의 현재 위치에서 추가될 x, y, z 축 방향의 변화량을 나타냅니다.
  3. 이동과 회전: AddActorLocalOffset은 액터의 현재 회전 상태를 고려하여 이동합니다. 따라서, 액터가 회전한 상태에서 이 함수를 사용하면, 이동 방향도 회전에 따라 달라집니다.
  4. 프레임 속도와 독립적인 이동: 게임의 프레임 속도에 영향을 받지 않도록 이동량을 조절하기 위해, 종종 이 함수와 함께 DeltaTime을 사용하여 프레임당 이동량을 조절합니다.
  5. 예시 코드:이 예시에서는 MyActor라는 액터의 현재 위치에서 X축 방향으로 100 단위만큼 이동시키는 코드입니다.
// FVector 타입의 오프셋 생성
FVector NewOffset = FVector(100, 0, 0);

// 액터의 위치에 지역 오프셋 추가
MyActor->AddActorLocalOffset(NewOffset);

 

AddActorLocalOffset는 특히 캐릭터 이동, 카메라 이동, 또는 다양한 게임 오브젝트의 동적 위치 조정에 유용하게 사용됩니다.

 

사용 예시

void ATank::Move(float Value)
{
	FVector DeltaLocation = FVector::ZeorVector;
	DeltaLocation.X = Value;
	AddActorLocalOffSet(DeltaLocation);
}

 

 

UGameplayStatics::GetWorldDeltaSeconds

함수는 Unreal Engine에서 현재 게임의 월드에 대한 지난 프레임 이후의 시간 경과(즉, 프레임 간의 시간 차이)를 초 단위로 반환합니다.

References

Module Engine
Header /Engine/Source/Runtime/Engine/Classes/Kismet/GameplayStatics.h
Include #include "Kismet/GameplayStatics.h"
Source /Engine/Source/Runtime/Engine/Private/GameplayStatics.cpp

Syntax

static float GetWorldDeltaSeconds
(
    const UObject * WorldContextObject
)

 

사용 예시

float DeltaTime = UGameplayStatics::GetWorldDeltaSeconds(GetWorld());

// DeltaTime을 사용하여 프레임 속도에 독립적인 이동 구현
FVector NewLocation = MyActor->GetActorLocation() + (MovementDirection * MovementSpeed * DeltaTime);
MyActor->SetActorLocation(NewLocation);

 

FRotator

Unreal Engine에서 회전을 나타내는 구조체입니다. 이 구조체는 주로 3D 공간에서 객체의 방향을 제어하는 데 사용됩니다. FRotator는 각도를 기반으로 하는 세 개의 부동 소수점 값(Pitch, Yaw, Roll)으로 구성됩니다.

References

Module Core
Header /Engine/Source/Runtime/Core/Public/Math/Rotator.h
Include #include "Math/Rotator.h"

Syntax : struct FRotator

 

FRotator의 구성 요소:

  1. Pitch (경사): X축 주위의 회전을 나타냅니다. 예를 들어, 위 아래를 바라보는 각도가 이에 해당합니다.
  2. Yaw (요우): Z축 주위의 회전을 나타냅니다. 즉, 좌우를 바라보는 각도입니다.
  3. Roll (롤): Y축 주위의 회전을 나타냅니다. 이는 액터가 옆으로 기울어지는 각도를 의미합니다.

FRotator의 주요 사용 사례:

  • 객체의 방향 설정: FRotator는 3D 공간에서 액터나 컴포넌트의 방향을 설정하는 데 주로 사용됩니다. 예를 들어, 카메라의 방향을 조절하거나 캐릭터가 바라보는 방향을 변경하는 데 사용됩니다.
  • 애니메이션 및 물리 효과: 특정 방향으로의 회전을 적용함으로써, 애니메이션 효과나 물리적 반응을 구현할 수 있습니다.
  • 사용자 입력에 따른 회전: 사용자의 입력(예: 마우스 이동, 조이스틱 조작)을 FRotator 값으로 변환하여, 게임 내 객체의 회전을 제어할 수 있습니다.

사용 예시

// FRotator를 사용하여 액터의 방향을 설정하는 예
FRotator NewRotation = FRotator(0.f, 90.f, 0.f); // Pitch 0도, Yaw 90도, Roll 0도
MyActor->SetActorRotation(NewRotation);
  • 이 예제에서는 MyActor라는 액터를 Z축을 중심으로 90도 회전시키고 있습니다. 이런 방식으로 FRotator를 활용하여 3D 공간에서의 정밀한 방향 제어가 가능합니다.

주의 사항

  • FRotator는 각도를 사용하기 때문에, 회전의 각도를 직관적으로 이해하고 조절하기 쉽다는 장점이 있습니다. 하지만, 특정 상황에서는 짐벌 락(Gimbal Lock)과 같은 문제가 발생할 수 있으므로, 이를 고려하여 사용해야 합니다.

AddActorLocalRotation

함수로, 액터에 지역 좌표계 기반의 회전을 추가하는 데 사용됩니다. 이 함수는 액터의 현재 회전에 지정된 회전을 추가하여, 액터의 방향을 변경하는 데 사용됩니다.

 

References

Module Engine
Header /Engine/Source/Runtime/Engine/Classes/GameFramework/Actor.h
Include #include "GameFramework/Actor.h"
Source /Engine/Source/Runtime/Engine/Private/Actor.cpp

Syntax

void AddActorLocalRotation
(
    FRotator DeltaRotation,            // const FQuat& 버전도 있다.
    bool bSweep,
    FHitResult * OutSweepHitResult,
    ETeleportType Teleport
)

 

사용 예시

// !!! FRotator 에는 Pitch, Yaw, Roll이 있다!!!
// float 하나를 이용하는 FRotator를 사용하면 모든 컴포넌트가 이 float 값으로 초기화됩니다.
void ATank::Trun(float Vlaue)
{
	FRotator DeltaRotation = FRotator::ZeroRotator;
	DeltaRotation.Yaw = Value * TurnRate * UGameplayStatics::GetWorldDeltaSeconds( this )
	AddActorLocalRotation(DeltaRotation, true);
}

 

APlayerController

플레이어의 입력을 처리하고 게임 내에서 플레이어의 캐릭터나 카메라와 같은 요소를 제어하는 데 사용됩니다. 이 클래스는 게임 내에서 플레이어의 의도를 인터페이스하고, 플레이어의 입력에 따라 게임 월드 내의 액터들을 조작합니다.

References

Module Engine
Header /Engine/Source/Runtime/Engine/Classes/GameFramework/PlayerController.h
Include #include "GameFramework/PlayerController.h"

Syntax

class APlayerController :
    public AController,
    public IWorldPartitionStreamingSourceProvider

 

주요 기능

  1. 입력 처리: APlayerController는 키보드, 마우스, 게임패드 등의 플레이어 입력을 처리합니다. 이를 통해 플레이어는 게임 캐릭터를 움직이거나 환경과 상호작용할 수 있습니다.
  2. 카메라 제어: 이 클래스는 플레이어의 시점을 관리하는 데 사용됩니다. 예를 들어, 플레이어의 시야를 변경하거나 특정 객체에 카메라를 집중시키는 기능을 구현할 수 있습니다.
  3. 게임 상태 관리: APlayerController는 게임의 상태를 관리하고, 플레이어의 점수, 생명 수, 레벨 상태 등을 추적할 수 있습니다.
  4. UI 상호작용: 플레이어 인터페이스와의 상호작용을 처리하는 데도 사용됩니다. 예를 들어, 메뉴 선택, 화면 표시 요소(UI Elements)와의 상호작용 등을 관리합니다.

사용 예시

class AMyPlayerController : public APlayerController
{
    virtual void SetupInputComponent() override
    {
        Super::SetupInputComponent();

        // 입력 바인딩
        InputComponent->BindAction("Jump", IE_Pressed, this, &AMyPlayerController::Jump);
        InputComponent->BindAxis("MoveForward", this, &AMyPlayerController::MoveForward);
    }

    void Jump()
    {
        // 점프 로직 구현
    }

    void MoveForward(float Value)
    {
        // 앞으로 이동 로직 구현
    }
};

 

주의 사항

  • APlayerController의 구현은 게임의 종류와 스타일에 따라 달라질 수 있습니다. 예를 들어, 전략 게임과 액션 게임에서의 플레이어 컨트롤러는 서로 다른 기능과 입력 처리 방식을 가질 수 있습니다.
  • APlayerController는 게임의 규칙과 물리 엔진과 상호작용하며, 이러한 상호작용은 게임의 전반적인 플레이 경험에 영향을 미칩니다.

GetController

함수로, 액터와 연결된 컨트롤러를 반환합니다. 이 함수는 AActor 클래스의 멤버 함수로, 액터를 제어하는 컨트롤러 객체를 얻기 위해 사용됩니다. (템플릿을 통한 Cast구문을 쓰지 않는 방법을 가지고 있습니다. Syntax2)

 

References

Module Engine
Header /Engine/Source/Runtime/Engine/Classes/GameFramework/Pawn.h
Include #include "GameFramework/Pawn.h"

Syntax

AController * GetController() const

Syntax2

template<class T>
T * GetController() const

 

함수의 주요 특징 및 사용법은 다음과 같습니다:

  1. 컨트롤러 반환: GetController는 호출한 액터를 현재 제어하는 컨트롤러(AController 인스턴스)를 반환합니다. 이는 APlayerController 또는 AAIController와 같은 특정 서브클래스의 형태일 수 있습니다.
  2. 플레이어 및 AI 제어 확인: 이 함수를 사용하여 액터가 플레이어에 의해 제어되고 있는지, 아니면 AI에 의해 제어되고 있는지 확인할 수 있습니다. 반환된 컨트롤러 객체의 타입을 검사함으로써 이를 구분할 수 있습니다.
  3. 다양한 상황에서의 활용: GetController는 플레이어의 입력 처리, AI의 행동 제어, 액터의 상태 확인 등 다양한 상황에서 유용하게 사용됩니다. 예를 들어, 캐릭터가 플레이어에 의해 직접 제어되는지, 아니면 AI에 의해 자동으로 움직이는지 구분할 때 사용할 수 있습니다.
  4. 예제 코드:
// 액터의 컨트롤러를 가져오는 예제
AController* MyController = MyActor->GetController();
if (MyController)
{
    // 컨트롤러가 존재하는 경우의 로직 처리
}

 

GetController 함수는 게임 개발에서 액터와 관련된 로직을 구현할 때 필수적인 도구 중 하나로, 플레이어와 AI의 상호작용, 캐릭터의 행동 제어 등에 광범위하게 적용됩니다.