๊ฒฐ๊ณผ๋ฌผ

1. ์ธ๋ฆฌ์ผ C++ ๊ธฐ๋ณธ ํ์
https://docs.unrealengine.com/5.2/ko/epic-cplusplus-coding-standard-for-unreal-engine/
๐ ์ธ๋ฆฌ์ผ์ด ๊ธฐ๋ณธ ํ์ ์ ๋ฐ๋ก ์ง์ ํ๋ ์ด์
ํ๋ซํผ์ ๋ฐ๋ผ์ C++ ๊ธฐ๋ณธ ํ์ ์ ํฌ๊ธฐ๊ฐ ๋ฌ๋ผ์ง๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์๋ฅผ ๋ค์ด 64bit window์์๋ long์ด 4byte์ธ๋ฐ ๋ฐํด, 64bit linux์์๋ long์ด 8byte๋ก ํด์๋๋ค. ์ด๋ฐ ๋ฐ์ดํฐ ํ์ ์ ๋ชจํธํจ์ ๊ฒ์ ๊ฐ๋ฐ ์์ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค.
bool
- ๋ถ์ธ ๊ฐ(๋ถ์ธ ํฌ๊ธฐ ์ถ์ ๊ธ์ง).BOOL
์ ์ปดํ์ผ ๋์ง ์์ต๋๋ค.TCHAR
- character(๋ฌธ์) (TCHAR ํฌ๊ธฐ ์ถ์ ๊ธ์ง)uint8
- unsigned byte(๋ถํธ ์๋ ๋ฐ์ดํธ) (1๋ฐ์ดํธ)int8
- signed byte(๋ถํธ ์๋ ๋ฐ์ดํธ) (1๋ฐ์ดํธ)uint16
- unsigned 'shorts'(๋ถํธ ์๋ 'short') (2๋ฐ์ดํธ)int16
- signed 'short'(๋ถํธ ์๋ 'short')(2๋ฐ์ดํธ)uint32
- unsigned int(๋ถํธ ์๋ int) (4๋ฐ์ดํธ)int32
- signed int(๋ถํธ ์๋ int) (4๋ฐ์ดํธ)uint64
- unsigned 'quad word'(๋ถํธ ์๋ '์ฟผ๋ ๋จ์ด') (8๋ฐ์ดํธ)int64
- signed 'quad word'(๋ถํธ ์๋ '์ฟผ๋ ๋จ์ด') (8๋ฐ์ดํธ)float
- ๋จ์ ๋ฐ๋ ๋ถ๋ ์์์ (4๋ฐ์ดํธ)double
- ๋ฐฐ์ ๋ฐ๋ ๋ถ๋ ์์์ (8๋ฐ์ดํธ)PTRINT
- ํฌ์ธํฐ๋ฅผ ๊ฐ์ง ์ ์๋ ์ ์(PTRINT ํฌ๊ธฐ ์ถ์ ๊ธ์ง)
bool ํ์
bool์ ํฌ๊ธฐ๊ฐ ๋ช ํํ์ง ์๋ค. ๋ฐ๋ผ์ ๊ฐ๊ธ์ ํค๋์์๋ uint8์ ์ฌ์ฉํ๋ Bit Field ์คํผ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ํฌ๊ธฐ๋ฅผ ์ ํํด์ผ ํ๋ค. ์ด๋ ์ผ๋ฐ uint8๊ณผ ๋ถํ๊ธฐ ์ํด ์ ๋์ฌ b๋ฅผ ์ฌ์ฉํ๋ค.
(ํค๋๊ฐ ์๋ cpp ๋ก์ง์์๋ bool ์ฌ์ฉํด๋ ๊ด์ฐฎ๋ค.)
uint8 bNetTemporary:1;
2. TCHAR์ FString
TCHAR LogCharArray[14] = TEXT("Hello Unreal!"); UE_LOG(LogTemp, Log, TEXT("%s"), LogCharArray); FString LogCharString = LogCharArray; UE_LOG(LogTemp, Log, TEXT("%s"), *LogCharString); // FString์ TChar ํฌ์ธํฐ๋ฅผ ์ป์ผ๋ ค๋ฉด ํฌ์ธํฐ ์ฐ์ฐ์(*) ์ฌ์ฉ.
- TCHAR : UTF-16๋ฅผ ์ํ ์ธ๋ฆฌ์ผ ํ์ค ์บ๋ฆญํฐ ํ์
- FString :๋ฌธ์์ด์ ๋ค๋ฃจ๋ ํด๋์ค. FString์ TCHAR ๋ฐฐ์ด์ ํฌํจํ๋ ํฌํผ ํด๋์ค
FString ๊ตฌ์กฐ

- TCHAR ๋ฐฐ์ด์ FString์ ๋ฃ์ผ๋ฉด TCHAR ๋์ ๋ฐฐ์ด(TArray)๋ก ์ ํ๋์ด ์ ์ฅ๋๋ค.
- FString์ *์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด FString TCHAR ๋์ ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ์ฃผ์๊ฐ ๋ฐํ๋๋ค.
- FString ๋ด๋ถ์ ์๋ FCString ํด๋์ค๋ C์์ ์ ๊ณตํด์ฃผ๋ ๋ฌธ์ ํจ์๋ค์ ๋ด๊ณ ์๋ ๋ํผ(wrapper) ํด๋์ค
- FString์ ์ ์ฉํ ํจ์ ๋ช ๊ฐ์ง
- FString::Printf โ string ์ถ๋ ฅ
- FString::SanitizeFloat โ float to string
- FString::FromInt โ int to string
- FCString์ ์ ์ฉํ ํจ์ ๋ช ๊ฐ์ง
- FCString::Atoi โ string to int
- FCString::Atof โ string to float
FString ํ์ฉ
1. FString์์ TCHAR ๋ฐฐ์ด ์ฝ๋ ๋ฐฉ๋ฒ
// FString์์ TCHAR ๋ฐฐ์ด ์ฝ๋ ๋ฐฉ๋ฒ // 1. const TCHAR* ๋ก ์ฝ๊ธฐ const TCHAR* LogCharPtr = *LogCharString; // 2. TCHAR* ๋ก ์ฝ๊ธฐ TCHAR* LogCharDataPtr = LogCharString.GetCharArray().GetData(); // 3. TCHAR ๋ฐฐ์ด๋ก ์ฝ๊ธฐ TCHAR LogCharArrayWithSize[100]; FCString::Strcpy(LogCharArrayWithSize, LogCharString.Len(), *LogCharString);
2. FString์์ ํน์ ๋ฌธ์์ด ์ฐพ๊ธฐ
// FString์์ ๋ฌธ์์ด ์ฐพ๊ธฐ if (LogCharString.Contains(TEXT("unreal"), ESearchCase::IgnoreCase)) { // FString์์ ๋ฌธ์์ด์ ์ฐพ๊ณ ์์ ์์น ๋ฐ๊ธฐ int32 Index = LogCharString.Find(TEXT("unreal"), ESearchCase::IgnoreCase); // Index ~ ๋๊น์ง ๋ฌธ์์ด ์๋ฅด๊ธฐ FString EndString = LogCharString.Mid(Index); // ๋ก๊ทธ๋ก ์ถ๋ ฅ UE_LOG(LogTemp, Log, TEXT("Find Test: %s"), *EndString); }
- ESearchCase : ๋ฌธ์์ด ๊ฒ์ ์ต์
- ESearchCase::CaseSensitive โ ๋์๋ฌธ์ ๊ตฌ๋ณํ์ฌ ๋ฌธ์์ด ์ฐพ๊ธฐ
- ESearchCase::IgnoreCase โ ๋์๋ฌธ์ ๊ตฌ๋ณ ์์ด ๋ฌธ์์ด ์ฐพ๊ธฐ
3. FString ๋๋๊ธฐ
// FString ๋๋๊ธฐ FString Left, Right; if (LogCharString.Split(TEXT(" "), &Left, &Right)) { UE_LOG(LogTemp, Log, TEXT("Split Test: %s ์ %s"), *Left, *Right); }
์ด์ ์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ ์์ค ์ฝ๋์์ ํ๊ธ์ ์ฌ์ฉํ๋ ค๋ฉด ํ์ผ์ UTF-8 ์ธ์ฝ๋ฉ ๋ฐฉ์์ผ๋ก ์ ์ฅํด์ผ ํ๋ค.
4. int, float โ FString
int32 IntValue = 32; float FloatValue = 3.141592; FString FloatIntString = FString::Printf(TEXT("INT: %d , FLOAT: %f"), IntValue, FloatValue); UE_LOG(LogTemp, Log, TEXT("%s"), *FloatIntString); // Int to FString & Float to FString FString FloatString = FString::SanitizeFloat(FloatValue); FString IntString = FString::FromInt(IntValue); UE_LOG(LogTemp, Log, TEXT("INT: %s , FLOAT: %s"), *IntString, *FloatString); // FString to Int & FString to Float int32 IntValueFromString = FCString::Atoi(*IntString); float FloatValueFromString = FCString::Atof(*FloatString); FloatIntString = FString::Printf(TEXT("INT: %d , FLOAT: %f"), IntValueFromString, FloatValueFromString); UE_LOG(LogTemp, Log, TEXT("%s"), *FloatIntString);
3. ์ธ๋ฆฌ์ผ์ด ์ ๊ณตํ๋ ๋ค์ํ ๋ฌธ์์ด ์ฒ๋ฆฌ

3-1. FName : Asset ๊ด๋ฆฌ๋ฅผ ์ํด ์ฌ์ฉ๋๋ ๋ฌธ์์ด ์ฒด๊ณ
https://docs.unrealengine.com/5.2/ko/fname-in-unreal-engine/
- string์ hash๊ฐ์ผ๋ก ์ ํํ์ฌ ๋น ๋ฅด๊ฒ ์ํ๋ ์์ ์ ์ฐพ์ ์ ์๊ฒ ํ๋ค.
- ๋ฌธ์๋ฅผ ํํํ๋ ์ฉ๋๊ฐ ์๋ ์ ์ ํค๋ฅผ ์ง์ ํ๋ ์ฉ๋๋ก ์ฌ์ฉ. ๋น๋์ ํด์๊ฐ์ผ๋ก ๋ณํ๋๋ค.
๊ตฌ์กฐ

- ์ธ๋ฆฌ์ผ์๋ FName์ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ฑ๊ธํค ํํ์ ๊ธ๋ก๋ฒ FNamePool์ ๊ฐ์ง๊ณ ์๋ค.
- FNamePool์ FName์ด Key-Value ํํ๋ก ์ ์ฅ๋์ด ์๋ค.
- Key : FName์ ํด์๊ฐ
- Value : uint32
ํน์ง
- ๋์๋ฌธ์ ๊ตฌ๋ถ ์์
- ํ๋ฒ ์ ์ธ๋๋ฉด ๋ฐ๊ฟ ์ ์์
- ๊ฐ๋ณ๊ณ ๋น ๋ฆ
์ฃผ์ํ ์
- FName์ ์๋ก ์์ฑํ๋ฉด, ๋ฌธ์์ด์ ํด์๊ฐ์ผ๋ก ๋ณํํ ๋ค์์ FNamePool ๊ฒน์น๋ ํด์๊ฐ์ด ์๋์ง ๋น๊ตํ๋ ๊ณผ์ ์ด ์ผ์ด๋๋ค. โ ๋งค ํ๋ ์ FName ์ถ๊ฐ์ ์ค๋ฒํค๋ ๋ฐ์ํ ์ ์๋ค.
- ๋ฐ๋ผ์ ๋งค ํ๋ ์ ์คํ๋๋ ์ฝ๋์ FName์ ์์ฑํ๋ ์ฝ๋๊ฐ ๋ถ๊ฐํผํ๊ฒ ๋ค์ด๊ฐ๋ค๋ฉด ์๋์ ๊ฐ์ด ์ถ๊ฐํ์.
// static์ด๋ผ ํ๋ฒ ์ด๊ธฐํ ๋ ์ดํ์ ๋ค์ ์ด๊ธฐํ ๋์ง ์๋๋ค.๊ฒ๋ค๊ฐ const๋ผ ๋ณ๊ฒฝ๋ ์ผ๋ ์๋ค. const static FName StaticOnlyOnce(TEXT("pelvis"));
3-2. FText : ๋ค๊ตญ์ด ์ง์์ ์ํ ๋ฌธ์์ด ๊ด๋ฆฌ ์ฒด๊ณ
- ์ผ์ข ์ ํค๋ก ์๋ํ๋ค.
- ๋ณ๋์ ๋ฌธ์์ด ํ ์ด๋ธ ์ ๋ณด๊ฐ ์ถ๊ฐ๋ก ์๊ตฌ๋๋ค.
- ๊ฒ์ ๋น๋ ์ ์๋์ผ๋ก ๊ตญ๊ฐ๋ณ ์ธ์ด๋ก ์ ํ๋๋ค.
๊ฐ์ : ์ด๋์ฐ ์ธ๋ฆฌ์ผ ํ๋ก๊ทธ๋๋ฐ ๊ฐ์ข