【Unity2D】【BlendTree】 動的にキャラクターのAnimationClipを変更する

# やりたいこと
Unity2Dでこのような画像を用いてキャラクターの歩行アニメーションを表示しています。
![sprite.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3249502/43ce528c-9c1f-4df9-5bba-2ef84d324827.png)

それを、このようにBlendTreeの"Motion"からAnimationClipを指定して再生を行っています。
![Animator初期.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3249502/0367fce0-c55f-ee22-454f-08a0b3bdc662.png)
![BrendTree初期.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3249502/5d851185-98a0-bc75-d977-83c4a7850dfc.png)

このBlendTreeのAnimationClipをスクリプトから動的に変更する方法を紹介します。

# 割愛すること
以下のことに関してはこの記事では割愛します。
・spriteを区切る
・AnimationClipの作成
・Animatorの作成
・BlentTreeの作成
・Addressableの使い方

# AnimationClip読み込み
読み込みはAddressableを使用します。
Resourcesディレクトリから読み込んでも良いのですが、パフォーマンスの観点から推奨されません。
このように読み込みます。
```
var animationClipIdleFront = Addressables.LoadAssetAsync<AnimationClip>("HogeAddress");
await animationClipIdleFront.Task;
```

自分の場合は、以下の8種類のAnimationClipを読み込んでいます
・IdleFront : 停止正面
・IdleBack  : 停止背面
・IdleLeft  : 停止左面
・IdleRight : 停止右面
・WorkFront : 歩き中右面
・WorkBack  : 歩き中背面
・WorkLeft  : 歩き中左面
・WorkRight : 歩き中右面
```
async Task<AnimationClipPair[]> Loader(AnimationClipPair[] clipPairs)
{
        //IdleFront
        var animationClipIdleFront = Addressables.LoadAssetAsync<AnimationClip>("HogeAddress");
        await animationClipIdleFront.Task;
        clipPairs[0].overrideClip = animationClipIdleFront.Result;
        //IdleBack
        var animationClipIdleBack = Addressables.LoadAssetAsync<AnimationClip>("HogeAddress");
        await animationClipIdleBack.Task;
        clipPairs[1].overrideClip = animationClipIdleBack.Result;
        //IdleLeft
        var animationClipIdleLeft = Addressables.LoadAssetAsync<AnimationClip>("HogeAddress");
        await animationClipIdleLeft.Task;
        clipPairs[2].overrideClip = animationClipIdleLeft.Result;
        //IdleRight
        var animationClipIdleRight = Addressables.LoadAssetAsync<AnimationClip>("HogeAddress");
        await animationClipIdleRight.Task;
        clipPairs[3].overrideClip = animationClipIdleRight.Result;
            
        //WorkFront
        var animationClipWorkFront = Addressables.LoadAssetAsync<AnimationClip>("HogeAddress");
        await animationClipWorkFront.Task;
        clipPairs[4].overrideClip = animationClipWorkFront.Result;
        //WorkBack
        var animationClipWorkBack = Addressables.LoadAssetAsync<AnimationClip>("HogeAddress");
        await animationClipWorkBack.Task;
        clipPairs[5].overrideClip = animationClipWorkBack.Result;
        // //WorkLeft
        var animationClipWorkLeft = Addressables.LoadAssetAsync<AnimationClip>("HogeAddress");
        await animationClipWorkLeft.Task;
        clipPairs[6].overrideClip = animationClipWorkLeft.Result;
        // //WorkRight
        var animationClipWorkRight = Addressables.LoadAssetAsync<AnimationClip>("HogeAddress");
        await animationClipWorkRight.Task;
        clipPairs[7].overrideClip = animationClipWorkRight.Result;
        
        return clipPairs;
    }
```

# AnimatorControllerのAnimationClipを上書きする
`animator`変数はUnityのインスペクターから設定を行ってください。
これで、AnimationClipをスクリプトから変更することができます。
```
public class PlayerController : MonoBehaviourPunCallbacks
{
    [SerializeField]
    private Animator animator;
    
    void AnimatioinClipOverride()
    {
        var overrideAnimatorController = new AnimatorOverrideController{
            runtimeAnimatorController = animator.runtimeAnimatorController
        };
        
        // ClipPairに代入し差し替え
        AnimationClipPair[] clipPairs = overrideAnimatorController.clips;
        var overRideClip = await Loader(clipPairs);
        overrideAnimatorController.clips = overRideClip;
        
        // 差し替えたOverrideControllerをAnimatorに代入
        animator.runtimeAnimatorController = overrideAnimatorController;
    }
}

```

# 注意点
`AnimationClipPair`は廃止されているクラスなので、以下のクラスとメソッドに置き換えなくてはいけません。
とりあえず動かしたいだけなら問題ありませんが、リリース版では必ず置き換えたほうがいいでしょう。

AnimatorOverrideController.GetOverrides
https://docs.unity3d.com/ja/current/ScriptReference/AnimatorOverrideController.GetOverrides.html

AnimatorOverrideController.ApplyOverrides
https://docs.unity.cn/ja/2017.3/ScriptReference/AnimatorOverrideController.ApplyOverrides.html