언리얼 오브젝트

Lee Raccoon·2024년 5월 12일
0

언리얼 공부

목록 보기
2/11

게임 프로그래밍의 특수성

유저 입장에서는 단일 컴퓨터에서 최대 성능을 뽑아낼 수 있어야한다.
개발자 입장에서는 규모에 따라 복잡해지는 기능들을 안정적으로 관리할 수 있어야한다.

결국 유저 입장에서의 성능이 중요해지기 때문에 성능이 중요하다.
그래서 저수준까지 제어가 가능한 C++를 사용한다.

하지만 C++은 오래된 언어이고 후발주자로 나온 객체지향 언어들은 안정성을 챙기기 시작한다.

언리얼은 무려 어떤 선택을 하였는가.

자기들의 C++을 구축하여 두마리 토끼를 다 잡으려 하였다.
이런 언리얼 엔진의 시스템에서 등장하는 것이 바로 언리얼 오브젝트!

언리얼 오브젝트 링크

언리얼 오브젝트?

언리얼 엔진 시스템에서의 새로운 단위 객체이다.
구분을 위해 C++ 오브젝트는 F 언리얼 오브젝트는 U를 사용한다.
C++오브젝트는 저수준의 빠른 처리를 위해,
언리얼 오브젝트는 컨텐츠 개발의 복잡한 설계를 위해 사용된다.

언리얼 오브젝트 특징

  • 가비지 컬렉션
  • 리플렉션
  • 레퍼런스 업데이트
  • 시리얼라이제이션
  • 디폴트 프로퍼티 변경사항 자동 업데이트
  • 자동 프로퍼티 초기화
  • 자동 에디터 통합
  • 실행시간에 유형 정보 사용 가능
  • 네트워크 리플리케이션

가비지 컬렉션

  • 더 이상 사용되지 않는 메모리를 자동으로 해제하는 기능

리플렉션

  • 컴파일 타임이 아닌 런타임에 프로그램이 자기 자신을 조사하는 기능 (말이 좀 어려운데 그냥 에디터에서 실행 중에도 클래스의 정보를 볼 수 있는게 다 리플렉션 덕분이다.)
  • #include "FileName.generated.h" 을 사용하여 다양한 매크로를 사용할 수 있음 (UENUM(), UCLASS(), USTRUCT(), UFUNCTION(), UPROPERTY())
  • UCLASSGENERATED_UCLASS_BODY()와 매칭됨
  • GENERATED_UCLASS_BODY()는 리플렉션된 클래스나 구조체에 필수적, 필요한 것들을 주입해줌

    리플렉션 작동 원리

    • UBT가 헤더를 스캔, 리플렉션이 포함된 모듈을 기억
    • UHT가 해당 cpp를 파싱
    • 리플렉션 데이터 정보를 수집
    • 수집된 정보는 별개의 코드로 저장 (generated.h)
    • 다음 빌드 시 이를 추가해 컴파일 한다.
    • UHT는 파서가 아니다. → 그냥 필요한 코드를 만들어 주는 기능만 함

레퍼런스 자동 업데이트

  • 언리얼이 제공하는 메모리 관리 시스템을 보장 받음 (액터나 컴포넌트가 소멸되면 리플렉션 시스템에 보이고 있는 그에 대한 모든 레퍼런스는 자동으로 null이 됨)

시리얼라이제이션

  • 메모리에 파편화된 객체들을의 정보를 수집하여 저장, 송신이 가능하게 하는 것
  • FArchive 객체와 void Serialize(FArchvie& Ar) 인터페이스를 사용해서 구현한다.

프로퍼티 값 업데이트

  • UCLASS의 클래스 디폴트 오브젝트가 변경되면 엔진은 그 클래스의 모든 인스턴스 로드시 알아서 변경사항을 적용 시도하게 된다.
  • 이 때 디폴트 값이 아닌 값들은 유지된다.
  • 예시) 적들의 체력 디폴트 값이 100이었으나 200으로 변경하면 다음 실행 시 모든 인스턴스의 체력이 200으로 변경되며 체력이 300으로 설정되어 있던 적은 그대로 유지

자동 프로퍼티 초기화

  • 프로퍼티 값이 자동으로 초기화 된다. (원래는 초기화를 안하면 쓰레기 값으로 채워짐)

에디터 통합

  • 언리얼 오브젝트, 언리얼 프로퍼티는 에디터에 인식되며 에디터는 별도의 코드를 작성할 필요 없이 이 값을 자동으로 노출시킬 수 있다.
  • 블루프린트에도 통합이 가능

런타임 유형 정보 및 형변환

  • 언리얼 오브젝트는 리플렉션 시스템의 일부이기 때문에 런타임 중 자신이 무슨 UCLASS인지 알 수 있으며 형변환을 실시간으로 할 수 있다. (ex) Cast<>())

리플리케이션

  • 네트워크 통신과 멀티플레이어 게임을 위한 함수성 세트가 포함된다.
  • UProperty에는 태그를 붙여 네트워크 플레이 도중 데이터의 리플리케이트 여부를 알릴 수 있다.
  • UFunction에서도 태그를 붙여 원격 머신에서 실행 시킬 수 있다.

언리얼 오브젝트 구성

  • 관리되는 클래스 멤버 변수: UPROPERTY
  • 관리되는 클래스 멤버 함수: UFUNCTION

모든 오브젝트들은 클래스 정보를 갖고 있다.
GetClass() StaticClass() 등을 활용하여 이 클래스 정보를 가져올 수 있다.

ClassDefaultObejct (CDO)

언리얼 클래스 정보에 포함되어 있으며 언리얼 객체가 가진 기본 값을 보관하는 템플릿 객체이다.
한 클래스로부터 다수의 물체를 생성해 게임에 배치할 때 기본 값을 조정하는데 유용하다.
기본 값은 생성자에서 설정할 수 있다.
GetDefaultObject() 함수를 통해 얻을 수 있다.
UClassCDO는 엔진 초기화 과정에서 생성된다.
❗주의할점: 말 그대로 엔진 초기화 과정에서 생성되기 때문에 만약 저 값들 중 혹은 헤더 파일에 변경 사항이 생긴다면 에디터를 끄고 다시 빌드하여 실행해야한다.

profile
영차 영차

0개의 댓글