Live2DモデルをAnimatorを使わずにスクリプトでアニメーションさせる

Animatorを使わずにスクリプトでアニメーションさせる方法です。
まずLive2D.Cubism.Coreをインポートします

```C#:追加インポート
using Live2D.Cubism.Core;
```
次にアニメーションを管理するClassを宣言します。

```C#:actionclip
    public class actionclip
    {
        string ease = "Linear";
        public float startValue = 0;
        public float endValue = 0;
        public float duration = 0;
        public float delay = 0;

        private float currentDurationTime = 0;
        private float currentDelayTime = 0;

        public actionclip(float StartValue, float EndValue, float Duration, float NextDelay = 0, string Ease = "Linear")
        {
            startValue = StartValue;
            endValue = EndValue;
            duration = Duration < 0 ? 0 : Duration;
            delay = NextDelay < 0 ? 0 : NextDelay;
            ease = Ease;

            currentDurationTime = currentDelayTime = 0;
        }

        public void Reflesh()
        {
            currentDurationTime = currentDelayTime = 0;
        }

        public float Value
        {
            get
            {
                float p = endValue;
                if (currentDurationTime <= duration)
                {
                    currentDurationTime +=  Time.deltaTime;
                    float t = 1.0f;
                    if (duration > 0)
                    {
                        t = currentDurationTime / duration;
                    }
                    else
                    {
                        t = 1.0f;
                    }
                    t = t > 1.0f ? 1.0f : t;
                    switch (ease.ToUpper())
                    {
                        case "LINEAR":
                            break;
                        case "EASEIN":
                            t = Calc.EasyEaseIn(t);
                            break;
                        case "EASEOUT":
                            t = Calc.EasyEaseOut(t);
                            break;
                        case "EASEINOUT":
                            t = Calc.EasyEaseInOut(t);
                            break;
                    }
                    p = Mathf.Lerp(startValue, endValue, t);

                }
                else
                {
                    currentDelayTime += Time.deltaTime;
                }
                return p;
            }
        }
        public bool isAnimationEnd
        {
            get
            {
                return (Value == endValue && currentDelayTime > delay);
            }
        }
    }
```
Valueを呼び出すごとに開始値から終了値までの遷移値を取り出し、終了値になったらDelay時間待つだけのスクリプトです。前回の簡単イージングはここで使っています。
https://qiita.com/RYUMAGE/items/0351af94eff77dc32187

そしてLive2Dのパラメータを管理するクラスを宣言します

```C#:param
    public class param
    {
        public CubismParameter dat;
        //Animation
        private actionclip[] animations;
        public bool isRepeat = false;

        private int currentAnimCnt = 0;
        private float startValue = 0;

        public string ID
        {
            get
            {
                return dat.Id;
            }
        }

        public void SetAnimation(actionclip[] Animations, bool Repeat = false)
        {
            currentAnimCnt = 0;
            animations = Animations;
            isRepeat = Repeat;

            startValue = dat.Value;
        }
        public void StopAnimation()
        {
            isRepeat = false;
            animations = null;
        }

        public bool isRunning
        {
            get
            {
                return animations != null;
            }
        }

        public void Update()
        {
            if (animations != null)
            {
                dat.Value = animations[currentAnimCnt].Value;
                if (animations[currentAnimCnt].isAnimationEnd)
                {
                    animations[currentAnimCnt].Reflesh();
                    currentAnimCnt++;
                    if (currentAnimCnt >= animations.Length)
                    {
                        if (isRepeat)
                        {
                            currentAnimCnt = 0;
                        }
                        else
                        {
                            StopAnimation();
                        }
                    }
                }
            }
        }
    }
```

最後にLive2Dモデルデータのパラメーターをこのクラス内のdatに参照させます。
さらにLateUpdate()内でparamをUpdateさせます。

```C#:LateUpdate
    private param[] Live2DParams;
    private CubismModel Model;

    public void InitializeParameters(CubismModel model)
    {
        Model = model;
        Live2DParams = new param[model.Parameters.Length];

        for (int i = 0; i < model.Parameters.Length; i++)
        {
            Live2DParams[i] = new param();
            Live2DParams[i].dat = model.Parameters[i];
        }
    }

    void LateUpdate()
    {
        for (int i = 0; i < Live2DParams.Length; i++)
        {
            Live2DParams[i].Update();
        }
    }
```
こうやってMistyLink TouchableではAnimatorに寄らないスクリプトによるリアルタイムアニメーションをやっていました。