언리얼 엔진5 Basic - 언리얼 C++ 기초와 언리얼 오브젝트

타입·2024년 3월 21일
2

언리얼 강의

목록 보기
1/47

언리얼 엔진 시작

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

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

  • Visual Commander
    매크로 들여쓰기를 맞춰주는 VS용 확장도구
  • 언리얼 코드 컴파일
    • 헤더 파일 변경
      VS에서 컴파일
    • 소스 파일만 변경
      언리얼 라이브 코딩으로 컴파일

VS에서 클래스를 수동으로 추가하면 안됨
Intermediate라는 임시 폴더에 추가되어버림


언리얼 코딩 표준

언리얼의 코딩 스타일 가이드라인

STL의 std::move() 대신 MoveTemp() 사용


언리얼 C++ 기본 타입과 문자열

언리얼 기본 타입

  • 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(): 콘솔창에 오류메시지와 사용자가 넣은 문자열도 출력


언리얼 리플렉션 시스템의 활용

  1. 언리얼 오브젝트의 특정 속성과 함수를 이름으로 검색
UTeacher* Teacher = NewObject<UTeacher>();
FProperty* NameProp = UTeacher::FindPropertyByName(TEXT("Name"));
  1. 접근 지시자와 무관하게 값을 설정
FString CurrentName;
FString NewName(TEXT("NewTeacher"));
if (NameProp)
{
	NameProp->GetValue_InContainer(Teacher, &CurrentName);
	NameProp->SetValue_InContainer(Teacher, &NewName);
}
  1. 언리얼 오브젝트의 함수 호출
UFunction* DoFunc = Teacher->GetClass()->FindFunctionByName(TEXT("FuncName"));
if (DoFunc)
{
	Teacher->ProcessEvent(DoFunc, nullptr);
}
profile
주니어 언리얼 프로그래머

0개의 댓글