언리얼 엔진 4.11 이후 부터 버젼 확인 방식이 바뀌었는지 솔루션 빌드 후 압축해서 배포했더니 DLL 버전 오류가 발생했다. 에픽에 배포버전 정식 빌드 절차를 물어봤지만 원하는 답변을 얻을 수는 없었다.

 

UE4 AnswerHub 에 같은 질문이 있길래 답변대로 해봤지만 BUILD FAILED 메시지가 보였다. (지금 와서 확인해보니 컴파일 에러가 있었다.)

 

참고 :  

https://answers.unrealengine.com/questions/393280/packaging-ue4-for-distributing-internally.html

 

언리얼 엔진 소스를 수정해서 사용하고 있는 관계로 원본 언리얼 엔진을 받아서 빌드해 봤지만 C4819 컴파일 오류가 발생했다.

 

인코딩 문제인데 영미권에서 사용하는 문자를 한국어(949) 코드페이지에서 인식하지 못해 발생하는 오류였다. 강제로 utf-8 인코딩으로 바꾸거나 문제가 되는 문자를 지워서 해봤지만 하나를 수정하면 다른 곳에서 문제가 발생했다.

 

그러다가 문제 없는 소스를 배포했을 거라는 생각에 윈도우 기본 인코딩을 바꿔보기로 했다.

 

'제어판' > '키보드 또는 기타 입력 방법 변경' 을 눌러 '국가 및 언어' 설정창을 연다.

'관리자 옵션' 탭에서 '유니코드를 지원하지 않는 프로그램용 언어' 영역에서 '시스템 로캘 변경' 버튼을 누른다.

'현재 시스템 로캘' 에서 '영어(미국)'을 선택한다.

재부팅이 필요하다.

 

그리고 빌드했더니 BUILD SUCCESS !!

몇일만에 빌드 성공인지...

 

복사해서 실행했더니 잘 되는 것 같다. 에디터가 삭제되는 경우가 1번 있었는데 재현되지 않았다. Saved 와 Intermediate 폴더를 삭제하고 Clean 상태에서 하면 문제가 발생하지 않는 것 같다.

 

배포버전 빌드 방법

  • 엔진소스를 받는다.
  • UE4Games.uprojectdirs 파일을 추가한다.
    • Samples/
    • Templates/
  • 시스템 로캘을 '영어(미국)'으로 변경한다.
  • Engine/Build/BatchFiles 폴더로 이동한다.
  • 명령창에 아래와 같은 명령어를 입력한다.
    • RunUAT.bat GUBP -Node=GatherRocket -TargetPlatforms=Win32+Win64 -NoDDC -CleanLocal -NoSign
  • BUILD SUCCESSFUL 을 확인한다.
  • LocalBuilds/Rocket/Windows 폴더를 묶어서 배포한다.!!
728x90

 

 

Visual Studio 로 언리얼 작업할 때 솔루션 구성 넓이가 좁아서 지금 선택한 솔루션이 'Development Editor' 인지 'Development' 인지 'Development Game' 인지 알기 힘들다.

 

 

도구 > 사용자 지정 메뉴를 선택한 후

명령 탭을 선택하고 도구 모음 > 표준을 선택한다.

아래에서 솔루션 구성을 선택하고 선택 사항 수정 버튼을 누른 후 너비를 200 정도로 수정하면 된다.

 

 

 

 

출처 : https://docs.unrealengine.com/latest/KOR/Programming/Development/VisualStudioSetup/index.html

728x90

새 svn 저장소를 만들고 checkout 받고 commit 까지 받았는데 show history를 했더니 아래와 같은 메시지가 뜬다.


Want to go offline?


There has been a problem contacting the server.

Do you want to see the cached data instead?


Please understand that the cached data may be outdated, incomplete or even misleading due to incomplete history data.


서버가 내려가 있나 싶었는데 update는 잘 동작하고 있었다.


로그나 리비전 그래프 볼 때는 유저 계정이 아니라 anonymous 를 이용하나 보다. authz 에 아래와 같이 anonymous 에게 read 권한을 줬더니 해결되었다.


[/]

@user = rw

$anonymous = r


출처 : http://mugrammer.tistory.com/63

728x90

UE4 의 블루프린트에 EnumToString 이라는 노드가 있는데 C++ native 단에서 구현하려면 아래와 같이 하면 되는 것 같다.

 

FString GetEnumString(TCHAR* EnumType, int32 EnumValue)
{
    UEnum* EnumObject = FindObject<UEnum>(ANY_PACKAGE, EnumType, true);

    if (EnumObject)
    {
        return EnumObject->GetEnumName(EnumValue);
    }

    return FString(TEXT("Unknown Enum"));
}

728x90

Mutex 를 이용하여 중복실행을 방지한다.

 

string mutexName = "MutexName";

Mutex mutex = new Mutex(true, mutexName);

 

// 실행 종료 중에는 획득할 수 없을 수도 있기 때문에 1초간 기다린다.

TimeSpan wait = new TimeSpan(0, 0, 1);

bool success = mutex.WaitOne(wait);

 

if (success == false)

{

MessageBox.Show("이미 실행중입니다.");

return;

}

 

참고 : http://egloos.zum.com/metashower/v/9468289

728x90

svn 을 쓰다보면 checkout 폴더가 용량이 말도 안되게 큰 경우를 보게된다. 폴더별 용량 확인 프로그램으로 보니 .svn 폴더가 소스 폴더보다 용량이 더 큰 상황이 벌어졌다. .svn 폴더의 prinstine 폴더가 그 주범이다. 해당 폴더를 정리하려면 svn cleanup 을 해주면 된다.


Tortorise Svn 의 경우 Clean up... 을 선택하고 Vacuum pristine copies 를 체크하고 OK를 누르면 된다.




728x90

언리얼 엔진 소스를 받아서 빌드한 에디터를 사용한 프로젝트를 빌드할 경우 Visual Studio 솔루션(sln) 파일에 엔진관련 프로젝트 파일도 포함되어 엔진도 다시 빌드되는 경우가 있다.

 

lib까지 포함된 에디터를 배포해도 엔진 빌드가 되고 엔진 빌드의 경우 혼자서 빌드하기에는 시간이 오래 걸려 짜증 났었는데 아래와 같은 명령어를 사용해서 빌드하면 엔진 빌드를 하지 않는다고 한다.

 

YourEngineFolder/Engine/Binaries/DotNET/UnrealBuildTool.exe "YourGameFolder/YourGameProjectName.uproject" -ProjectFiles -game -rocket

 

uproject 윈도우즈 shell extension 에 있는 "Generate Visual Studio project files" 명령과 차이가 뭔지 보기 위해 레지스트리를 검색해 봤다.

 

위치 : HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Unreal.ProjectFile

keyword : Generate Visual Studio project files

command : "C:\Program Files\Epic Games\Launcher\Engine\Binaries\Win64\UnrealVersionSelector.exe" /projectfiles "%1"

 

UnrealVersionSelector 소스에서 projectfiles 를 검색해서 코드를 보니 GenerateProjectFiles.bat 파일이나 Engine/Build/SourceDistribution.txt 파일이 있으면 프로젝트 파일 생성 시 -engine 옵션을 추가해주고 있었다.

 

배포된 커스텀 엔진을 보니 SourceDistribution.txt 파일이 있어서 삭제했더니 엔진 빌드를 하지 않게 되었다.

 

단점은 커스텀 엔진 배포시에 Debug / Debug Editor / Development / Development Editor / Shipping 으로 빌드된 lib 를 같이 배포해야 한다는 점이다.

728x90

자식 클래스에서 부모 클래스로 static_cast 하는 코드에서 C2243 에러가 나서 한참 해맸는데 class 상속할 때 public 으로 안해서 생긴 문제였음.

 

class B {};

class D : private B {};

class E : public B {};

 

D d;

B *p = &d; // C2243

 

E e;

B *p2 = &e;

 

D* d = new D;

B *p = static_cast<B*>(d); // C2243

 

출처 : Visual Studio 2015 Comipler Error C2243

728x90

boost 라이브러리를 1.55 에서 1.59 로 업데이트 후 링크 시에 아래와 같은 오류가 발생했다.


error LNK2019: "void __cdecl boost::throw_exception(class std::exception const &)" (?throw_exception@boost@@YAXABVexception@std@@@Z) 외부 기호(참조 위치: "void __cdecl boost::exception_detail::throw_exception_<struct boost::escaped_list_error>(struct boost::escaped_list_error const &,char const *,char const *,int)" (??$throw_exception_@Uescaped_list_error@boost@@@exception_detail@boost@@YAXABUescaped_list_error@1@PBD1H@Z) 함수)에서 확인하지 못했습니다.


boost:tokenizer 를 사용하고 있는데 exception 이 1.55 에서는 throw 를 사용하고 있던 코드가 BOOST_THROW_EXCEPTION 를 사용하도록 바뀌어서 발생한 문제였다.


// 1.55

    void do_escape(iterator& next,iterator end,Token& tok) {

      if (++next == end)

        throw escaped_list_error(std::string("cannot end with escape"));

      if (Traits::eq(*next,'n')) {

...


// 1.59

   void do_escape(iterator& next,iterator end,Token& tok) {

      if (++next == end)

        BOOST_THROW_EXCEPTION(escaped_list_error(std::string("cannot end with escape")));

      if (Traits::eq(*next,'n')) {

...


BOOST_NO_EXCEPTIONS 설정을 사용하는 경우 throw_exception 을 각 플랫폼에 맞춰서 구현해줘야 했는데 지금까지는 exception 을 발생시키는 boost library 를 사용하고 있지 않아서 몰랐던 것이었다.


// throw_exception.hpp

void throw_exception( std::exception const & e ); // user defined


일단 아래와 같이 구현해서 링크 에러는 해결했다.


namespace boost

{

void throw_exception(std::exception const & e)

{

throw e;

}

}


728x90

언리얼 4.6 이후 C++ Class 를 생성하면 Body 에 GENERATED_UCLASS_BODY 대신에 GENERATED_BODY 가 자동으로 채워진다. 4.6 릴리즈 노트에도 GENERATED_UCLASS_BODY 대신에 GENERATED_BODY 사용하라고 하는데 FObjectInializer 를 parameter 로 받는 constructor 에서 컴파일 오류가 나서 예전 방식대로 사용하고 있었다.

 

// header 

 

UCLASS()

class OldClass : public UObject

{

GENERATED_UCLASS_BODY()

};

 

UCLASS()

class NewClass : public UObject

{

GENERATED_BODY()

};

 

// cpp

 

OldClass::OldClass(const class FObjectInitializer& PCIP)

{

}

 

// error C2084 : NewClass::NewClass 함수가 이미 본문에 있습니다.

NewClass::NewClass(const class FObjectInitializer& PCIP)

{

}

 

GENERATED_BODY() 를 사용할 경우 UnrealBuildTool 에서 자동으로 constructor 를 declaration & define 해주는 코드를 생성해서 발생한 문제였다. Class 선언에 constructor 를 명시적으로 해주면 상관없는 문제였다.

 

UCLASS()

class NewClass : public UObject

{

GENERATED_BODY()

 

NewClass(const class FObjectInitializer& PCIP);

};

 

// cpp

 

// error C2084 : NewClass::NewClass 함수가 이미 본문에 있습니다.

NewClass::NewClass(const class FObjectInitializer& PCIP)

{

}

 

GENERATED_BODY 가 뭐 몇몇 향상이 있어 사용하라고 하니 앞으로는 GENERATED_BODY 를 이용해야겠다.

 

참고 :

언리얼 4.6 릴리즈 노트

C2084 관련 오류 답변

728x90

+ Recent posts