2020/11/09
今回はUnityのアニメーションに関するお話です。
ずーっと気になっていたのに目を背けていた「下半身と上半身で別々の動きをさせたい!」場合のやり方についてになります。
ちょうど最近開催されていた「Unity1週間ゲームジャム」で使うことになったので、備忘録も兼ねて紹介します。
今まで「アバターが人型(Humanoid)でないとできない」と勝手に思い込んでいたのですが、別にそんなことはなかったです。
動かすboneを手動で設定する必要があるので人型と比べて若干手間ですが、それだけでした。
手順
ゲームジャムで使用した「爆弾を構えている最中に移動」の場合を例にとって解説します。
AvatarMaskの作成
まずは上半身用のAvatarMaskを作成します。アセットで右クリックから「AvatarMask」を選択します。
Transformの方を開き、キャラクターのAvatarを指定します。
Blenderからインポートしたのであれば、モデルを展開すると後ろの方にあるかと思います。
次にAvatarMaskで動かすboneを設定します。
一度「Toggle All」ですべてのチェックを外し、上半身のboneのみにチェックを入れていきます。
私のように命名規則が雑な人には難関になりえる部分ですが、気合で上半身だけチェックを入れてください。
分からない場合はBlenderを開いて確認しましょう。boneの名前はDataプロパティの「Display→Names」にチェックを入れることで表示できます。
AnimatorControllerのレイヤー追加
キャラクターに設定しているAnimatorControllerに新しいレイヤーを追加します。
歯車マークをクリックして設定を開きます。
先ほど作成したAvatarMaskを設定し、またBlendingが「Override」になっていることを確認して追加します。
次に追加したレイヤーにステートを追加します。
今回上半身を別々で動かしたいのは構えている時のみなので、「何もしない」ステートと「構える」のステートを用意します。それぞれ「None」と「Stand」というステート名にしました。
ポイントはNoneステートのアニメーションを文字通りnone (未設定) の状態にしておくことです。
未設定であればベースレイヤーのアニメーションを上書きすることはないので、追加レイヤーは何も影響を与えません。
なので構える時以外は追加レイヤーのステートをNoneステートのままにしておくことで、不必要に上書きしてしまう心配がなくなります。
スクリプトのアニメーション制御
「歩きながら構える」場合、ベースレイヤーは移動ステートのまま、追加したレイヤーのみを構えるステートに切り替えます。
Animator.Play()を使って遷移している場合、レイヤー番号を指定できるオーバーロードがあるので、そちらを使いましょう。
https://docs.unity3d.com/ja/2018.3/ScriptReference/Animator.Play.html
遷移条件にAnimatorControllerのパラメータを使っている場合、パラメータは全レイヤー共通のようなので、追加レイヤー側でも同じように遷移条件を設定してください。
今回の例ではAnimator.SetBool()
を使用しました。
動作テスト
あとはゲーム上で動かしてみます。
ベースレイヤーは待機と移動のアニメーション、追加レイヤーは上半身で爆弾を構えるアニメーションを行います。
下半身の移動と上半身の構える動作が独立して動いているのが分かるかと思います。