Unreal Object

Clear·2024년 6월 29일

Unreal Engine

목록 보기
1/2

Unreal Coding Standard

  • Class Organization
    작성자보다는 읽는 사람을 염두에 두고 조직되어야 한다.
    public 구현후 private 구현을 뒤따라야 한다.

  • Pascal Case
    타입과 변수의 이름에 대하여 Snake 및 Camel 형식을 사용하지 않습니다.

  • Type 접두사
    타입 이름에는 추가로 대문자로 이루어진 접두사를 포함하여 변수 이름을 구분합니다.
    • 클래스 템플릿 : T
    • UObject : U
    • AActor : A
    • SWidget : S
    • Abstarct Interface : I
    • Enum Type : E
    • boolean : b
    • 그 외 Class : F
    • typedef
      구조체의 경우 : F
      UObject 의 경우 : U

  • Function
    • bool Type 을 return 하는 함수의 경우 Is , Should 등의 true/false 질문을 해야 합니다.
    • Parameter 가 참조로 전달된 후 함수가 그 값을 쓸 것을 예상되는 경우 Out 을 추가 권장합니다.
    • In / Out Parameter

  • Portable C++ Code
    플랫폼에 따라 크기가 변할 수 있는 경우를 따라 다음과 같이 한다.
    • bool : 크기 추정이 금지되며 BOOL 은 컴파일 되지 않습니다.
    • TCHAR : Character , 크기 추정 금지
    • uint8 : unsigned byte
    • int8 : signed byte
    • uint16 : unsigned short
    • int16 : signed short
    • uint32 : unsigned int
    • int32 : signed int
    • uint64 : unsinged 'quad word'
    • int64 : singed 'quad word'
    • float : 단정밀도 부동 소수점
    • double : 배정밀도 부동 소수점

  • Const 정확도
    const 는 문서이자 컴파일러 지시어 이므로 모든 코드는 const 정확도를 맞춰야 한다.

  • C++17
    • static_assert
    • nullptr
    • final, override
    • auto
    • for each
    • Lambda 익명메서드
    • enum class
    • default member initializer
    • brace
    • namespace

  • 물리적 종속성
    • 파일 이름에는 가급적 접두사를 붙이지 않는다.
    • 모든 헤더는 #pragma once 지시어로 복수 포함을 방지한다.

  • 문자열 표현시 TEXT() 매크로를 사용한다.

Unreal string

Windows 같은 경우 기본적으로 CP949 형태의 멀티 바이트 스트링으로 저장되며
Unreal 은 UTF-16 을 사용하므로 문자 인코딩을 통하여 유니코드로 변환하여야 한다.

  • FString
    언리얼 문자 변환의 주체이며 문자열을 사용할 시 기본값
  • FName
    에셋 관리를 위한 문자열 체계
    • 대소문자 구분 없음.
    • 한번 선언되면 바꿀 수 없음
    • 가볍고 빠름
    • 문자를 표현하는 용도가 아닌 애셋 키를 지정하는 용도로 사용하며 빌드시 해시값으로 변환.
  • FText
    다국어 지원을 위한 문자열 관리 쳬계
    • 일종의 키로 작용
    • 별도의 문자열 테이블 정보 추가 요구
    • 게임 빌드 시 자동으로 다양한 국가별 언어로 변환

Unreal Object

Unreal Object 는 언리얼 엔진이 기존의 C++ 오브젝트에 모던 객체 지향 설계를 위해 다양한 기능을 추가한 시스템의 단위 오브젝트이다.

언리얼 오브젝트의 Base Class 는 UObject 이다.
UObejct Derived Calss 는 UCLASS 매크로를 사용하여 태그하게 되면 UObject 처리 시스템에게 인식된다.

UOjbect 가 제공하는 함수성

  • Reference Update
    Unreal System 의 제공하는 자동으로 메모리를 관리해주는 기능

  • GC

  • Reflection

  • Serialization
    지정된 포맷에 맞게 저장하거나 불러들이는 것을 일괄적으로 진행한다.
    UPROPERTY 로 지정된 것들은 디스크에 저장하거나 불러올 수 있다.

  • Automatic update of default property changes
    CDO 가 변경되면 엔진은 그 클래스의 모든 인스턴스 로드시 알아서 변경사항 적용을 시도합니다.
    주어진 인스턴스에 대해 업데이트된 변수 값이 이전 CDO 값과 일치한다면 새로운 CDO 에 저장된 값으로 업데이트 됩니다.

  • Automatic property initialization
    생성자 호출 전 초기화시 자동으로 0으로 초기화 된다.

  • Automatic editor integration
    UObject와 UProperty 는 에디터에 인식되며 값을 자동으로 노출 시키며 선택적으로 통합도 가능합니다.

  • Network Replication
    UObject 시스템에는 네트워크 통신과 멀티플레이어 게임 을 원활히 하기 위한 탄탄한 함수성 세트가 포함

  • Type information available at runtime
    UObject는 언리얼 엔진 리플렉션 시스템의 일부이므로 항상 자신이 무슨 UClass 인지 알고 있으며 형변환이 실시간으로 가능.
  • UHT(Unreal Header Tool)
    위의 함수성을 활용하기 위해서는 전처리 단계를 거쳐야 하는데 이는 UHT 가 담당한다.
    언리얼 오브젝트는 컴파일 시 UHT 에 의해 filiname.generated.h 이 생성되며 해당 파일을 포함시킨 후 컴파일을 실행한다.

  • UCLASS Macro
    UCLASS 매크로는 해당 보즉테그가 언리얼 엔진에게 보이도록 만든다.
    또한 클래스 지정자 지원을 통해 클래스에 어떤 기능을 켜고 끌 지 정할 수 있다.

  • GENERATED_BODY Macro
    클래스가 엔진에 필요한 인프라 스트릭처를 지원하도록 구성한다.
    인프라 스트릭처란 기초적인 도구나 시스템들을 의미한다.

Unreal Property System(Reflection)

실행시간에 자기 자신을 조사하는 기능으로 Reflection을 말한다.
Editor Detail Panel, Serialization, GC, Network Replication, Bluepirnt/C++ Communication 등 다수의 시스템이 탑재하지만 C++은 어떠한 형태의 Reflection 도 지원하지 않아 언리얼에서 자체적으로 해당 시스템을 구축하였다.
Reflection은 그래픽 용어이기도 하여 Property System 이라 불린다.

리플렉션 시스템에 보이도록 했으면 하는 유형이나 프로퍼티에 주석을 달아주면 UHT 가 컴파일시에 해당 정보를 수집한다.

리플렉션을 사용하려면 UHT 를 통해 만들어진 filiname.generated.h 가 필요하며 해당 파일에는 리플렉션을 제공하는 소스코드를 제공한다.

  • Unreal Object는 항상 클래스 정보를 담은 UClass 객체가 매칭되어 있다.
  • UClass 로 부터 UnrealObject 정보를 파악할 수 있다.
  • UClass 에는 CDO가 연결되어 있다.
  • 클래스 정보와 CDO 는 엔진 초기화 과정에서 생성되므로 게임 개발에서 안전하게 사용이 가능하다.

Code

GetClass();               // Runtime 에 Class 정보를 가져옴.
UInstance::StaticClass(); // CompileTime 에 Class 정보를 가져옴.
GetClass()->GetDefaultOjbect<T>(); // 해당 클래스의 CDO 를 가져옴.
NewObject<T>(); // Unreal Object 생성
T::StaticClss()->FindPropertyByName(TEXT("Name")); // 프로퍼티에 대한 포인트를 가져옴

// Object에 있는 프로퍼티 값을 Output(pointer) 에 저장하여 가져옴.
FProperty->GetVaule_InContainer(Object, Output); 
FProperty->SetVaule_InContainer(Object, Output); // Object에 있는 프로퍼티 값을 지정.
GetClass()->FindFunctionName(TEXT("Name")); // function 에 대한 포인터를 가져옴
UObject->ProcessEvent(UFuction, Parameter) //  해당 UFuction 을 실행함.

Unreal Interface

Interface 생성시 두개의 클래스가 생성된다.

  • U 접두사 Type Class
    런타임에서 인터페이스 구현 여부를 파악하는 용도
    Interface 에서 관련된 정보를 저장하기 위해 UINTERFACE 매크로가 지정되어 있다.
    실제로 작업할 일은 없다.
  • I 접두사 Interface Class
    실제로 Interface에 관련된 구성 및 구현 진행

TScriptInterface<T> 형식은 Interface 상속 여부를 자동으로 확인한다.

Unreal Delegate

Delegate 설계시 고려 사항

  • 인자 수 , 각각의 타입을 설계하며 1:1 , 1:다 를 고려해야 한다.
  • C++ 에서만 사용할 것인지, 지정된 블루프린트 함수와 사용할 것인지 고려해야한다.

Delegate Delcare Marco
DECLARE_{Delegate Categoty}DELEGATE{Fucntion Info}

  • Delegate Category
    • 1:1
      DECLARE_DELEGATE
    • 1:다
      DECLARE_MULTICAST_DELEGATE
    • 1:1 / Blueprint 지원
      DECLARE_DYNAMIC_DELEGATE
    • 1:다 / Bluerpint 지원
      DECLARE_DYNAMIC_MULTICAST_DELEGATE

  • Function Info
    • 인자 x 반환값 x
      DECLARE_DELEGATE
    • 인자 o 반환값 x
      DECLARE_DELEGATE_OneParam/TwoParam 등등
      인자는 최대 9개까지 지원한다.
    • 반환값 o
      DECARE_DELEGATE_RetVal
      MULTICAST 는 반환형을 지원하지 않는다.

출저

https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Objects/Optimizations/
https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Objects/
https://docs.unrealengine.com/4.27/ko/ProductionPipelines/DevelopmentSetup/CodingStandard/

profile
Programmer

0개의 댓글