목록Categories (1099)
KoreanFoodie's Study
Move 문법 (Move semantics) Swap function을 구현해보자. 일반적인 타입 T에 대한 Swap function은 다음과 같이 구현할 수 있다. template void swap(const T& a, const T& b) { T tmp(a); a = b; b = tmp; } 이 경우, T에서 a를 호출하는 과정에서 복사 생성자가 호출된다. 이 문제를 해결하기 위해, 에서 제공하는 move 함수를 사용한다. template void swap(T& a, T& b) { T tmp = std::move(a); b = std::move(a); a = std::move(tmp); } 위와 같은 방식으로 swap 함수를 구현하면, swap이 실제로 행해지는 과정에서 이동 생성자가 호출된다. mo..
좌측값과 우측값 C++에서, 값은 대체로 우측값과 좌측값으로 나뉘어진다. (더 구체적인 분류는 이곳을 참조) 좌측값은 '이름'을 가지고 있는 녀석, 우측값은 '이름'이 없는 녀석이다. 이동 생성자와 우측값 레퍼런스 클래스에서 생성자를 호출한다고 해 보자. 만약 클래스가 String 변수값을 가지고 있다면, 이미 생성된 변수 a를 이용해 b를 만든다고 할 때 String 값을 매번 새로 생성하는 것은 메모리 낭비이다. 새로운 String을 담을 메모리를 할당하는 대신, 포인터를 전달함으로써 효율적으로 값을 옮기며 클래스 객체를 생성할 수 있는데, 이때 이동 생성자를 사용한다. 이동 생성자는 아래와 같은 형식을 가진다. 우측값 레퍼런스의 경우, typename && var 같은 형식으로 표현되는데, 이때 &..
모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! throw 로 예외 발생시키기 예외를 발생시키는 예시 코드를 보자. // 생략 ... const T& at(size_t index) const { if (index >= size) { // 예외를 발생시킨다! throw std::out_of_range("vector 의 index 가 범위를 초과하였습니다."); } return data[index]; } 위에서는 범위 초과를 알리는 메시지를 출력한다. C++ 는 예외를 던지고 싶다면 throw 로 예외로 전달하고 싶은 객체를 써주면 된다. C++ 표준에는 overflow_error, length_error, runtime_error ..
모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! std::string std::string 이란 무엇일까? 사실 std::string 은 basic_string이라는 클래스 템플릿의 인스턴스화 버전이다. basic_string definition 은 다음과 같다 : template class basic_string; Traits 는 주어진 CharT 문자들에 대해 기본적인 문자열 연산들을 정의해 놓은 클래스를 의미한다. 여기서, Traits를 바꾸면 정렬 순서를 바꿀 수 있는 등 여러가지 조작을 할 수 있다! 다시 말해, basic_string 에 정의된 문자열 연산들은 사실 전부 Traits 의 기본적인 문자열 연산들을 가지고 ..
모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! STL algorithm STL algorithm 라이브러리는 STL 자료구조를 다루는 데 필요한 편리한 메소드들을 제공하고 있다. STL 알고리즘 라이브러리에 있는 함수들은 대체로 다음과 같은 두 가지 형태를 띄고 있다. template void do_something(Iter begin, Iter end); template void do_something(Iter begin, Iter end, Pred pred); 두 번째의 Pred 는 일반적으로 bool 을 리턴하는 함수 객체(Funtor) 가 전달된다. 정렬 (sort, stable_sort, partial_sort 정렬은 ..
TArray TArray 는 std::vector 와 비슷하게 동작하지만, AddUnique, RemoveAtSwap 등의 부가적인 API 를 제공한다. TArray 는 빠르고, 메모리를 효율적으로 사용하며, 안전하다! TArray ActorArray = GetActorArrayFromSomewhere(); // Tells how many elements (AActors) are currently stored in ActorArray. int32 ArraySize = ActorArray.Num(); // TArrays are 0-based (the first element will be at index 0) int32 Index = 0; // Attempts to retrieve an element at..
언리얼 게임플레이의 4대 main class type 언리얼에는 게임플레이에 사용되는 4대 main class type 이 있다. 바로 UObject, AActor, AActorComponent, UStruct 이다. 이 외에도 사용자 정의 타입을 사용할수는 있지만, 그런 타입들은 엔진에 내장된 기능을 사용하지는 않는다. 하나씩 그 역할과 범위를 알아보자. Unreal Objects (UObject) UObject 는 언리얼 엔진의 building block 으로써, UClass 와 함께 다음과 같은 서비스들을 제공한다 : Reflection of properties and methods Serialization of properties Garbage Collection Finding a UObject ..
애니메이션 레이어 언리얼에서는 애니메이션 간의 자연스러운 전환을 위해 블렌드 스페이스를 사용한다. 그런데 만약 UpperBody 만 총을 드는 모션을 재생하고 싶다고 하자. 블렌드 스페이스를 이용해 특정 부위만 동작을 바꾸는 등의 기능도 구현할 수 있을까? 언리얼에서는 애니메이션 레이어를 활용해 위의 기능을 구현할 수 있다. 방법은 아래와 같다. 1. 먼저 블렌드할 애니메이션을 선택한다. 2. 게임 모드의 Default Pawn Class 를 우리가 사용할 애니메이션이 타깃된 스켈레톤으로 바꿔준다. 3. 애님 몽타주를 생성한다. 4. 애님 몽타주에서 돋보기 클릭 후, 우리가 원하는 슬롯으로 지정한다. 5. 슬롯이 없을 경우 새로 생성한다. 6. 원하는 슬롯을 지정한다. 7. 애님 그래프로 이동한다. 8...
블렌드 스페이스 만약 속도에 따라 걷는 애니메이션과 뛰는 애니메이션을 재생하고 싶다면 어떻게 할까? 단순히 속도가 낮을 때는 걷는 애니메이션을, 높을 때는 뛰는 애니메이션을 연결하면 될 것 같지만, 속도가 float 값으로 연속적일 때는 속도가 바뀌는 시점에 따라 애니메이션이 급속도로 변하는 것이 부자연스러워 보일 것이다. 애니메이션 동작에서의 자연스러움을 보장하면서, 프로그래머가 특정 변수에 맞게 애니메이션을 설정하는 일 따위의 하드코딩을 줄이기 위해, 언리얼에서는 블렌드 스페이스를 제공하고 있다. 블렌드 스페이스란, 말 그대로 애니메이션들을 주어진 input 값에 맞게 호출하도록 섞어(블렌드) 만든 공간(스페이스) 라고 볼 수 있다. 예시 블렌드 스페이스를 만들면, 왼쪽에서 축의 최댓/최솟값을 결정하..
애셋 레지스트리 애셋 레지스트리란 에디터가 로드될 때 로딩되지 않은 애셋들에 대한 정보를 비동기적으로 수집하는 서브시스템이다. 파일이 추가되거나 삭제되는 것을 자동으로 추적하는데, 콘텐츠 브라우저가 애셋 레지스트리의 주 고객이라고 보면 된다. Obtaining a List of Assets 코드상으로 애셋 레지스트리를 통해 원하는 타입의 애셋을 불러올 수 있다. FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked("AssetRegistry"); TArray AssetData; const UClass* Class = UStaticMesh::StaticClass(); AssetRegistryModule.Get().GetA..