언리얼 오브젝트(UObject)
UCLASS()
class SLASH_API ABaseCharacter : public ACharacter, public IHitInterface
{
GENERATED_BODY()
public:
ABaseCharacter();
virtual void Tick(float DeltaTime) override;
// ... 중략 ... //
}
언리얼 오브젝트는 언리얼 엔진이 설계한 새로운 시스템의 단위 오브젝트입니다. 기존의 C++ 오브젝트에 모던(Modern) 객체 지향 설계를 위한 다양한 기능을 추가하였습니다.
언리얼 오브젝트에서는 C++ 오브젝트와 언리얼 오브젝트는 사용할 수 있습니다. 두 오브젝트의 구분을 위해 C++ 오브젝트는 접두사로 F를 사용하고, 언리얼 오브젝트는 접두사로 U를 사용합니다.
- C++ 오브젝트 - 저수준의 빠른 처리를 위한 기능 구현에 사용합니다.
- 예시) FVector, FString…
- 언리얼 오브젝트 : 콘텐츠 제작에 관련돤 복잡한 설계 구현에 사용됩니다.
- 예시) UCapsuleComponent, USoundBase, UAnimMontage…
주요 시스템
1) UHT(Unreal Header Tool)
UHT(Unreal Header Tool)은 언리얼 프로젝트 C++ 코드들을 컴파일 하기 전 모든 .h 헤더파일들을 순회하면서 언리얼 리플렉션 시스템에 필요한 정보들을 읽어들인 후 generate.h 파일과 gen.cpp파일을 intermediate 폴더에 생성하는 소프트웨어입니다.
언리얼은 일반적인 C++ 프로그램들과 다르게 자체적으로 리플렉션 시스템을 구현하기 위해 UCLASS(), UPROPERTY(), UFUNCTION() 등의 매크로를 사용합니다. UHT는 이 매크로를 해석하여 c++컴파일러가 알아들을 수 있게 코드를 재생성 해주는 작업을 실시합니다.
동작 과정
**빌드 요청 -> UHT 코드 분석 -> MyGameObject.generate.h 생성 -> 컴파일**
2) 언리얼 오브젝트의 특징
- CDO(Class Default Object) : 클래스의 기본 값과 타입 정보를 제공합니다.
- Reflection : 런타임에서 자신 클래스 정보 참조 기능을 제공합니다.
- GC(Garbage Collection) : 참조되지 않는 객체를 메모리에서 자동 해제할 수 있습니다.
- Serialization : 객체 정보를 바이트 스트림(Byte Stream)으로 저장, 전송, 불러들이는 기능을 제공합니다.
- Delegate : 객체간 결합을 낮출 수 있는 델리게이트 기능을 제공합니다.
- Enum : 보다 향상된 열거형을 지원합니다.
- Interface : 모던 객체 지향 언어가 제공하는 인터페이스를 제공합니다.
- Struct : 리플렉션이 가능한 구조체를 지원합니다.
- Replication : 네트워크 상에서 객체간에 동기화를 시킬 수 있습니다.
- Editor Integration : 언리얼 에디터 인터페이스를 통해 값을 편집할 수 있습니다.
3) 리플렉션(Reflection)
언리얼 오브젝트의 리플렉션(Reflection)은 프로그램이 런타임 중 자기 자신을 조사하는 기능입니다. 언리얼 엔진 기술의 중요한 근간으로, Detail Panel, Serialization, GC, Replication, Blueprint/C++ Communication 등 다수의 언리얼 시스템에 포함되어 있습니다.
사용 방법
리플리케이션(Replication) 시스템은 옵션입니다. 리플렉션 시스템에 보이도록 했으면 하는 유형이나 프로퍼티에 주석을 달아주면, Unreal Header Tool (UHT)가 그 프로젝트를 컴파일할 때 해당 정보를 수집합니다. UCLASS() , UPROPERTY(), UFUNCTION() 등의 매크로로 해당하는 요소를 마킹하면 리플렉션 프로퍼티로 언리얼 엔진에 등록됩니다. 등록된 요소들은 언리얼 엔진이 접근할 수 있기 때문에 다수의 내부적인 처리 기능(GC, 직렬화 등)을 구현할 수 있습니다.
리플렉션 동작 원리
- UBT가 리플렉션 키워드 탐색
- UHT가 해당 .cpp를 파싱
- 리플렉션 데이터 정보를 수집
- 수집된 정보는 별개의 {%FileName%}.generated.h와 같은 이름의 .cpp로 저장
- 빌드 시 기존 코드에 {%FileName%}.generated.h 코드를 include 하여 컴파일
4) CDO(Class Default Object)
언리얼 클래스 정보에는 클래스 기본 오브젝트(CDO, Class Default Object)가 포함되어 있습니다.
CDO는 언리얼 객체가 가진 기본 값을 저장하는 템플릿 객체로, 한 클래스로부터 다수의 물체를 생성해 게임 콘텐츠에 배치할 때 일관성 있게 기본 값을 조정하는데 유용하게 사용됩니다(Unity의 Prefabs, 혹은 Scriptable Object와 대치됩니다).
CDO는 UClass에서 GetDefaultObject() 함수를 호출해 얻을 수 있습니다. UClass 및 CDO는 엔진 초기화 과정에서 생성되므로 콘텐츠 제작에서 안심하고 사용할 수 있습니다.
대표적인 언리얼 오브젝트 클래스
1) 액터(Actor)
언리얼 오브젝트는 텍스처, 재질과 같은 에셋부터 게임 모듈 및 하위 시스템에 이르기까지 광험위한 목적으로 사용됩니다. 반드시 월드에서 물리적 시스템으로 연결될 필요가 없기 때문에, 엔진에서는 월드에서 물리적 객체를 나타내는 특별한 유형의 언리얼 오브젝트를 설계했습니다.
액터(Actor)는 유니티에서 게임 오브젝트(GameObject)에 해당하는 개념입니다. 언리얼 엔진의 레벨에 배치할 수 있는 모든 오브젝트를 의미하며, 이동, 회전, 스케일과 같은 3D 트랜스폼(Transform)을 지원하는 범용 클래스입니다.
2) 폰(Pawn)
플레이어나 AI가 제어할 수 있는 모든 액터의 베이스입니다. 플레이어나 AI 객체의 시각적인 모습 뿐 아니라, 콜리전(충돌 처리)나 기타 물리적 반응과 같은 측면에서 월드와의 상호작용 방식을 폰(Pawn)이 규정합니다. 폰을 상속받아 생성한 클래스는 Actor에 비해 본 객체를 제어할 수 있는 메소드를 더 많이 사용할 수 있습니다.
3) 캐릭터(Character)
캐릭터(Character)는 폰(Pawn) 클래스에서 CharacterMovementComponent, CapsuleComponent, SkeletalMeshComponent 의 추가를 통해 고도로 특화된 클래스입니다. 캐릭터는 월드에서 걷기, 달리기, 점프, 비행, 수영 등이 가능한 직립 플레이어를 표현하기 위해 디자인되었습니다. 기본적인 월드에 생성하는 플레이어나 AI들은 캐릭터 클래스를 이용해 생성됩니다.
4) 게임모드(GameMode)
게임모드(GameMode)는 해당 레벨을 플레이하는 데 필요한 플레이어 수, 그 플레이어가 게임에 참가하는 방식 등의 기본적인 요소들과 같은 규칙들을 정의하고 구현합니다. 게임 모드 클래스에서 파생된 게임모드 블루프린트를 통해 추가적인 C++ 클래스 추가 없이도 기본값 설정이 가능합니다.
- Default Pawn Class - PlayerStart에서 기본적으로 생성하는 Pawn 블루프린트
- HUD (Heads-up Display) Class - 게임에서 호출할 HUD 블루프린트
- PlayerController Class - 플레이어에게서 받는 입력을 처리하는 클래스
- Spectator Class - 게임에 참여하지 않는 관중들에게 관람에 대한 프레임워크를 제공하는 클래스
- Game State Class - 게임에 참여하는 모든 클라이언트들이 공유하는 정보를 관리하는 클래스
- Player State Class - 플레이어 개인의 정보를 관리하는 클래스
'언리얼' 카테고리의 다른 글
[Unreal Engine] 루트 모션(Root Motion) (0) | 2024.04.03 |
---|---|
[Unreal Engine] IK 리타겟팅(IK Retargeting) (0) | 2024.04.03 |
[Unreal Engine] 애니메이션(Animation) (0) | 2024.04.03 |
[Unreal] 블루프린트 시스템 (Blueprint System) (0) | 2024.04.02 |
[Unreal Engine] 블루프린트 (Blueprint) (0) | 2024.03.28 |