메티리얼을 직접 수정하면 각 객체에 대해 메모리에 해당 머티리얼의 새로운 인스턴스를 생성하게 됩니다.
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에 적용합니다. |
결과
에디터를 실행시켜준 다음 메테리얼의 값을 변경해도 새로운 인스턴스가 생기지 않고 원본 메테리얼을 수정되는 것을 확인할 수 있습니다.