엔진 코드 디버깅을 위해 디버깅 심볼 포함이 필요하다면 언리얼 엔진 설치 시 '디버깅을 위한 편집기 기호' 체크
(프로그래머라면 필수)

VS 설정에서 'Always show Error List if build finishes with errors' 체크 해제 확인

VS에서 클래스를 수동으로 추가하면 안됨
Intermediate라는 임시 폴더에 추가되어버림
언리얼의 코딩 스타일 가이드라인
STL의 std::move() 대신 MoveTemp() 사용
int 타입
C++ 최신 규약의 int는 32bit지만 특정 플랫폼에선 64bit로 해석해버림
4바이트 크기는 int32, 8바이트 크기는 int64로 명확히 구분
bool 타입
bool 타입의 크기가 명확하지 않음
헤더 파일에선 1비트만 쓰는 Bit Field 오퍼레이터 사용
C++ 로직에선 자유롭게 bool을 사용해도 무방
uint8 bFlag:1;
TCHAR는 UTF-16을 사용
문자열은 언제나 TEXT 매크로 사용
FString은 TCHAR 배열을 포함하는 헬퍼 클래스

실제 문자열 처리는 FCString
TCHAR LogCharArray[] = TEXT("Hello Unreal");
UE_LOG(LogTemp, Log, LogCharArray);
FString LogCharString = LogCharArray;
UE_LOG(LogTemp, Log, TEXT("%s"), *LogCharString);
const TCHAR* LogCharPtr = *LogCharString;
TCHAR* LogCharDataPtr = LogCharString.GetCharArray().GetData(); // 실제 포인터 반환
TCHAR LogCharArrayWithSize[100];
FCString::Strcpy(LogCharArrayWithSize, LogCharString.Len(), *LogCharString);
if (LogCharString.Contains(TEXT("unreal"), ESearchCase::IgnoreCase))
{
int32 Index = LogCharString.Find(TEXT("unreal"), ESearchCase::IgnoreCase);
FString EndString = LogCharString.Mid(Index);
UE_LOG(LogTemp, Log, TEXT("Find Test: %s"), *EndString); // "Unreal"
}
FString Left, Right;
if (LogCharString.Split(TEXT(" "), &Left, &Right))
{
// UTF-8 인코딩으로 코드파일 저장해야 한글 안깨짐
UE_LOG(LogTemp, Log, TEXT("Split Test: %s 와 %s"), *Left, *Right); // "Hello 와 Unreal"
}
문자열 숫자 변환
int32 IntValue = 32;
float FloatValue = 3.141592;
FString FloatIntString = FString::Printf(TEXT("Int:%d Float:%f"), IntValue, FloatValue);
FString FloatString = FString::SanitizeFloat(FloatValue);
FString IntString = FString::FromInt(IntValue);
UE_LOG(LogTemp, Log, TEXT("%s"), *FloatIntString);
UE_LOG(LogTemp, Log, TEXT("Int:%s Float:%s"), *IntString, *FloatString);
int32 IntValueFromString = FCString::Atoi(*IntString);
float FloatValueFromString = FCString::Atof(*FloatString);
FString FloatIntString2 = FString::Printf(TEXT("Int:%d Float:%f"), IntValueFromString, FloatValueFromString);
UE_LOG(LogTemp, Log, TEXT("%s"), *FloatIntString2);
FName: 에셋 관리를 위해 사용되는 문자열 체계
대소문자 구분 없음 (Ignore Case)
한 번 선언되면 바꿀 수 없음 (Key-Value 구조)
해시 테이블을 사용하여 빠름
FText: 다국어 지원을 위한 문자열 관리 체계
FName의 구조와 활용
FName과 관련된 글로벌 Pool 자료구조를 가지고 있음
문자열이 들어오면 해시 값을 추출해 키를 생성해 FName에서 보관
Pool에 데이터가 있으면 빠르게 찾을 수 있음, 없으면 Key-Value로 추가

check(): 에디터 종료
ensure(): 콘솔창에 오류메시지
ensureMsgf(): 콘솔창에 오류메시지와 사용자가 넣은 문자열도 출력
UTeacher* Teacher = NewObject<UTeacher>();
FProperty* NameProp = UTeacher::FindPropertyByName(TEXT("Name"));
FString CurrentName;
FString NewName(TEXT("NewTeacher"));
if (NameProp)
{
NameProp->GetValue_InContainer(Teacher, &CurrentName);
NameProp->SetValue_InContainer(Teacher, &NewName);
}
UFunction* DoFunc = Teacher->GetClass()->FindFunctionByName(TEXT("FuncName"));
if (DoFunc)
{
Teacher->ProcessEvent(DoFunc, nullptr);
}