- 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() 매크로를 사용한다.
Windows 같은 경우 기본적으로 CP949 형태의 멀티 바이트 스트링으로 저장되며
Unreal 은 UTF-16 을 사용하므로 문자 인코딩을 통하여 유니코드로 변환하여야 한다.
- FString
언리얼 문자 변환의 주체이며 문자열을 사용할 시 기본값- FName
에셋 관리를 위한 문자열 체계
- 대소문자 구분 없음.
- 한번 선언되면 바꿀 수 없음
- 가볍고 빠름
- 문자를 표현하는 용도가 아닌 애셋 키를 지정하는 용도로 사용하며 빌드시 해시값으로 변환.
- FText
다국어 지원을 위한 문자열 관리 쳬계
- 일종의 키로 작용
- 별도의 문자열 테이블 정보 추가 요구
- 게임 빌드 시 자동으로 다양한 국가별 언어로 변환
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
클래스가 엔진에 필요한 인프라 스트릭처를 지원하도록 구성한다.
인프라 스트릭처란 기초적인 도구나 시스템들을 의미한다.
실행시간에 자기 자신을 조사하는 기능으로 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 을 실행함.
Interface 생성시 두개의 클래스가 생성된다.
- U 접두사 Type Class
런타임에서 인터페이스 구현 여부를 파악하는 용도
Interface 에서 관련된 정보를 저장하기 위해 UINTERFACE 매크로가 지정되어 있다.
실제로 작업할 일은 없다.- I 접두사 Interface Class
실제로 Interface에 관련된 구성 및 구현 진행TScriptInterface<T> 형식은 Interface 상속 여부를 자동으로 확인한다.
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/