본문 바로가기

유니티

[Unity] Material Property Block 사용하여 배칭시키기

요약

- Material Property Block을 써도 속성 값이 같아야 배칭을 시켜준다.

- Frame Debugger로 볼 수 있는 속성 값이 같아도 배칭이 되지 않는 경우가 있다.

- 배칭시켜줄 렌더러의 Property Block을 모두 같은 방식으로 생성해 준 뒤 적용시켜야 편하게 쓸 수 있을듯하다

 

 

var sr = GetComponent<SpriteRenderer>();
sr.material.SetColor("MainColor", Color.white);

유니티에서 Material을 수정하면 Instance가 생성되어 배칭이 되지 않는다.

 

 

Material Property Block


Material Property Block을 사용하면 Material Instance를 생성시키지 않고 속성 값을 변경 할 수 있다.

var sr = GetComponent<SpriteRenderer>();
var mpb = new MaterialPropertyBlock();
mpb.SetColor("_Color", Color.red);
sr.SetPropertyBlock(mpb);

Instance 생성은 되지 않았지만 배칭 또한 되지 않았다.

물론 색이 다르니 당연한 결과일 수 있겠지만 red가 아니라 white로 지정해도 배칭되지 않는다.

프레임 디버거를 통해 확인해보면 친절하게 이유를 알려준다.

프로퍼티블록 값이 달라서 배칭이 되지 않는다고 한다.

프로퍼티블록 값을 변경한 객체는 텍스쳐이름이 UnityWhite로 바뀌어있다.


var sr = GetComponent<SpriteRenderer>();
var mpb = new MaterialPropertyBlock();
sr.GetPropertyBlock(mpb);
mpb.SetColor("_Color", Color.white);
sr.SetPropertyBlock(mpb);

GetProperty()함수를 써서 받아오면 텍스쳐가 UnityWhite로 바뀌지 않는다. 

하지만 프레임 디버거로 볼 수 있는 속성값은 모두 같아도 배칭이 되지 않는다.

 

 


한쪽에만 스크립트를 적용시킨 상태로 아래처럼 하면 배칭이 된다.

var sr = GetComponent<SpriteRenderer>();
var mpb = new MaterialPropertyBlock();
sr.GetPropertyBlock(mpb);
sr.SetPropertyBlock(mpb);

 

근데 아래처럼 하면 배칭이 되지 않고 투명색이 되어버린다.

화면에 투명색 네모가 있어요

var sr = GetComponent<SpriteRenderer>();
var mpb = new MaterialPropertyBlock();
sr.GetPropertyBlock(mpb);
mpb.SetColor("_Color", mpb.GetColor("_Color"));
sr.SetPropertyBlock(mpb);

이해하기 조금 난해한 결과다. 

위에 코드에서도 색만 따로 로그를 찍어보면 투명색(0,0,0,0)이 나온다.

어차피 같은색인데 SetColor()를 다시 해준다고 어떤 의미가 있을까 라는 생각이 드는데...

내부적으로 Set을 해줄 때 뭔가가 다시 설정되어서 그런게 아닐까 추측하고있다.


같은 스크립트를 넣고나니 배칭을 시켜줬다.