Renderer.SharedMaterial

인스펙터에서 보는 매터리얼은 Renderer의 SharedMaterial에 저장되어 있다고 함. sharedMaterial을 수정하면 해당 매터리얼을 사용하는 모든 오브젝트의 모양이 변경되고, 프로젝트에 저장된 매터리얼 설정도 변경된다. sharedMaterial이 반환한 material은 수정하지 않는 것이 좋다. renderer의 material을 수정하려면 그냥 Renderer.material 를 사용하는 것을 추천한다.

 

Unity에서는 Render.material에 접근하는 순간 sharedMaterial의 사본을 만들게 된다. 따라서 sharedMaterial과 독자적으로 동작하는 material의 인스턴스가 생성되고 이는 기존 매터리얼이 아닌 별도의 매터리얼이라 변경된 프로퍼티들은 공유가 되지 않는다.

 

Renderer.materials 설명

해당 컴포넌트를 가진 오브젝트에서 인스턴스화된 모든 material을 반환한다. 렌더러가 사용하는 material의 배열이고, 단일 오브젝트에 여러 개의 material을 사용할 수 있도록 유니티가 지원하는 기능이며, 이 경우에는 `materials`는 모든 매터리얼을 포함한다.  매터리얼이 두 개 이상일 때는 sharedMaterial이나 material 프로퍼티는 가장 처음 사용된 것을 반환한다.

 

아래와 같이 materials를 반환받을 때는 material array의 copy가 반환된다. 그래서 material을 변경하고 싶다면 값을 가져와서 항목을 변경하고 material을 다시 설정해야 한다.

// 매터리얼의 copy를 가져와 수정하고 싶은 매터리얼로 변경
Material[] materials = selectedObject.GetComponent<Renderer>().sharedMaterials;
for (int i = 0; i < materials.GetLength(0); i++)
{
    materials[i] = Instance._selectedMaterial;
}

// 매터리얼을 삽입하고 싶은 오브젝트에 삽입
selectedObject.GetComponent<Renderer>().materials = materials;

 

 

 

 

참고 자료