07
30

material

재질(Material)은 게임 오브젝트의 렌더러(Renderer) 컴포넌트에 연결되어 있는 속성으로,
해당 게임 오브젝트의 렌더링에 사용되는 재질을 의미한다.

재질은 색상, 텍스처, 반사율, 광택 등의 시각적 효과를 결정하는 데 사용된다.
각 게임 오브젝트는 자체적으로 재질을 가질 수 있으며, 이 재질은 각각 독립적으로 변경할 수 있다.
  • 예제 코드: 여러 오브젝트가 동일한 material을 공유하고 있고, 그 색을 개별적으로 바꾸는 스크립트
using UnityEngine;

public class ChangeColor : MonoBehaviour
{
    public Color newColor; // 변경하고자 하는 새로운 색상

    void Start()
    {
        // 개별 객체의 Renderer 컴포넌트를 가져옴
        Renderer renderer = GetComponent<Renderer>();

        // 색상을 변경하여 개별 객체의 재질에 할당
        renderer.material.color = newColor;
    }
}

sharedMaterial

여러 게임 오브젝트가 동일한 재질을 공유하는 경우에 사용된다.

예를 들어, 동일한 재질을 사용하는 여러 개의 벽이 있다고 생각해보자.
이때 각 벽은 각자의 재질을 가지고 있지만, 실제로 모두 동일한 재질을 사용한다면,
이 재질을 공유 재질로 설정하여 메모리를 절약할 수 있다.

즉, 공유 재질은 여러 게임 오브젝트가 동일한 재질을 참조할 때 사용되며,
한 곳에서 변경하면 모든 오브젝트에 반영된다.
  • 예제 코드: 여러 오브젝트가 동일한 material을 공유하고 있고, 그 색을 일괄적으로 바꾸는 스크립트
using UnityEngine;

public class ColorChanger : MonoBehaviour
{
    public Color newColor; // 변경하고자 하는 새로운 색상

    void Start()
    {
        // 공유하는 재질을 가져옴
        Material sharedMaterial = GetComponent<Renderer>().sharedMaterial;

        // 색상을 변경하여 재질에 할당
        sharedMaterial.color = newColor;
    }
}

최적화와 관련하여 사용 시 유의점

아래는 유니티 공식 메뉴얼에서 그대로 가져온 문장이다.
드로우콜 배칭을 위해서는 스크립트에서 material을 수정할 때 sharedMaterial을 수정해야겠다.
When you access shared material properties from a C# script, make sure to use Renderer.sharedMaterial and not Renderer.material. Renderer.material creates a copy of the material and assigns the copy back to the Renderer. This stops Unity from batching the draw calls for that Renderer.
COMMENT