リロードのアニメーションを作ってアニメーターコントローラーに設定してみました。
まずBlenderで作ったアニメーションをインポートして、アニメーターコントローラーの新しいステートにアタッチしました。アニメーションはブレンドされるので、他のアニメーションとの中間のアニメーションを作る必要はありません。
このステートには、銃に弾がないときのステートと銃を構えているときのステートから遷移を向けます。どちらもBool型のパラメーターがtrueになるとすぐに遷移が始まるように、Has Exit Timeのチェックが外れています。
また、アニメーションが自然にブレンドされるように、Transition Durationの長さをそれぞれ変えました。
そして、リロードが1回再生されると構えるステートに自動で遷移します。
パラメーターの切り替えはこのアニメーターコントローラーに追加したスクリプトで行います。
// OnStateUpdate
if (Input.GetKeyDown(KeyCode.R))
{
int reload = bullets_load_cap - bullets_load; // リロードしたい弾数
// リロードする空きがあって、予備弾数が0でないとき
if (reload != 0 && bullets_spare != 0)
{
animator.SetBool("Reload", true);
animator.SetBool("NoAmo", false);
// 十分な予備があるとき
if (bullets_spare >= reload)
{
bullets_load += reload; // 満タンにする
bullets_spare -= reload; // その分予備から引く
}
// ないとき
else
{
bullets_load += bullets_spare; // 予備弾数をすべて加える
bullets_spare = 0; // 予備弾数を0にする
}
}
}
// ---
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
// 攻撃可能なステートを出たら攻撃不可能にする
if (stateInfo.IsTag("Attackable"))
{
attackable = false;
}
else if (stateInfo.IsName("Reload"))
{
animator.SetBool("Reload", false);
}
}
Rキーを押したときに銃に空きがあって、予備の弾を持っていれば、リロードのステートへ遷移するためのパラメーターをtrueにします。そして、リロードのステートから出た時にこれをfalseに戻します。
これでリロードにアニメーションを付けられました。