[unity] 에셋번들 shader missing(핑크색 현상) 코드로 수정하기
유니티에서 파일 관리 및 에셋 동적 로드를 위해 에셋 번들을 주로 사용한다. 하지만 간혹 유니티 버전을 올리거나 환경이 변경되었을 때 에셋 번들을 다운로드하면, 셰이더 컴파일 오류로 인해 모델이 핑크색(shader missing)으로 보이는 현상을 코드로 수정하는 방법을 알아보자.
1. Shader Missing 현상 분석
- Unity에서 AssetBundle 로드 시 간혹 아래와 같이 핑크색으로 보이는 화면을 마주칠 때가 있다.
- Assetbundle을 제작했을 때의 환경(유니티 버전)과 다운로드 받았을 때의 환경이 다른 경우 주로 발생한다.
- 메터리얼을 포함하는 컴포넌트는 다양한 종류가 있지만 우선 확인해봐야 할 컴포넌트는 MeshRenderer 컴포넌트이다. MeshRenderer 컴포넌트의 Materials의 Material을 클릭하여 Meterial의 상태를 확인해본다.
2. Shader Missing 현상 수정 코드 작성
- 3D 오브젝트의 MeshRenderer 객체의 Material shader의 문제라면 다음과 같은 코드로 현재 Scene의 모든 MeshRenderer 컴포넌트를 검색할 수 있다.
MeshRenderer[] renderers = FindObjectsOfType(typeof(MeshRenderer)) as MeshRenderer[];
- 받아온 MeshRenderer들을 검색해서 다시 컴파일된 셰이더를 넣어주면 된다.
foreach (MeshRenderer item in renderers)
{
if (item.materials != null)
{
foreach (Material mat in item.materials)
{
Shader sha = mat.shader;
sha = Shader.Find(sha.name);
mat.shader = sha;
item.material = mat;
}
}
}
- 마지막으로 Unity 메뉴의 Edit -> Project Settings -> Graphics 항목으로 이동해서 Built-in Shader Settings 에 Always Included Shaders에 Missing 된 셰이더를 추가해주자.
- 해당 과정을 거친 후 다시 빌드해서 실행해 보면, Missing 됬던 Shader가 다시 잘 컴파일된 걸 볼 수 있다!
- 결론적으로 어떤 객체의 컴포넌트에서 missing 나는지 찾는게 가장 중요하다.
- 다른 예로 캐릭터가 핑크색으로 나온다면 SkinnedMeshRenderer 일 수 있으며 Particle이 핑크색이 나온다면 ParticleRenderer가 대상이 될 수 있다.
댓글