UE4Game.Target.cs 파일에 다음의 코드를 추가한다.

if (Target.Configuration == UnrealTargetConfiguration.Shipping || Target.Configuration == UnrealTargetConfiguration.Test)
{
  bAllowGeneratedIniWhenCooked = false;
  bAllowNonUFSIniWhenCooked = false;
}

엔진을 빌드한다.

이후, 게임 프로젝트의 *.Target.cs 파일에도 동일한 코드를 넣는다.

 

위의 코드를 넣어주면, 게임 구동시 [게임명]/Saved/Config/[빌드설정]/Config 폴더에 ini 파일을 쓰지도 않고, 읽지도 않는다. 단, GameUserSettings.ini 파일은 여전히 읽고 쓴다.

 

[부작용]

게임 옵션에서 인풋액션 설정을 Input.ini 파일을 통해서 저장하고 있었다면, 해당 기능을 더 이상 쓸 수 없다.

그런 경우, GameUserSettings.ini 파일을 이용하도록 코드를 수정하면 된다.

혹은, 엔진 수정을 통해 Input.ini 파일도 예외로 추가할 수도 있겠다.

4.26 기준.

 

1.Diff 후 BP 컴파일 에러

소스 컨트롤과 Diff를 하고 난 이후 게임을 컴파일하면 느닷없이 컴파일 에러가 뜰 때가 있음.

자세히 보면 에러나 블루프린트(BP) 파일에 temp 어쩌고 하는 이름이 들어 있음.

Diff를 할 때 임시로 생성한 예전 BP파일을 컴파일하려다가 오류가 발생하는 걸로 보임.

 

대처법: 에디터를 껐다가 다시 켠다.

 

2.BP 컴파일 도중 검색하면 에디터 먹통

Find in blutprints에서 뭘 찾고 있는 동안 BP를 컴파일하면 에디터가 간혹 먹통이 된다.

 

대처법: 작업 관리자에서 에디터를 강제로 종료하고 다시 켠다.

 

3.PIE 도중 검색하면 에디터 먹통

에디터에서 게임을 플레이(PIE)하는 도중에 Find in blutprints에서 뭘 찾으면 간혹 에디터가 먹통이 된다.

 

대처법: 작업 관리자에서 에디터를 강제로 종료하고 다시 켠다.

UDataAsset을 상속 받아서 만든 클래스에

TArray<enum> 으로 정의된 멤버를 추가했다.

 

enum 에 들어간 내용은 enum class 이름 : uint8 이었다.

그런데, 파일로 저장하니 배열의 사이즈 * 8 바이트의 사이즈로 저장된다.

 

배열의 사이즈가 작으면 별 문제가 안될 수 있으나, 내가 만든 데이터 에셋은 4096*4096 사이즈이다.

즉, 원래는 16MB 정도면 충분한데, 130MB로 저장되었다.

 

혹시나 싶어 TArray<uint8>로 변환해서 저장하니 16MB가 나왔다.

 

좀 알아보니, 언리얼에서는 enum 타입을 저장하면 메타데이터 같은 걸 같이 저장하기 때문에 용량이 커진다고 한다.

그래서 대량의 데이터를 저장할 때는 enum 그대로 저장하는 것 보다는 기본 타입으로 변형해서 저장하는 게 좋다.

 

 

 

 

블루프린터의 "인터페이스"라는 클래스는 함수 정의만 할 수 있고 구현은 할 수 없는 껍데기 클래스이다. 이를 처음 접하면, c++의 pure virtual function만 모아 둔 클래스와 비슷하다고 생각할 수 있다. 즉, c++에서 다중 상속을 이용한 인터페이스 구현처럼 보이기는 하지만, 성격이 좀 다르다.

 

일단, 언리얼 엔진에서 인터페이스용 클래스는 c++과 달리 부모로서 추가되는 게 아니다. 블루 프린트 클래스에서 부모 클래스는 단 하나만 존재할 수 있다. 인터페이스를 추가하고자 할 때는, 클래스 속성에서 Interfaces 카테고리에서 Add를 해서 추가해야 한다.

 

인터페이스 함수를 호출하기 위해서는 캐스팅이 필요없다. 예를 들어, BP_Parent라는 부모 클래스가 있고, 이를 상속 받은 BP_Child 클래스가 있다. BP_Child 클래스는 BP_Interface라는 인터페이스를 추가했고, 함수부분을 구현했다.

 

인터페이스에서 정의된 함수를 호출하려고 보면, BP_Child 클래스 뿐 아니라 BP_Parent 클래스에 대해서도 함수 호출이 가능하다. 인터페이스 함수의 인자를 자세히 보면, 특정 클래스가 아니라 Object Refernece를 받는다. 즉, 아무 클래스에 대해서 호출이 가능하다. 그런데, 해당 인터페이스를 상속 받지 않은 클래스에서 어떻게 함수 호출이 가능할까? c++에서는 컴파일 에러가 날 상황인데, 언리얼에서는 어떻게 가능한가?

 

알고 보니, 인터페이스 함수 내부에서의 처리는 c++의 상속 개념이라기 보다는 메시지 함수와 비슷하다고 한다. 그래서, 어떤 클래스에 대해서도 호출이 가능하다. 해당 클래스에 인터페이스 함수가 구현되어 있으면 처리를 하지만, 구현되어 있지 않으면 조용히 실패를 한다고 한다. 즉, c++ 처럼 컴파일 에러가 발생하지 않기 때문에 주의가 필요하다.

 

언리얼 에디터에서 게임 플레이 종료하는 키는 기본으로 ESC로 설정되어 있다.

이를 다른 키로 바꾸고 싶은 경우가 있다.

Editor Preferences/Keyboard Shortcuts 메뉴를 선택한 다음, play world로 검색한다.

검색되어 나오는 항목들을 보면, 'stop (stop simulation)'이라는 게 보인다.

해당 항목의 단축키를 ESC에서 Shift+ESC 와 같은 다른 키로 바꾸면 된다.

 

+ Recent posts