유니티 게임개발 시 많이 사용되는 Spine을 쓰던 도중, 스파인 애니메이션 중에 실시간으로 메테리얼을 교체해야 하는 이슈가 있었다.
맨 처음에는 평범하게 유니티 Mesh Renderer
에서 직접 material
을 변경해봤다.
1
2
obj.GetComponent<MeshRenderer>().material = newMaterial; // 단일 메테리얼일 때
obj.GetComponent<Renderer>().materials = new Material[2] {newMaterial, newMaterial}; // 여러 개의 메테리얼을 교체할 때
하지만 실제 게임에서는 효과가 없었다.
아마도 Spine이 애니메이션을 제어하면서 메테리얼도 자체적으로 제어하고 있기 때문이 아닐까 싶어서 따로 검색해 봤다. 역시나 스파인 문제였고, 스파인 라이브러리에는 객체의 메테리얼을 변경(덮어쓰기)할 수 있는 기능이 따로 있었다.
적용하는 법은 다음과 같다.
1
2
3
var skeleton = o.GetComponent<SkeletonAnimation>();
var mat = skeleton.SkeletonDataAsset.atlasAssets[0].PrimaryMaterial;
skeleton.CustomMaterialOverride.Add(mat, newMaterial);
스파인 쪽에 기능이 있을 거라는 생각을 못 하면 한참 헤맬 수 있는 문제였는데, 다행이 직감판정(?)에 성공해서 빠르게 해법을 찾을 수 있었다.