[Unity] Material과 SharedMaterial

0시0분·2023년 6월 8일
0

Unity

목록 보기
2/19
if (GUILayout.Button("생성", GUILayout.Width(60)))
{
    GameObject newGrid = new GameObject();
    newGrid.AddComponent<LineRenderer>();

    LineRenderer lr = newGrid.GetComponent<LineRenderer>();
    lr.material.color = Color.blue;

    MakeGrid(lr, 0, 0, rowCnt, colCnt);
}

에디터에서 GameObject를 생성후 Renderer를 추가해서 material의 컬러 값을 변경했는데 아래와 같은 에러메세지가 떴다.

⚠️ Instantiating material due to calling renderer.material during edit mode. This will leak materials into the scene. You most likely want to use renderer.sharedMaterial instead.

리소스릭이 발생하니 Renderer.material 대신 Renderer.sharedMaterial을 사용하라는 내용이다.


Material

  • 원래 material(=shared material)의 사본을 생성(Instance)하여 별도의 material을 적용
    👉 소유자(owner) 정보를 먼저 확인하고, 소유자가 renderer가 아니면
    ( = renderer 전용 material이 아니면
    = 여러 object가 공유해서 사용하고있는 material이면
    = shared material이면 )

    복사해서 생성함

  • material에 접근한 object의 수만큼 Instance가 생성되기 때문에 batching이 불가능
    👉 단순 참조로도 사본이 생성됨
    👉 접근할 때마다 리소스가 증가



Shared Material

  LineRenderer lr = newGrid.GetComponent<LineRenderer>();
  Material mat = Resources.Load<Material>("GridMaterial");
  lr.sharedMaterial = mat;
  lr.sharedMaterial.color = Color.blue;
  • 여러 renderer들이 공유해서 사용함



차이점 테스트

Material을 사용하고있는 'material' 오브젝트와 SharedMaterial을 사용하고있는 'shared material 1' 오브젝트가 있을때,

Material mat = Resources.Load<Material>("GridMaterial");
lr.sharedMaterial = mat;
lr.sharedMaterial.color = Color.red;

sharedMaterial의 color값을 변경하는 'shared material 2' 오브젝트를 생성하면

sharedMaterial을 사용하는 'shared material 1', 'shared material 2' 오브젝트의 color 값만 변경된것을 확인할 수 있다.



참고
👀 https://cacodemon.tistory.com/entry/material-%EA%B3%BC-sharedMaterial-%EA%B7%B8%EB%A6%AC%EA%B3%A0-Material-Property-Block
👀 https://m.blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=kwmnusa&logNo=220963521190
👀 http://egloos.zum.com/metashower/v/9660984

0개의 댓글