요약
- 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을 해줄 때 뭔가가 다시 설정되어서 그런게 아닐까 추측하고있다.
같은 스크립트를 넣고나니 배칭을 시켜줬다.
'유니티' 카테고리의 다른 글
[Unity] Custom Editor 인스펙터 드랍다운 (enum 없이) (0) | 2023.06.20 |
---|---|
[Unity] Rigidbody 날아가는 궤적 그리기 (0) | 2023.02.26 |
[Unity] 서로 이어지는 이펙트 만들기 (2D) (0) | 2023.01.29 |
[Unity] Json Utility : 유니티에서 Json 읽기 쓰기 (0) | 2022.03.15 |
[Unity] Awake Start Coroutine 상속 (0) | 2022.03.12 |