animation
Unity

Unityでスプライトアニメーションのスプライトだけを差し替える

More than 1 year has passed since last update.

例えばプレイヤーの衣装を変えて同じ動きをさせたいときなどに、Animatorで別ステートを用意するのは何かと不便です。

そこで、ちょっと強引ではありますが、スプライトアニメーション後に別のスプライトに差し替えることを試してみます。

AnimSpriteChange.cs
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

namespace animSprite{
    [System.Serializable]
    public class ReplaceInfo{
        public string fromName;
        public string toName;
    }

    [RequireComponent(typeof(SpriteRenderer))]
    public class AnimSpriteChange : MonoBehaviour {
        [SerializeField] string spriteResourcePath="";
        [SerializeField] ReplaceInfo[] replaceInfo;
        SpriteRenderer sr;
        Sprite[] resSprArr;
        Dictionary<string,string> repDic;

        void Start () {
            prepare ();
        }

        void LateUpdate () {
            sprChange ();
        }

        void prepare(){
            Resources.LoadAll<Sprite>(spriteResourcePath);
            sr = GetComponent<SpriteRenderer> ();
            resSprArr = Resources.FindObjectsOfTypeAll<Sprite> ();
            repDic = new Dictionary<string, string> ();
            foreach (ReplaceInfo info in replaceInfo) {
                repDic.Add (info.fromName, info.toName);
            }
        }

        void sprChange(){
            string sprName = sr.sprite.name;
            int pos = sprName.LastIndexOf ('_');
            if (pos >= 0) {
                string pre = sprName.Substring (0, pos);
                if (repDic.ContainsKey (pre)) {
                    string post = sprName.Substring (pos);
                    Sprite retSpr = resSprArr.FirstOrDefault(e=>e.name.Equals(repDic [pre] + post));
                    if (retSpr != null) {
                        sr.sprite = retSpr;
                    }
                }
            }
        }
    }
} // namespace animSprite

スクリーンショット 2017-11-28 12.00.14.png

スプライトアニメーションのあるGameObjectにアタッチして実行すると、アニメーション後 fromName_xx から toName_xx にスプライトを差し替えます。
差し替え後のスプライトはResoueceフォルダの下に入れる必要があります。

スクリーンショット 2017-11-28 11.26.57.png

スクリーンショット 2017-11-28 11.27.10.png

OnAnimatorMove() で変化があった時だけ sprChange() を呼ぶようにしていたのですが、チラつくようでしたので LateUpdate() 毎に更新しています

スクリーンショット 2017-11-28 11.42.38.png

スクリーンショット 2017-11-28 11.42.54.png

スプライトアニメーションの作り方は こちら