본문 바로가기

[unity] 에셋번들 shader missing(핑크색 현상) 코드로 수정하기

앤디가이 2022. 5. 17.

유니티에서 파일 관리 및 에셋 동적 로드를 위해 에셋 번들을 주로 사용한다. 하지만 간혹 유니티 버전을 올리거나 환경이 변경되었을 때 에셋 번들을 다운로드하면, 셰이더 컴파일 오류로 인해 모델이 핑크색(shader missing)으로 보이는 현상을 코드로 수정하는 방법을 알아보자.

 

1. Shader Missing 현상 분석

 - Unity에서 AssetBundle 로드 시 간혹 아래와 같이 핑크색으로 보이는 화면을 마주칠 때가 있다.

 - Assetbundle을 제작했을 때의 환경(유니티 버전)과 다운로드 받았을 때의 환경이 다른 경우 주로 발생한다.

Assetbundle shader missing
Assetbundle shader missing 현상

 - 메터리얼을 포함하는 컴포넌트는 다양한 종류가 있지만 우선 확인해봐야 할 컴포넌트는 MeshRenderer 컴포넌트이다. MeshRenderer 컴포넌트의 Materials의 Material을 클릭하여 Meterial의 상태를 확인해본다.

MeshRenderer Component
MeshRenderer Component

 

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 된 셰이더를 추가해주자. 

Unity Graphic Setting
Unity Graphic Setting 화면

 - 해당 과정을 거친 후 다시 빌드해서 실행해 보면, Missing 됬던 Shader가 다시 잘 컴파일된 걸 볼 수 있다!

Unity 정상적인 Shader 모습
셰이더가 정상적으로 입혀진 모습

 - 결론적으로 어떤 객체의 컴포넌트에서 missing 나는지 찾는게 가장 중요하다.

 - 다른 예로 캐릭터가 핑크색으로 나온다면 SkinnedMeshRenderer 일 수 있으며 Particle이 핑크색이 나온다면 ParticleRenderer가 대상이 될 수 있다.

 

댓글