Devlog/Unity

[Unity]에디터상에서 에셋번들로 불러온 모델링 쉐이더가 핑크색으로 보일 때

Damien.Lee 2018. 2. 1. 18:00
반응형


유니티 에디터 상에서 에셋번들로 불러온 모델링 쉐이더가 핑크색으로 보일 때


게임의 데이터 분리를 위해 에셋번들을 제작하고, 캐릭터를 불러오는 테스트 작업을 진행중입니다.


문제점

프로젝트를 빌드 한 뒤, 안드로이드 기기상에서 테스트할때는 정상적으로 보이나,
유니티 에디터상에서 테스트를 할땐 모델링 쉐이더가 누락된것 처럼 핑크색으로 표시됩니다.
( * 만약 모바일에서도 핑크색으로 표시된다면, 쉐이더 자체가 모바일을 지원하지 않거나, 누락된 상태이니 다시 한번 확인해보세요. )

[좌측이 에셋번들로 불러온 모델링, 우측은 씬에 곧바로 배치해놓은 모델링 ]



해결방안

우리가 개발하면서 사용하는 유니티 에디터의 환경은 안드로이드가 아니라 Standalone ( 윈도우 / 맥 ) 환경 입니다.
그렇기에 Standalone의 그래픽 API 를 모바일과 같은 OpenGL 환경으로 변경해주면 됩니다.

[ Payer Settings 설정 ]

* PlayerSettings -> PC, Mac and Linux Settings -> Other Settings 로 이동.

* Auto Graphcis API for Windows 체크 해제

*  ' + ' 버튼 클릭 후 OpenGLES3 추가

*  ' = ' 를 눌러서 OpenGLES3가 최상단에 위치하도록 이동.

* 유니티 재시작 후 테스트.


[ 재시작 이후 DX11 에서 OpenGL ES 3.1 AEP 로 표시가 변경된걸 볼수 있다. ]


변경 이후 에셋번들의 데이터는 로드가 재대로 되는데, 기존에 있던 데이터가 안나온다면, 쉐이더 컴파일 오류입니다.
기존에 있던 쉐이더 삭제하신다음 유니티에 다시 임포트해보시면 정상적으로 돌아가시는걸 확인하실 수 있습니다.



+ 사실 타겟 플랫폼대로 빌드해서 실행해보면 정상적으로 잘 나온다.

   유니티에디터 상에서 로드했을때도 정상적으로 불러오는 방식을 하고 싶다면 전처리를 이용해 에디터상에서만 쉐이더 경로를 재설정해주는 방식을 쓰면 됩니다.


 private void Awake()

  1. {
  2. #if UNITY_EDITOR
  3. foreach(Transform t in gameObject.GetComponentsInChildren<Transform>()) {
  4. if(t.gameObject.renderer != null)
  5. {
  6. t.gameObject.renderer.material.shader = Shader.Find(t.gameObject.renderer.material.shader.name);
  7. }
  8. #endif
  9. }


번들로 만들 에셋의 최상위 오브젝트에 해당 스크립트를 동작시키면 됩니다.



참고사이트

https://forum.unity.com/threads/loading-assets-from-assetbundles-makes-assets-appear-pink-in-editor.326541/#post-2278648

반응형