Assert assert는 코드의 검증 도구이다. 언리얼 엔진에서는 검증을 위한 매크로 시리즈가 제공된다. 메크로를 확인하려면 아래의 파일에서 찾아볼 수 있다 /UE4/Engine/Source/Runtime/Core/Public/Misc/AssertionMacros.h 런타임 어서트 매크로는 다음과 같은 3가지 종류가 있다. 실행 중지 (DO_CHECK) 디버그 빌드에서 실행 중지 (DO_GUARD_SLOW) 실행 중지하지 않고 오류 보고 (DO_CHECK) check(표현식) 표현식의 결과가 false인 경우 실행을 중지한다. 가장 간단한 형태의 매크로 check(Mesh != nullptr) check(bInitialized); checkf(표현식, ...) check와 동일하지만 표현식의 결과가 f..
C++14 C++ 14의 새로운 기능들을 정리하고자 한다. 1. Binary literal Binary literal은 2진법 숫자를 나타내는 표기법이다. 기존의 16진수 앞에 0x가 붙은것처럼 2진수 앞에는 0b가 붙는다. 또한 ' 문자로 숫자를 구분지을 수 있다. int b = ob110; // 6; int b2 = 0b1111'1111 2. Generic lambda C++11 까지는 lambda 함수의 인자타입이 명시적으로 적었어야했다. 람다 함수의 인자는 auto 키워드를 가질수 없어서 인자타입마다 람다 함수를 모두 만들어야 했다. auto intAdd = [] (int a, int b) -> int { return a + b; } auto floatAdd = [] (float a, float ..
C++ 11 C++ 11에서 추가된 기능들을 정리하고자 한다. 1. auto 컴파일 시에 자동으로 타입을 정해주는 키워드 auto i = 10; // i는 int 타입 auto l = 10L; // i는 long 타입 auto* pi = &i; // i는 int* 타입 auto* pc = new MyClass(); //pc는 MyClass* 타입 iterator를 사용할 때 간략화 하기 좋다. std::list::iterator iter = m_list.begin(); auto iter = m_list.begin(); 2. lambda (람다) 이름 없는 함수, 함수 객체 자리에 함수 자체를 직접 구현 가능하며 함수 포인터처럼 사용도 가능하다. bool compare(const int& A, const ..
개요 언리얼 엔진(Unreal Engine)에서 기본적으로 제공되는 콘솔 명령어도 있겠지만, 이번에 할 이야기는 개발을 하다보면 테스트를 위한 함수호출이나 인게임에서의 특정 수치 변경이 필요할 때가 발생할 경우, 직접 지정한 콘솔 명령어(Console Command)와 콘솔 변수(Console Variable)를 통해 해결하는 방법을 기록하고자 한다. 콘솔명령어 콘솔 명령어는 FAutoConsoleCommand 클래스를 이용하여 지정 가능하다 생성자의 파라미터로는 (명령어 이름 / 명령어 설명 / 함수호출시 실행될 델리게이트 / 플래그 값)으로 구성되어있다. 델리게이트중에는 Argument를 받을수 있는 것도 있어 명령어에 인자값을 넣는것도 가능하다 FAutoConsoleCommand CCmd_Hello..
Unreal Engine Ragdoll Physics 1. 래그돌(Ragdoll) 이란? 래그돌 물리(Ragdoll Physics)는 캐릭터가 힘없이 날라가는 모습이 "봉제인형(Ragdoll)"처럼 연출되서 유래된 이름이며, 게임에서 캐릭터의 사망 연출을 할때 사용이 많이 된다. 2. 래그돌 적용 캐릭터에 Skeletal Mesh 에 Physics Asset이 있는지 확인 Mesh의 CollisionProfile 설정 SetSimulatePhysics(true); 함수 호출 void ARagdollTestCharacter::DoRagdoll() { //기본으로 제공해주는 Ragdoll용 CollisionProfile로 설정 GetMesh()->SetCollisionProfileName(TEXT("Ragd..
언리얼 엔진 TMap 언리얼 엔진(Unreal Engine)에서 TArray 다음으로 많이 사용되는 TMap일 것이다. 키와 값을 짝으로 데이터를 저장하는 방식 키로 값을 검색하여 값을 얻을수 있다. 만들고 채우기 Add 함수에 Key와 Value를 입력하여 컨테이너에 데이터를 추가한다. 중복된 키를 추가하면 기존의 같은 키에 있는 Value를 대체한다. Key만 넣게 되면 Value는 Value타입의 기본 생성자로 생성된다. TMap FruitMap; FruitMap.Add(5, TEXT("Banana")); FruitMap.Add(2, TEXT("Grapefruit")); FruitMap.Add(7, TEXT("Pineapple")); // FruitMap == [ // { Key: 5, Value:..
언리얼 엔진의 배열 TArray TArray는 문자그대로 배열 컨테이너이며, 언리얼 엔진(Unreal Engine)에서 가장 자주 쓰이는 컨테이너 클래스이다. 만들고 채우기 Init 함수로 배열을 같은 엘리먼트 사본으로 입력받은 갯수만큼 채운다 //배열의 선언 TArray IntArray; //Init 함수로 채우기 IntArray.Init(10, 5); //InitArray = [10,10,10,10,10] Add와 Emplace 함수로 배열 끝에 항목을 추가할 수 있다. Add는 객체를 복사하여 배열에 넣고 Emplace는 객체를 배열안에서 생성한다. 간단한 유형(int, float 등)은 Add를 사용해도 무방하지만 복잡한 구조체를 엘리먼트로 사용할때는 Emplace가 효율이 더 좋다. //배열 끝..
문자열 FString 언리얼 엔진(Unreal Engine)에는 FString, FName, FText의 문자열 클래스가 존재한다. 그 중 FString은 조작이 가능한 유일한 클래스이다. 변환 //FString 선언 FString TestString = FString(TEXT("My String")); //다른 문자열 클래스로 변환 //---------------------------------- //FString에서 FName으로 //FName은 대소문자를 구분하지 않기 때문에 손실될 위험이 있다 FName TestName = FName(*TestString); //FString에서 FText로 //FText의 자동 현지화(auto localization)의 혜택을 받지 못한다 FText TestTe..
6.5 변환 C++에는 서로 다른 4가지의 형변환 연산자가 있다. static_cast dynamic_cast const_cast reinterpret_cast C스타일 형변환도 지원하지만 C스타일 형변환은 사용하지 말자 기본 클래스와 파생 클래스 간의 변환 업 캐스팅 업 캐스팅(Up Casting)은 기본 클래스에서 파생 클래스로의 형변환은 모호함이 없으면 항상 가능하다. struct A { int ma; } struct B : A { float mb; int fb() { return 3;} }; struct C : A { }; struct D : B, C { }; void f(A a) {}; void g(A& a) {}; void h(A* a) {}; int main { B b; //모두 A타입 개체..
6.4 서브 타입별 동적 선택 switch문을 이용해 프로그램을 동적으로 선택하도록 구현해보자. class matrix {}; class vector {}; void cg(const matrix& A, const vector& b, vector& x); void bicg(const matrix& A, const vector& b, vector& x); struct solver { virtual void operator()(const matrix& A, const vector& b, vector& x)= 0; virtual ~solver() {} }; // 잠재적으로 템플릿화 됨 struct cg_solver : solver { virtual void operator()(const matrix& A, co..
6.3 다중 상속 복수의 부모 클래스 클래스는 여러 슈퍼 클래스에서 파생될 수 있다. class student { virtual void all_info() const { cout
중복 제거 상속과 암시적 업 캐스팅을 사용해 불필요한 멤버와 자유함수의 구현을 피할 수 있다. 클래스가 슈퍼 클래스로 암시적 형변환된다 공통 기능을 한번만 구현하고 모든 파생 클래스에서 이 공통 기능을 재사용 할수 있다. 다음 행렬의 예제와 같이 공통 기능을 한곳에서 구현하게 되면 모든 클래스의 변경사항을 즉시 적용 할 수 있다. 자유함수는 암시적 업 캐스팅 덕분에 파생된 모든 클래스에서 호출 가능하다 class base_matrix { public: base_matrix(size_t nr, size_t nc) : nr(nr), nc(nc) { } size_t num_rows() const { return nr; } size_t num_cols() const { return nc; } private: s..