Skip to main content

[Unreal] 언리얼 오브젝트, 엔진 프레임 워크, 액터의 라이프 사이클




언리얼 오브젝트 #

  • 언리얼은 ‘언리얼 오브젝트’라는 새로운 단위 객체를 만들었다.
    • 기존 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 #

  • 모든 오브젝트의 베이스 클래스이다.

언리얼 엔진 오브젝트 상속 구조
Image Source


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)라고 지칭한다.
  • 구성
    • 캡슐 컴포넌트 (루트 컴포넌트)
    • 스켈레탈 메시 컴포넌트
    • 캐릭터 무브먼트 컴포넌트



멀티 플레이를 위한 개념 #

멀티 플레이를 위한 개념
Image Source

항목 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 오브젝트의 메모리 해제 이전의 마지막 호출이다.
내부 데이터 구조체를 해제시킬 마지막 기회이다.