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(=shared material)의 사본을 생성(Instance)하여 별도의 material을 적용
👉 소유자(owner) 정보를 먼저 확인하고, 소유자가 renderer가 아니면
( = renderer 전용 material이 아니면
= 여러 object가 공유해서 사용하고있는 material이면
= shared material이면 )
복사해서 생성함
material에 접근한 object의 수만큼 Instance가 생성되기 때문에 batching이 불가능
👉 단순 참조로도 사본이 생성됨
👉 접근할 때마다 리소스가 증가
LineRenderer lr = newGrid.GetComponent<LineRenderer>();
Material mat = Resources.Load<Material>("GridMaterial");
lr.sharedMaterial = mat;
lr.sharedMaterial.color = Color.blue;
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