유니티 메테리얼 복사본 없이 수정하기 #MaterialPropertyBlock

(좌) -> (우) Instance 복사본 생성되는 경우 

 

메티리얼을 직접 수정하면 각 객체에 대해 메모리에 해당 머티리얼의 새로운 인스턴스를 생성하게 됩니다.

MaterialPropertyBlock를 사용하여 복사본이 생성되는 문제를 해결할 수 있습니다.


MaterialPropertyBlock

아래 코드는 MaterialPropertyBlock를 사용한 간단한 예시 입니다.

void ChangeColorWithMaterialPropertyBlock()
{
    Renderer renderer = GetComponent<Renderer>();
    MaterialPropertyBlock propBlock = new MaterialPropertyBlock();

    renderer.GetPropertyBlock(propBlock);
    
    propBlock.SetColor("_Color", Color.red);

    renderer.SetPropertyBlock(propBlock);
}

 

코드 설명
MaterialPropertyBlock propBlock = new MaterialPropertyBlock(); MaterialPropertyBlock 객체를 생성합니다. MaterialPropertyBlock 객체는 Renderer의 속성을 변경하려는 모든 속성을 저장합니다.
renderer.GetPropertyBlock(propBlock); 현재 Renderer에서 MaterialPropertyBlock을 가져옵니다. Renderer의 현재 속성을 propBlock에 복사합니다.
renderer.SetPropertyBlock(propBlock); Renderer의 속성을 propBlock에 저장된 속성으로 설정합니다. propBlock에 저장된 모든 속성을 Renderer에 적용합니다.

 

 


결과 

런타임 중

 

에디터를 실행시켜준 다음 메테리얼의 값을 변경해도 새로운 인스턴스가 생기지 않고 원본 메테리얼을 수정되는 것을 확인할 수 있습니다.