Pawn
Pawn
게임에서 사용자의 입력에 반응하고, 이동이나 다른 행동을 수행할 수 있는 액터의 기본 클래스입니다.
Pawn의 주요 특징
- 제어 가능: Pawn은 플레이어 또는 인공지능(AI)에 의해 제어될 수 있습니다. 예를 들어, 플레이어 캐릭터, 차량, 기타 조종 가능한 오브젝트 등이 이에 해당합니다.
- 입력 처리: Pawn은 사용자의 입력(키보드, 마우스, 게임패드 등)을 받아들여 게임 내에서 액션을 수행할 수 있습니다. 이를 위해 PlayerController와 연결될 수 있습니다.
- 이동 및 상호작용: Pawn 클래스는 이동 메커니즘을 구현하는 데 필요한 기본적인 인터페이스와 기능을 제공합니다. 이를 통해 개발자는 다양한 종류의 이동 방식을 구현할 수 있습니다.
- 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
기능 및 사용
- 서브오브젝트 검색: 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_Pressed와 IE_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
)
주요 특징과 사용법은 다음과 같습니다:
- 지역 좌표계 기반 이동: AddActorLocalOffset은 액터의 지역 좌표계를 기준으로 이동시킵니다. 예를 들어, 액터가 회전한 상태에서 이 함수를 사용하면, 액터의 전방, 측면 또는 상하 방향으로 이동합니다.
- 오프셋 값: 이 함수는 FVector 타입의 오프셋 값을 인자로 받습니다. 이 오프셋은 액터의 현재 위치에서 추가될 x, y, z 축 방향의 변화량을 나타냅니다.
- 이동과 회전: AddActorLocalOffset은 액터의 현재 회전 상태를 고려하여 이동합니다. 따라서, 액터가 회전한 상태에서 이 함수를 사용하면, 이동 방향도 회전에 따라 달라집니다.
- 프레임 속도와 독립적인 이동: 게임의 프레임 속도에 영향을 받지 않도록 이동량을 조절하기 위해, 종종 이 함수와 함께 DeltaTime을 사용하여 프레임당 이동량을 조절합니다.
- 예시 코드:이 예시에서는 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의 구성 요소:
- Pitch (경사): X축 주위의 회전을 나타냅니다. 예를 들어, 위 아래를 바라보는 각도가 이에 해당합니다.
- Yaw (요우): Z축 주위의 회전을 나타냅니다. 즉, 좌우를 바라보는 각도입니다.
- 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
주요 기능
- 입력 처리: APlayerController는 키보드, 마우스, 게임패드 등의 플레이어 입력을 처리합니다. 이를 통해 플레이어는 게임 캐릭터를 움직이거나 환경과 상호작용할 수 있습니다.
- 카메라 제어: 이 클래스는 플레이어의 시점을 관리하는 데 사용됩니다. 예를 들어, 플레이어의 시야를 변경하거나 특정 객체에 카메라를 집중시키는 기능을 구현할 수 있습니다.
- 게임 상태 관리: APlayerController는 게임의 상태를 관리하고, 플레이어의 점수, 생명 수, 레벨 상태 등을 추적할 수 있습니다.
- 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
함수의 주요 특징 및 사용법은 다음과 같습니다:
- 컨트롤러 반환: GetController는 호출한 액터를 현재 제어하는 컨트롤러(AController 인스턴스)를 반환합니다. 이는 APlayerController 또는 AAIController와 같은 특정 서브클래스의 형태일 수 있습니다.
- 플레이어 및 AI 제어 확인: 이 함수를 사용하여 액터가 플레이어에 의해 제어되고 있는지, 아니면 AI에 의해 제어되고 있는지 확인할 수 있습니다. 반환된 컨트롤러 객체의 타입을 검사함으로써 이를 구분할 수 있습니다.
- 다양한 상황에서의 활용: GetController는 플레이어의 입력 처리, AI의 행동 제어, 액터의 상태 확인 등 다양한 상황에서 유용하게 사용됩니다. 예를 들어, 캐릭터가 플레이어에 의해 직접 제어되는지, 아니면 AI에 의해 자동으로 움직이는지 구분할 때 사용할 수 있습니다.
- 예제 코드:
// 액터의 컨트롤러를 가져오는 예제
AController* MyController = MyActor->GetController();
if (MyController)
{
// 컨트롤러가 존재하는 경우의 로직 처리
}
GetController 함수는 게임 개발에서 액터와 관련된 로직을 구현할 때 필수적인 도구 중 하나로, 플레이어와 AI의 상호작용, 캐릭터의 행동 제어 등에 광범위하게 적용됩니다.
'Unreal 공부 > UE5 GameDev' 카테고리의 다른 글
[UE5] ToonTank (3) (0) | 2023.11.29 |
---|---|
[UE5] ToonTank (2) (0) | 2023.11.19 |
[UE5][개념편] ToonTank (0) | 2023.11.17 |
[UE5] Crypt Raider (2) (0) | 2023.11.13 |
[UE5] Crypt Raider (1) (0) | 2023.11.11 |