midas+son의 크리에이티브(creative) 이야기

언리얼 4.16.1 

HTML5패키징(WebGL2) 테스트 중...

빌드 후 톰캣에 올려서 테스트 하는데 2시간 뻘짓한 이야기.


요즘 브라우저들은 기본적으로 캐시가 디폴트 설정이다.

즉 특정 사이트들마다 각 상태값을 자동으로 저장하고 있는 것이다.


HTML5 빌드 테스트 중 아래와 같은 에러 메세지가 여러번 나왔었다.

그 브라우저 캐시를 생각 못해서 엄한 문제만 잡고 있었다.

이런거라든가

저런거라든가

결과적으론 위 같은 것들...


엄한 코드만 뒤적거리고 다른 문제만 잡고 있었다가 갑자기 머리가 번쩍여서 해결(?) 했다.


일단 위처럼 메세지가 나오면 캐시를 의심하라.


그리고 브라우저단위 테스트를 할 때에는

크롬의 시크릿 모드를 활용하자.

캐시를 저장 안해서 매번 새로이 갱신이 잘된다.



// Deprecated Functions
DEPRECATED(4.16, "FindEnumIndex is deprecated, call GetIndexByName or GetValueByName instead")
int32 FindEnumIndex(FName InName) const { return GetIndexByName(InName, true); }

DEPRECATED(4.16, "FindEnumRedirects is deprecated, call GetIndexByNameString instead")
static int32 FindEnumRedirects(const UEnum* Enum, FName EnumEntryName) { return Enum->GetIndexByNameString(EnumEntryName.ToString()); }

DEPRECATED(4.16, "GetEnum is deprecated, call GetNameByIndex instead")
FName GetEnum(int32 InIndex) const { return GetNameByIndex(InIndex); }

DEPRECATED(4.16, "GetEnumNameStringByValue is deprecated, call GetNameStringByValue instead")
FString GetEnumNameStringByValue(int64 InValue) const { return GetNameStringByValue(InValue); }

DEPRECATED(4.16, "GetEnumName is deprecated, call GetNameStringByIndex instead")
FString GetEnumName(int32 InIndex) const { return GetNameStringByIndex(InIndex); }

DEPRECATED(4.16, "GetDisplayNameText with name index is deprecated, call GetDisplayNameTextByIndex instead")
FText GetDisplayNameText(int32 NameIndex) const { return GetDisplayNameTextByIndex(NameIndex); }

DEPRECATED(4.16, "GetEnumText with name index is deprecated, call GetDisplayNameTextByIndex instead")
FText GetEnumText(int32 NameIndex) const { return GetDisplayNameTextByIndex(NameIndex); }

DEPRECATED(4.16, "GetEnumTextByValue with name index is deprecated, call GetDisplayNameTextByValue instead")
FText GetEnumTextByValue(int64 Value) { return GetDisplayNameTextByValue(Value);  }

윈도우 빌드나 에디터 플레이 중에는 상관 없는데

HTMl5 빌드하니 에러가 발생하여 패키징에 실패함.


WebGL2가 4.16버전부터 적용되었으니

이전 함수와 호환을 안시켜주었나보다...바뀐 함수로 수정하자.

정규 프로젝트 외에 WebGL테스트를 위해 언리얼4 엔진은 4.16.1로 업그레이드 하였다.


프로토타입용으로 4.15.1버전을 그대로 놔두고 

이 WebGL 프로토타입 용으로만 프로젝트를 새로 만들었다.


4.15.1에서는 엔진 자체 버그로 HTML5 패키징이 실패 했었는데

4.16 버전부터 WebGL2로 HTML5 패키징 시스템이 바뀌면서 다시 테스트를 하게 되었다.


4.16버전부터 c++ 프로그래밍 h헤더파일의 include 방법이나 빌드 코드가 조금 바뀌었고


마이그레이션 작업을 시간을 들여 다시 하게 되었었는데 


헤더를 필요한 것만 추가해놓으니까 비쥬얼 스튜디오의 인텔리센스(IntelliSense) 속도가 향상된 것을 느꼈다.


주된 내용으로 넘어가서 

HTML5프로젝트는 기본적으로 모바일 플랫폼 개발 방법을 따라간다.


테스트로 Windows용 dll이나 exe를 참조하는 부분을 제외한 나머지 기능들에 대해서만

별도로 프로젝트를 구축했고 HTML5빌드에 성공했는데

화면에 검게 나오는 현상이 있었다.

Widget으로 만든 UI는 제대로 나오는 것을 확인해보니 빌드 오류는 아닌 것 같았다.


구글링으로는 답이 안나와서 언리얼 정식 docs를 찾아 답을 구했다.


모바일 디바이스용 퍼포먼스 지침서 : 

https://docs.unrealengine.com/latest/KOR/Platforms/Mobile/Performance/index.html


모바일 플랫폼에서의 포스트 프로세스 이펙트 : 

https://docs.unrealengine.com/latest/KOR/Platforms/Mobile/PostProcessEffects/index.html


프로젝트 셋팅의 mobile HDR 옵션이 체크 해제되어 있었다.

이 부분을 체크 하고 에디터를 재시작한 뒤에

다시 HTML5로 빌드를 하면

위젯 외에도 Actor들이 크롬에서 정상적으로 나오는 것을 확인하였다.


위의 링크들을 들어가보고 읽어보면 포스트 프로세싱을 위해서는 저 옵션이 적용되어있어야 되었고

그외 여러 세팅들도 Mobile HDR 옵션이 필요하다고 한다.


MSAA(안티앨리어싱)은 사용하고자 하는 기능에 따라 꺼야 하는 경우도 있다.

주의하여 세팅해보자.