Spine Skeleton의 이미지를 전환하는 방법 (Unity)

7946 단어 SpineC#Unity

소개



Spine에서 본은 공통으로 스킨만을 바꾸고 싶을 때가 있으므로, 그 방법의 메모입니다.
(SpineUnityRunTime 버전은 4.0입니다)

스킨 이미지에 Spine Atlas용 이미지 프리셋 적용



평소와 같이 이미지를 추가한 경우 저작물을 Texture로 가져올 수 없으므로 해결 방법을 작성합니다.
(Unity는 2D 프로젝트이며 뭔가 설정이 잘못되었을 수 있습니다)

Spine 매뉴얼대로 각종 데이터를 추가한 경우의 이미지는 올바른 설정으로 추가되는 것 같습니다.

여기에서 설정을 사전 설정으로 저장하고,


추가한 이미지도 같은 버튼에서 프리셋을 적용할 수 있습니다.

설정을 동일하게 함으로써 문제 없이 이미지를 사용할 수 있었습니다.

SkeletonAnimation의 경우



이것은 2D 월드 공간에서 해골을 표시하는 데 사용되는 구성 요소입니다.
다음 확장 메소드를 정의하고,
public static class SpineExtension {

    public static void SetAtlasTexture(this SkeletonAnimation skeletonAnimation, string materialName, Texture texture) {
        foreach (var atlas in skeletonAnimation.skeletonDataAsset.atlasAssets) {
            foreach (var mat in atlas.Materials) {
                if (mat.name == materialName) {
                    var newMat = new Material(mat) {
                        mainTexture = texture
                    };
                    skeletonAnimation.CustomMaterialOverride[mat] = newMat;
                }
            }
        }
    }

}


전화할 때는
[SerializeField] SkeletonAnimation _skeletonAnimation;

var texture = Resources.Load<Texture>("chara2");
_skeletonAnimation.SetAtlasTexture("chara_Material", texture);

로 스킨을 바꿀 수 있었습니다.

SkeletonGraphic의 경우



이것은 UiCanvas에서 해골을 표시하고자 할 때 사용하는 구성 요소입니다.

아틀라스가 하나라면



이 경우는 OverrideTexture 프로퍼티로 새로운 텍스처를 세트 하면 괜찮을까 생각합니다.
skeletonGraphic.OverrideTexture = texture;

아틀라스가 여러 개 있는 경우



Multiple CanvasRenderers에 체크 표시





확장 함수 구현


public static class SpineExtension {

    public static void SetAtlasTexture(this SkeletonGraphic skeletonGraphic, string materialName, Texture texture) {
        skeletonGraphic.allowMultipleCanvasRenderers = true;
        skeletonGraphic.OverrideTexture = texture;
        foreach (var atlas in skeletonGraphic.skeletonDataAsset.atlasAssets) {
            foreach (var mat in atlas.Materials) {
                if (mat.name == materialName) {
                    skeletonGraphic.CustomTextureOverride[mat.mainTexture] = texture;
                }
            }
        }
    }

}

호출시
[SerializeField] SkeletonGraphic _skeletonGraphic;

var texture = Resources.Load<Texture>("chara2");
_skeletonGraphic.SetAtlasTexture("chara_Material", texture);

좋은 웹페이지 즐겨찾기