언리얼 엔진 액터
- 액터
액터란 레벨에 배치할 수 있는 오브젝트를 말한다. 액터는 게임 플레이 코드를 통해서 생성 및 소멸이 가능하고 C++ 에서 AActor는 모든 액터의 베이스 클래스입니다.
액터는 위치와 회전, 스케일 같은 트랜스폼 데이터를 직접 저장하지 않습니다.
액터의 루트 컴포넌트에 대한 트랜스폼 데이터를 대신 사용합니다.
- Actor : 언리얼 엔진의 기본 클래스, 모든 액터 클래스의 부모 클래스.
- Pawn : Actor을 상속한 클래스이며 플레이어 또는 AI가 조작 할 수 있는 객체
- Character : Pawn을 상속한 클래스이며 보행 및 점프 기능 등이 내장된 기본적인 클래스
- PlayerController : 플레이어 입력을 처리하고 Pawn/Character를 제어하는 클래스, 카메라 제어와 HUD도 담당
- HUD : 화면에 표시되는 UI요소를 관리하는 클래스, 텍스트 이미지를 직접 그릴때 사용
- StaticMeshActor : 정적 메시를 렌더링 하기 위한 액터
- CameraActor : 카메라 역할을 하는 액터, 씬에서 카메라의 위치와 방향을 설정할 수 있다.
- PlayerStartActor : 플레이어가 게임을 시작할 때 생성되는 액터
엑터는 레벨에 배치 할 수 있는 오브젝트이며 게임상 플레이어가 상호작용을 할 수 있거나 눈에 보이는 사물들 대부분을 액터로 볼 수 있다.
C++로 커스텀 액터 생성하기
언리얼이 제공하는 다양한 타입의 액터가 있지만, 실전 프로젝트에서는 커스텀 액터를 만들어야 하는 상황이 많습니다. 기존 클래스에 기능을 추가하거나 기본 서브클래스에 없는 조합으로 구성 요소를 결합하거나 클래스에 멤버 변수를 추가해야 할 경우가 있을 수 있습니다.
커스텀 액터를 추가하는 방법은 간단한데 언리얼 엔진의 상단의 툴 카테고리에 "새로운 C++ 클래스 추가" 버튼이나 컨텐츠 브라우저에 C++ 폴더에서 새 클래스 생성을 통해서 커스텀 액터를 생성할 수 있습니다. 커스텀 액터를 생성하면 아래의 소스 코드처럼 기본적인 틀을 제공해 줍니다.
// MyFirstActor.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyFirstActor.generated.h"
UCLASS()
class MYPROJECT_API AMyFirstActor : public AActor
{
GENERATED_BODY()
public:
// 액터 속성을 위한 기본값 설정
AMyFirstActor();
~AMyFirstActor();
}
MyFirstActor.h에서 확인할 내용은 다음과 같습니다.
- #pragma once : 이 전처리기 명령문 pragma는 인클루드 파일을 여러 번 참조하면서 발생하는 오류 예방하기 위해 언리얼이 사용하는 방식입니다.
- #include "CoreMinimal.h" : `FString`, `TArray`, `FVector` 처럼 자주 사용되는 다수의 클래스 정의를 포함하는 파일입니다. 이 파일이 없어도 컴파일 할 수는 있지만 생성된 스크립트 파일에 기본으로 포함됩니다.
- #include "GameFramework/Actor.h" 서브클래스를 만들 예정이므로 당연히 상속받는 클래스의 헤더 파일을 포함시켜야 합니다.
- #include "MyFirstActor.generated.h" : 모든 Actor 클래스는 자신의 generated.h 파일을 포함해야 합니다. 이 파일은 파일에서 감지한 매크로를 기반으로 언리얼 헤더 툴(UHT)에 의해 자동으로 생성됩니다.
- UCLASS() : UCLASS는 클래스가 언리얼의 리플렉션 시스템에 노출될 것임을 나타낼 수 있는 매크로 중 하나입니다. 리플렉션을 사용하면 런타임 동안 오브젝트 속성을 검사하거나 순회할 수 있으며, 가비지 컬렉션을 위해 오브젝트에 대한 참조를 관리 할 수 있습니다.
- MYPROJECT_API : 클래스의 선언부에 추가되어 있는 매크로이며 UHT가 생성했습니다. 프로젝트 모듈의 클래스가 DLL, 동적라이브러리에 제대로 내보내지도록 함으로써 윈도우 환경에서 프로젝트가 정상적으로 컴파일 되도록 도와줍니다.
- GENERATED_BODY() : GENERATED_BODY는 기본 UE 타입 시스템에 필요한 자동으로 생성된 기능을 포함하도록 확장한 UHT 매크로 입니다.
SpawnActor를 사용해 액터 인스턴스화하기
`SpawnActor`는 언리얼 엔진에서 C++ 또는 블루프린트로 새로운 액터 인스턴스를 런타임에 생성할 때 사용하는 함수 입니다.
기본적인 문법은 아래와 같습니다.
AActor* SpawnedActor = GetWorld()->SpawnActor<AActor>(
SpawnLocation, // FVector
SpawnRotation, // FRotator
SpawnParams // FActorSpawnParameters
);
#include "Engine/World.h"
#include "GameFramework/Actor.h"
#include "MyActor.h" // 생성할 액터 클래스 헤더
void AMyCharacter::SpawnMyActor()
{
if (!ActorClassToSpawn) return; // TSubclassOf<AMyActor>로 설정한 클래스
// 스폰 위치 & 회전
FVector Location = FVector(0.f, 0.f, 100.f);
FRotator Rotation = FRotator::ZeroRotator;
// 스폰 파라미터
FActorSpawnParameters SpawnParams;
SpawnParams.Owner = this; // 소유자
SpawnParams.Instigator = GetInstigator(); // 발사체 등에서 사용
SpawnParams.SpawnCollisionHandlingOverride =
ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn;
// 액터 생성
AMyActor* SpawnedActor = GetWorld()->SpawnActor<AMyActor>(
ActorClassToSpawn,
Location,
Rotation,
SpawnParams
);
if (SpawnedActor)
{
UE_LOG(LogTemp, Log, TEXT("Spawned actor: %s"), *SpawnedActor->GetName());
}
}
전체적인 코드에서는 이러한 코드 진행으로 생성할 수 있습니다.
FActorSpawnParameters
- Owner: 액터의 소유자 지정
- Instigator : 발사체나 AI에서의 주체 액터 설정
- SpawnCollisionHandlingOverrid
- `AlwaysSpawn` : 충돌 무시하고 항상 생성
- `AdjustIfPossibleButAlwaysSpawn` : 가능하면 충돌 피해서 생성, 안되면 강제 생성
- `AdjustIfPossibleButDontSpawnIfColliding` : 충돌 시 생성 않마
- `DontSpawnIfColliding` : 충돌 시 무조건 생성 안함
- bNoFail: 실패 시 크래시 대신 무조건 생성
'Unreal > Core Concepts' 카테고리의 다른 글
| Reflection System (0) | 2025.02.08 |
|---|---|
| Interface (0) | 2025.02.07 |
| Actor Lifecycle (0) | 2025.02.04 |
| LEVEL (0) | 2025.01.24 |
| Component (0) | 2025.01.15 |
