https://docs.unrealengine.com/5.3/ko/unreal-engine-modules/
함수 기능 캡슐화
모듈 단위 컴파일 및 빌드
모듈 단위 Load & UnLoad
using UnrealBuildTool;
public class ModuleName : ModuleRules
{
public ModuleName(ReadOnlyTargetRules Target) : base(Target)
{
PrivateDependencyModuleNames.AddRange(new string[] {"Dependency Module Name"});
PublicDependencyModuleNames.AddRange(new string[] {"Dependency Module Name"});
}
}
Private Dependency는 Private Directory에 저장된 파일들이 의존하는 외부 Module을 등록할 때 사용
Private Dependency는 Complie Time을 줄여줌
Public Dependency는 Public Directory에 저장된 파일들이 의존하는 외부 Module을 등록할 때 사용
즉, A Module의 Public Directory에 있는 파일들이 B Module에 의존하는 상황에서 C Module이 A Module의 Public Directory에 등록된 함수를 사용한다면 C Module은 A Module과 B Module이 모두 필요하므로 Public Dependency를 통해 한번에 Module 의존성을 처리
Public Directory에 저장된 Class는 외부 Module에서 접근 가능
DLL의 __declspec으로 생각하면 될 듯
모듈 관리 함수의 시작, 종료 가능
#include "Modules/ModuleManager.h"
IMPLEMENT_MODULE(FDefulatModuleImpl, ModuleName);
IModuleInterface를 상속해야 하는데 FDefaultModuleImpl은 IModulEInterface를 상속하는 미리 정의된 class
직접 구현해도 상관없음
모듈 이름, 타입, 호환 가능 플랫폼, 로딩 페이즈 정보
a. GenerateProjectFiles.bat 실행
b. .uproject에서 Generate Project File 실행
c. UE Editor에서 File > 새로고침 > Visual Studio > Project 클릭
중 1개 수행
https://docs.unrealengine.com/5.3/ko/referencing-assets-in-unreal-engine/
UPROPERTY를 통해 공개한 변수에 Editor에서 직접 참조할 Asset을 지정하는 방식
Programmer가 참조해야 하는 Asset을 알고 Code에서 직접 지정하는 방식
UPROPERTY()
class UTexture2D* Texture;
TestClass::TestClass(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
{
static ConstructorHelper::FObjectFinder<UTexture2D> TextureObject(TEXT(Path));
Texture = TextureObject.Object;
}
단, UPROPERTY로 참조할 경우 Object를 Load하면 참조하는 모든 Asset들이 한번에 Loading 됨
TSoftObjectPtr을 이용해 Asset의 Load 시점 제어
Editor에서는 직접 프로퍼티 참조처럼 작업 가능
LoadObject<>, StaticLoadObject(), StreamingManager를 이용해 직접 Asset Loading
UPROPERTY()
TSoftObjectPtr<UStaticMesh> BaseMesh;
UStaticMesh* GetLazyLoadMesh()
{
if(BaseMesh.IsPending())
{
const FSoftObjectPath& AssetRef = BaseMesh.ToStringReference();
BaseMesh = Cast<UStaticMesh>(StreamingManager.SynchronousLoad(AssetRef));
}
return BaseMesh.Get();
}
UClass를 Load시 TSoftClassPtr을 통해 Reference 유지
FindObject, LoadObject, LoadClass 사용
UAlreadyLoadedObject* AlreadyLoadedObject = FindObject<UAlreadyLoadedObject>(Outer, Name);
NotLoadedObject = LoadObject<UNotLoadedObject>(Outer, Path, ...);
NotLoadedClass LoadClass<UNotLoadedClass>(...);
https://docs.unrealengine.com/5.3/ko/asset-registry-in-unreal-engine/
Editor에서 Asset의 Load여부를 확인할 수 있음
FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
TArray<FAssetData> AssetData;
const UClass* Class = UStaticMesh::StaticClass();
AssetRegistryModule.Get().GetAssetByClass(Class->GetFName(), AssetData);
IsAssetLoaded()를 통해 Asset의 Load여부 확인 가능
GetAsset()을 통해 FAssetData에서 UObject* 반환 가능
FARFilter를 통해 제공될 FAssetData Filtering 가능
Custom Asset을 정의할 시 UPROPERTY를 지정할 때 AssetRegistrySearchable을 등록한다면 Tag 항목에 변수의 이름이, Value항목에 그 값이 저장
이 값은 Filter에서 사용 가능
AssetRegistry는 데이터를 비동기적으로 읽어옴
AssetRegistry에 데이터가 등록, 해제, 변경 등의 상황에서 수행 될 Callback 등록 가능
https://docs.unrealengine.com/5.3/ko/string-handling-in-unreal-engine/
TEXT() macro를 사용하지 않을 경우 ANSI를 사용하여 인코딩
Literal 문자열의 일종으로 보면 될 듯
대소문자 구분 불가
Light Weight 패턴으로 구현
검색 속도 빠름
String에서 FName 변환 시 Hash Table 사용(변환이 빠름)
Localization에 사용
현지화라고는 하지만 FString보다 Formatting에 더 유용해서 그렇게 설명하는 듯
조작 가능 String(그냥 String이라 보면 될 듯 아니면 CString 같이 생각하면 될 듯)
https://docs.unrealengine.com/5.3/ko/programming-subsystems-in-unreal-engine/
Global하게 접근 가능한 Instance
Singleton의 일종으로 사용 가능할 듯
일반적으로 UGameInstance를 상속해서 Game에 필요한 정보를 Customize하지만 UGameInstance에 너무 많이 몰아넣는 것이 비효율적일 경우 SubSystem을 이용해서 분리하는 방식
[Section]
<Key>=<Value>
; comment
UPROPERTY(Config) 설정한 Variable은 환경설정 파일을 통해 엔진 시작 시 자동으로 값 설정 가능
UCLASS(config=CategoryName)
class UConfigObject : public UObject
{
GENERATED_BODY()
UPROPERTY(Config)
int32 ConfigVariable;
}
// ConfigFile.ini
[SectionCategoryName/ModuleName/UConfigObject]
ConfigVaraible=3;
수동으로 읽기도 가능
int ConfigVariable
GConfig->GetInt(TEXT("CategoryName"), TEXT("ConfigVariable"), ConfigVariable, ConfigFileIni);
UObject::SaveConfig를 통해 Code에서 환경 설정 수정 후 저장 가능
Engine Console명령과 명령줄 실행 인자를 통해 환경설정 수정 가능
https://docs.unrealengine.com/5.3/ko/versioning-of-assets-and-packages-in-unreal-engine/
Engine을 Customize해서 Engine Version을 수정할 수 있음
Engine Level Serailization과 Object Level Serialization이 가능한데, Engine Level Serialization은 Multi Branch 상황에서는 적용할 수 없음
UObject::Serialize 함수 Override를 통해 Custom Serialize가 가능한데 이 때, FArchive를 통해 Version 정보를 기반으로 처리 가능
https://it-eldorado.tistory.com/61
7bit만으로 문자를 표현
영어만 표현 가능
8bit만으로 문자를 표현
7bit는 ASCII와 동일 1bit를 통해 Code Page 여부 결정
Code Page는 지원 나라마다 다르기 때문에 호환성 문제 발생
KS X 1001 체계를 이용하여 한글 2350자 표현
EUC-KR이 지원하지 않던 나머지 Byte를 사용하여 대부분의 한글 단어 지원
전세계 모든 문자에 각각 부여한 코드 집합
UTF-N은 Unicode를 인코딩하는 방식에 대한 정의
인코딩하려는 문자의 코드가 속한 범위에 따라 1Byte ~ 4Byte로 인코딩 하는 가변 길이 인코딩 방식
https://docs.unrealengine.com/5.3/ko/character-encoding-in-unreal-engine/
UE에서는 UTF-16사용, 디스크에서는 0xff보다 작으면 1byte, 그 외에는 UTF-16
문서의 인코딩 방식, 엔디안 정보를 나타내는 문자열
INT, INI : UTF-16, 소스코드에 직접 문자열을 저장하는 방식은 추천하지 않으며 대신 INT파일에 저장하는 것을 추천
CPP Code : UTF-8 또는 Default Windows Encoding
소스코드에 문자열을 직접 저장하는 방식을 추천하지 않는 이유는 동아시아권의 인코딩 방식에서 둘째 바이트가 0x5C로 되는 경우 이는 (백슬래시)로 해석되면서 이스케이프 시퀀스로 사용되어 코멘트나 문자열이 이어지는 형태로 컴파일러가 해석할 수 있기 때문
이는 코멘트에서도 사용을 주의해야 한다
한글은 다행히 두번째 바이트가 0x5C로 끝나는 문자가 없으므로 이 문제에서는 자유로운 편
일반적으로 UTF-8의 동아시아 캐릭터는 3Byte를 사용하지만 BOM을 통해 지정하지 않는다면 2Byte 단위로 해석하는 상황이 발생할 수 있음
이 경우 코멘트에서 홀수개의 문자를 작성하면 그 다음 문자열이 주석처리되는 문제가 발생할 수 있음
소스 코드 내부에서 String Literal을 쓰지 말거나 운영체제에 코드페이지를 명시하거나 BOM이 있는 UTF-8을 사용하는 것을 추천