[Unreal] 언리얼 오브젝트, 엔진 프레임 워크, 액터의 라이프 사이클
Table of Contents
언리얼 오브젝트 #
- 언리얼은 ‘언리얼 오브젝트’라는 새로운 단위 객체를 만들었다.
- 기존 C++ 오브젝트에 모던 객체 지향 설계를 위한 다양한 기능을 추가한 것이다.
- 언리얼에서는 기존 C++ 오브젝트와 언리얼 오브젝트의 두 객체를 모두 사용할 수 있다.
오브젝트 용도 접두사 C++ 오브젝트 저수준의 빠른 처리를 위한 기능 구현 F
언리얼 오브젝트 콘텐츠 제작에 관련된 복잡한 설계 구현 U
- 언리얼 오브젝트의 헤더 파일 포멧
#pragma once
#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "MyObject.generated.h"
UCLASS()
class UNREALOBJECT_API UMyObject : public UObject
{
GENERATED_BODY()
};
항목 | 설명 |
---|---|
UCLASS() |
이 매크로를 사용하면 언리얼 오브젝트가 UClass, CDO를 가지게 된다. 이 데이터를 사용해서 언리얼 엔진이 언리얼 오브젝트를 런타임에 조사할 수 있다. (리플렉션: Reflection) UClass : 클래스 정보(리플렉션 데이터). 클래스를 정의하는 프로퍼티와 함수 정보가 들어있다. CDO : 클래스 기본 오브젝트. 언리얼 오브젝트가 가진 기본값을 보관하는 템플릿 객체이다. |
GENERATED_BODY() |
UHT(언리얼 헤더 툴)이 리플렉션 데이터들을 수집해서 MyObject.generated.h 파일을 만들어낸다. |
#include "MyObject.generated.h" |
각종 리플렉션 부가 기능들을 쓸 수 있게 헤더파일을 포함한다. |
UNREALOBJECT_API |
UMyObject 클래스를 다른 모듈에 노출시키고자 한다면 이 키워드가 필요하다. |
- 리플렉션 데이터가 만들어지는 과정
- UBT(언리얼 빌드 툴)이 헤더를 쭉 살펴보면서 리플렉션 데이터가 포함된 헤더가 있는 모듈을 기억한다. 그 모듈 중에 헤더가 지난번 컴파일과 달리 변경된 부분이 있다면, UHT를 실행한다.
- 이제 UHT이 리플렉션 데이터를 수집해서 별개의 파일(
.generated
)로 저장한 다음, 기존 코드에.generated
코드를 추가해서 컴파일한다. - 그렇게 빌드를 마치면
.dll
파일이 만들어진다.
UObject #
- 모든 오브젝트의 베이스 클래스이다.
AActor #
- 레벨에 배치할 수 있는 오브젝트이다.
- 트랜스폼을 가지며, 월드로부터 틱과 시간 서비스를 제공받는다.
- 다수의 Component를 가질 수 있다.
- 다수의 컴포넌트를 대표하는 컴포넌트를 루트 컴포넌트(Root Component)라고 한다.
- 플레이 도중 네트워크를 통한 프로퍼티 및 함수 호출의 리플리케이션이 가능하다.
UActorComponent #
- 모든 컴포넌트의 베이스 클래스이다.
- 컴포넌트(Component)란?
- Actor 가 자기 자신에 서브 오브젝트로 부착할 수 있는 특수한 타입의 오브젝트이다.
- 트랜스폼이 없이 기능만 제공한다.
USceneComponent #
- 트랜스폼이 있는 컴포넌트이다.
게임 #
AGameMode #
- 하나의 게임에는 반드시 하나의 게임 모드만 존재한다.
- 게임 규칙을 지정하고 게임을 판정하는 최고 관리자 액터이다. 형태가 없다.
- 입장할 사용자의 규격 지정
- 존재하는 플레이어와 관람자의 수, 허용된 플레이어와 관람자 최대 수
- 플레이어가 게임에 들어오는 방식, 스폰 위치 선택 규칙, 스폰/리스폰 동작
- 게임 일시정지 가능 여부, 게임 일시정지 처리 방식
- 레벨간의 전환, 게임의 시네마틱 모드 시작 여부
AGameState #
- (플레이어 개개인이 아닌) 접속된 모든 클라이언트가 알아야 하는 정보를 공유할 필요가 있을 때 여기에 상태를 저장하고 관리한다.
- 게임 실행 기간 (로컬 플레이어 참가 전 실행 시간 포함)
- 각 플레이어의 게임 참가 기간, 그 플레이어의 현재 상태
- 현재 게임 모드의 베이스 클래스
- 게임 시작 여부
- 서버와 모든 클라이언트에 존재하며, 최신 상태 유지를 위해 자유롭게 리플리케이트(서버와 클라이언트 사이에서 데이터와 명령을 주고받는 프로세스) 가능하다.
플레이어 #
APlayerState #
- 서버에 있는 모든 플레이어에게 생성된다. (standalone 게임에서도)
- 모든 클라이언트에게 리플리케이트된다.
- 플레이어 이름, 스코어 등 네트워크 게임 관련 정보를 가지고 있다.
APlayerController #
- Pawn에서 파생된 클래스를 빙의(possess)하여 그 동작을 제어할 수 있는, 눈에 보이지는 않는 액터이다.
- 플레이어가 입장할 때 배정되며, 배정된 플레이어 컨트롤러는 변경할 수 없다.
- 플레이어가 죽어도 유지된다.
AHUD #
- Heads-up Display
- 게임플레이 도중 화면 위에 겹쳐놓이는 계기판이나 정보이다.
- 플레이어는 자체적인 HUD 클래스를 가지고 있어, 독자적인 뷰포트를 그린다.
APawn #
- 플레이어 컨트롤러에 의해 조종당하는 액터다.
- 플레이어는 현재 조종하는 폰을 버리고, 다른 폰으로 옮겨가서 조종할 수도 있다.
- 죽거나 리스폰이 가능하다.
- 구성
- 충돌 컴포넌트 (루트 컴포넌트)
- 메시 컴포넌트
- 무브먼트 컴포넌트
- 역할
- 빙의(Possess)를 통해 플레이어와 연결
- 사용자 입력의 실제 처리
- 사용자 화면에 대응되는 카메라 설정
- 기믹과의 상호작용
- 현재 상태에 적합한 애니메이션 재생
ACharacter #
- Pawn 중에서 인간형 Pawn을 별도로 캐릭터(Character)라고 지칭한다.
- 구성
- 캡슐 컴포넌트 (루트 컴포넌트)
- 스켈레탈 메시 컴포넌트
- 캐릭터 무브먼트 컴포넌트
멀티 플레이를 위한 개념 #
항목 | owned client | remote client | dedicated server | 특이사항 |
---|---|---|---|---|
AGameMode | X | X | O | dedicated server에만 존재한다. |
AGameState | O | O | O | 모든 client가 공유할 상태를 관리한다. |
APlayerController | O | X | O | 한 client마다 하나씩만 존재한다. |
APlayerState | O | O | O | 다른 client에게 알려주고 싶은 정보를 관리한다. |
언리얼 엔진 플로우 차트 #
액터의 라이프 사이클 #
호출 함수명 | 설명 |
---|---|
On Construction | 액터의 생성 지점으로, 블루프린트 액터가 컴포넌트를 만들고 블루프린트 변수를 초기화시킨다. |
Pre Initialize Components | |
Initialize Components | 컴포넌트의 Initialize Component를 호출한다. |
Post Initialize Components | |
Begin Play | 컴포넌트의 Begin Play를 호출한다. |
Tick | |
End Play | RF_PendingKill이 마킹된다. 게임 플레이 도중에 처리해야 할 것들은 여기서 마지막으로 처리한다. 컴포넌트의 End Play를 호출한다. |
Begin Destroy | 오브젝트의 소멸 시작. |
Finish Destroy | 오브젝트의 메모리 해제 이전의 마지막 호출이다. 내부 데이터 구조체를 해제시킬 마지막 기회이다. |