i-school - 3Dトップビューアクション 手順9
 以下の内容で順番に実装を進めていきます。

手順9 ーキャラクターのアニメーション遷移設定ー
 Animator 関連の機能と設定



1.Animator の機能

1.Animator と Animation


 移動用のアニメを登録し、条件に合わせて遷移(切り替え)できるように設定を行います。

 アニメーションの設定については奥が深いため、ここでは手順に必要な情報だけをピックアップして記述しています。

 また、Unity には Animator と Animation という機能があり、名前は似ていますが、異なる機能になります。
そういった名称の違いからもわかるように、間違えて覚えてしまうと認識を修正することが大変になりますので、
しっかりとわかるまで復習をして、正しい知識を覚えていってください。

 Animation は、実際にアニメーションを作成して登録する機能です。これは色々なゲームオブジェクトにおいて利用できます。
例えば、人型のゲームオブジェクト以外にも、四角い Cube のゲームオブジェクトのサイズを変えるアニメーションを作成することも出来ます。

 Animator は、作成済のアニメーションを登録し、どのように遷移(アニメーションの切り替え)させるかを制御する機能です。
プレイヤー用のゲームオブジェクトには、すでにいくつかのアニメーションが作成済ですので、今回はこちらの Animator の機能を利用します。


2.Animator コンポーネントと AnimatorController


 Unity のゲームオブジェクトは Animator コンポーネントによって、アニメーションの制御を行っています。
この項目内において、アニメーションの設定を行っている情報を AnimatorController といいます。
これは、Animator コンポーネントの Controller プロパティに AnimatorController ファイルを設定をすることで、
その AnimatorController の情報が適用されます。

 この AnimatorController ファイルでは、アニメーションとして利用するファイルや遷移の条件などを設定します。
2Dでも3Dでも、この AnimatorController ファイルを利用して、使いたいアニメーションの登録や、アニメの遷移の設定を行います。

 下記のアイコンのファイルが AnimatorController ファイルです。


<フォルダ内の AnimatorController ファイル>



 こちらのファイルは専用の Animator ビューを利用して編集を行います。


3.AnimationClip


 1つ1つのアニメーションの情報は、Animation Clip というファイルが管理しています。
例えばジャンプのアニメ、移動のアニメ、という風に、アクションの状態ごとに AnimationClip ファイルがあります。
この情報を AnimatorController ファイル内の State という部品に割り当てることによって、再生するアニメーションの設定が行えます。

 下記のアイコンのファイルが AnimationClip ファイルです。
ファイルを選択すると、インスペクターの表示も専用の内容に切り替わります。


<フォルダ内の AnimationClip ファイル>



<インスペクター>



 今回は Unitychan アセットに複数の AnimationClip がありますので、そちらを利用します。
AnimationClip は自作することも出来ます。その場合には、Animation ビューの機能を利用します。


4.ステート(State) と トランジション(Transition)


 State 同士は矢印によってつなげていくことができます。この矢印をトランジションといいます。
トランジションのある State 同士のみが遷移を行って、再生するアニメーションが切り替わるようになっています。


<ステート>



<トランジション>





 これが一般的なアニメーションの設定です。
そのほかにも BlendTree を利用した方法もありますが、今回は利用していません。


2.Animator ビューを追加する


 Unityの左上にあるメニューの中から Window => Animation => Animator を選択してください。
SceneビューやGameビューのような Animatorビューがエディターのレイアウト内に追加されます。


Animatorビュー(参考画像。この状態で表示される訳ではありません)



 Animatorビューの操作ですが、マウスのホイールボタンを押しながらマウスを移動させることによって、Animatorビューの中を上下左右に移動できます。
またホイールを回転させると、ビュー内のズームイン・ズームアウトが出来ます。



 アニメーションの切り替えの設定は、このAnimatorビューの中で行います

 Animator ビューではすべての AnimatorController の設定を行います。
そのため、設定したいファイルを選択して、表示内容を切り替えて作業を行います。

 AnimatorController の設定を行いたい場合、対象となる AnimatorController ファイル自体か、
その AnimatorController がアサインされているゲームオブジェクトのいずれかを選択している必要があります。

 今回であれば、ヒエラルキーにあるプレイヤー用のゲームオブジェクトを選択した状態にしてください。(インスペクターに表示されている状態)
この状態になると、ゲームオブジェクトにアタッチされている、Animator コンポーネント内にある、Controller プロパティの情報が Animator ビュー に表示されます。


Animator コンポーネント



 もしも Animator ビューに、設定したい AnimatorController の内容が表示されない場合には、
このように AnimatorController がアサインされているゲームオブジェクトを選択してください。


3.プレイヤー用のゲームオブジェクトの Animator コンポーネントに AnimatorController をアサインする

1.AnimatorController の確認


 プレイヤーとして利用している Unitychan アセットには最初から AnimatorController や AnimationClip が用意されています。
今回はこちらの情報を利用して、編集を行っていきます。

 ヒエラルキーでプレイヤー用のゲームオブジェクトを選択し、インスペクターより Animator コンポーネントを確認します。
Controller の項目が None になっている場合、AnimatorController がアサインされていませんので、
こちらに、下記のパスにある UnityChanLocomotions という名称の AnimatorController ファイルをドラッグアンドドロップしてアサインしてください。

 Controller の項目が None でなければ、アサインは不要です。


<ファイルのパス>
Assets/UnityChan/Animators/UnityChanLocomotions.controller


<ファイルのフォルダ>


 この設定を行うことにより、プレイヤー用のゲームオブジェクトのアニメーションに
AnimatorController 内で設定した情報を利用できる状態(紐付けしている状態)になります。

 続いて、Animator ビューを利用し、アニメーションの各種設定を行います。


2.Animator ビューに、設定したい AnimatorController の情報を表示する


 Animator ビューが Unity エディター内に追加されていると思います。
ただし、先ほどもお伝えしたように、この Animator ビューは選択している AnimatorController の情報のみが表示されますので、
実際に自分が設定や編集を行いたい AnimatorController を、都度、選択し、Animator ビューに表示させる必要があります。

 プレイヤー用のゲームオブジェクトにアサインした Animator コンポーネント内の AnimatorController の部分をダブルクリックしてください。
そうすることで Animator ビューを再度表示し、編集する画面に移動できます。覚えておくとよい操作の1つです。



 なお、AnimatorController ファイルは、新しく作成することもできます。
C# スクリプトを作成する場合と同様で、ファイルを作成したいフォルダ内で右クリックをしてメニューを表示し、
その中にある AnimatorController を選択すれば、新規作成できます。


<新規作成の方法>



 続いて、各種の設定を行います。


4.AnimatorController 内のステートの設定・確認を行う


 新規に AnimatorController ファイルを作成した場合、ステートは登録されていません。
ただし、今回は、すでに用意されている AnimatorController ファイルを編集して利用しますので、
すでにたくさんのステートが登録されています。

 この中から、不要なステートを削除し、各ステート内に登録されているアニメーションの内容確認を行います。


1.不要なステート(State)の削除を行う


 UnityChanLocomotions ファイルには、最初から複数のステートとトランジションが登録されています。
このうち、ステートは Unity が用意している3つのステートと、それ以外のステートの2種類に大きく分類されます。


<Unity が用意しているステート>
 ・Entry
 ・Exit
 ・AnyState

 この3つは削除できません。この3つはまた、AnimatorController ファイルを新規作成した場合にも自動的に追加されています。



 上記の3つ以外のステートは、自動的には作成されないステート、つまり、自作した(アセットで用意している)ステートになります。

 上記の3つのステート、そして Idle ステートと Locomotion ステートのみの5つを残し、他のステートは削除してください。
Idle ステートは待機用(移動していない時)のアニメーション、Locomotion ステートは移動用のアニメーションです。

 ステートの削除は、ステートをクリックして選択した状態でキーボードの Delete ボタンで削除できます。
あるいは、ステート上で右クリックするとメニューが開きますので、その中にある Delete コマンドで削除できます。


<ステートのメニュー>



 このステートの削除作業を行い、下記の画像のような5つステートだけが残っている状態にしてください。
トランジション(矢印)については、後程設定しますので、この状態になっていなくても問題ありません。


<利用するステートのみにする>




 ステートの削除を行っても、アニメーションのファイル自体が削除されることはありません
あくまでも、この AnimatorController 内での利用をしないようにする、という意味での削除となります。
安心してステートの削除をしてください。


2.ステート内の Motion(AnimationClip)を確認する


 ステートには1つだけ、AnimationClip をアサインして登録することができます。
つまり、1つのステートにつき、1つのアニメーションを登録することが出来るようになっています。
 
 AnimationClip をアサインする場所は、ステート内の Motion 項目になります。
すでに最初からアサインされていますので、ここでは確認をおこなってください。
アサインされている AnimationClip ファイルをクリックすると、どのファイルが紐づいているのか、確認できます。

 今回利用する2つのステートを順番に選択し、インスペクターの内容が下記のようになっていることを確認してください。
もしも Motion 部分のアサインが抜けてしまっている場合には、この画像のようになるように、AnimationClip ファイルをアサインしてください。


Idle




Locomotion



 以上でこの手順は完了です。


5.Animator ビューの Parameters で遷移条件を作成する


 先ほど確認していただいたように、アニメーションのファイルである AnimationClip ですが、
こちらは ステート という情報内の Motion 項目に1つだけ登録することが出来ます。

 そのため、アニメーションの切り替えとは、各ステート間を切り替え(遷移)して、アニメの切り替えを行っています。

 この機能を実現するため、ステートには遷移するための条件を設定しておくことが出来ます。(無条件も可能です)
例えば、どういった状態になったときに、このアニメの再生をしてほしい、という情報を Animator ビュー内で事前に登録しておくことにより、
その条件式をスクリプト内で制御し、アニメーションの再生と同期させることが出来るようになっています。



 今回は、キャラの移動のキー入力に合わせて、移動用のアニメーションと待機用のアニメーションの再生を制御する設計にしますので、
キー入力に合わせて 数値の情報を条件式として用意するようにします。キー入力があるときにはこの数値が上がり、ないときにはこの数値を 0 にします。

 こういった条件式を作成するために、AnimatorController には Parameter(パラメータ) が用意されています。

 パラメータとは、アニメーションの切り替え用の変数のようなものです。
データ型と名前とをセットで作成することが出来ます。

 このパラメータを作成しておくことで、各ステートの切り替え条件として Parameters を設定することが出来ます。


Parameters 画像




 パラメータには4つの種類があります。今回は Float 型を新しく作成します。
Animator ビューのすぐ下に Parameters という項目がありますので、その中にあるプラスボタンを選択し、Float を選択してください。

 Float を選択すると、Parameters の中に新しいパラメータが作成されますので、名前を Speed に変更してください。
なお、Float 型の場合、Speed という名前の右側に 0 という数字が表示されます。(この部分が型によって変化し、種類の特定が容易になっています)


Parametersにパラメータを追加した後の画像(並び順は順不同です)




 この Parameters の値をスクリプトで制御して、ステートを切り替え、アニメーションの切り替えを行います。

 ただし、Parameters はあくまでも条件を作成するための変数のようなものです。
この値を利用した条件式を、次の手順のトランジションに設定する必要があります。


6.ステート間のトランジションの設定を行う

1.ゲーム開始時に再生されるステートの設定を行う


 ゲームを実行すると、自動的に Entry からステートの切り替えがスタートします。
そのため、Entry ステートに設定したトランジション(矢印)の先にあるステートが、最初に実行されるアニメーションになります。

 今回は Locomotion ステートをゲーム開始時に実行したいので、そのための設定を行います。
 
 Entry ステートを選択した状態で右クリックをしてメニューを開き、Set StateMachine Default State を選択します。
このコマンドを実行することで、ゲーム開始時の初期のアニメーション用のステートを設定できます。

 Entry ステートを始点とした矢印が表示されますので、これを Locomotion ステートに矢印を繋げて左クリックして決定してください

 これでゲーム開始と同時に Entry からトランジションでつながっているステートのアニメーションが再生されるようになります。


最初に実行するアニメーションの設定


 続いて、2つのステートのトランジションの設定を行います。


2.Idle → Locomotion ステートへのトランジションの設定を行う


 Idle ステートから Locomotion ステートへと伸びているトランジション(矢印)をクリックしてください。
このトランジションがない場合、Idle ステートを選択した状態で右クリックをしてメニューを開き、Make Transiton を選択してください。
Idle ステートを始点とした矢印が表示されますので、これを Locomotion ステートに矢印を繋げて左クリックして決定してください

 矢印をトランジションといいます。
トランジションを左クリックで選択すると、画像のように矢印が青くなり、選択されている状態になります。
またインスペクターに、トランジションの情報が表示されます。この状態になると、トランジションの設定を行えるようになります。


Idle ステートから Locomotion ステートへのトランジションの選択(青い矢印が選択しているトランジション)




 トランジション内には Conditions という項目があり、ここにアニメーションとアニメーションの遷移条件を設定することが出来ます。
Conditions の右下にあるプラスボタンを押してください。上に項目が追加されて、先ほど作成したパラメータから選択出来るようになります。

 Speed を選択して設定してください。(すでに設定済である場合は確認してください)
Speed を選択すると、このパラメータが Float 型であるため、値の設定が出来ます。
ここでは Greater とし、値の条件を 0.1 としてください。

 この条件では、スクリプトから Float 型の命令で "Speed" が実行されたとき、ステートを idle => Locomotion に遷移させるというものです。
その際、Speed のパラメータに対しての値が 0.1 よりも大きいかどうか、を判定の条件としています。
このように Conditions にパラメータの条件を設定しておくことで、スクリプトから遷移命令を出してアニメーションを遷移させることが出来るようになります。


Conditions にパラメータの条件を設定




 また Has Exit Time という項目がありますので、そちらのチェックを外しておいてください
このチェックが外れている場合、遷移前のアニメーションが再生され終わるのを待たずに、遷移先のアニメーションを割り込ませて再生させることが出来ます。
つまり、待機状態から移動状態への遷移命令が来たら、待機アニメーションの途中であってもそのアニメーションを中断して、移動のアニメーションが再生されます。

 Has Exit Time のチェックが外れていない場合には、遷移前のアニメーションが再生されるのを待ってから、遷移先のアニメーションが再生されます
そのため、スクリプトから移動アニメーションへの遷移命令が来ても、待機アニメーションを再生してから移動のアニメーションが再生されるため、
移動の処理とアニメーションの再生処理がずれてしまい、挙動がちぐはぐになります



 最後に Settings 内にある TransitionDuration の値も 0.02 前後に調整してください。
この値を調整すると、すぐ下にあるゲージも一緒に動きます。ゲージを直接ドラッグアンドドロップで操作も出来ます。

 TransitionDuration の値が小さいほど、前のアニメーションから素早く遷移が発生します。


TransitionDuration



 いずれの項目についても、実際にどのような違いがあるか、文章だけではなく実際に自分でチェックのある、なしの両方で確認して学習しておきましょう



 トランジション表示中のインスペクターの下部には Preview ウインドウがあり、その中には再生ボタンがあります。
再生ボタンを押すことでどのようなアニメーションを再生するか、実際のモデルとなるゲームオブジェクト(今回は Unitychan)で確認できます。


Preview ビュー



 ここに Unitychan のモデルが表示されていない場合には再生を実行できません
その場合には、ヒエラルキーにある、再生したい対象のゲームオブジェクトを Preview ウインドウに対してドラッグ&ドロップしてください。
この手順を行うことで、Preview ウインドウにモデルが設定され、再生ボタンが押せるようになります。


3.Locomotion → Idle ステートへのトランジションの設定を行う


 先ほどとは逆に、今度は Locomotion ステートから Idle ステートへのトランジションを選択してください。
このトランジションがない場合には、先ほどと同じように新しくトランジションを作成してください。


Locomotion ステートから Idle ステートへのトランジションの選択(青い矢印が選択しているトランジション)



 こちらも Conditions にパラメータを設定し、遷移の条件を作成します。

 先ほどと同じように Speed を選択して設定してください。(すでに設定済である場合は確認してください)
Speed を選択すると、このパラメータが Float 型であるため、値の設定が出来ます。
今回は先ほどとは違い、 Less とし、値の条件を 0.1 としてください。

 Less とすることで、Speed の値が 0.1 以下とする命令が実行された際に遷移が発生する条件式となります。


Conditions にパラメータの条件を設定




 こちらの Has Exit Time チェックは、入れたままにしておいてください
理由は先ほどの設定と逆に、移動のアニメーションが再生されて、終わるのを待ってから、待機のアニメーションを再生したいためです。
そのように設定しておかないと、移動を止めた瞬間に急に待機のアニメが始まってしまい、こちらもちぐはぐなアニメの遷移になってしまいます。
 
 移動を停止したら、移動のアニメもゆっくりと歩幅を止めながら待機のアニメに遷移するようにしてください。
実際に自分でアニメの遷移の状態を見ながら、問題となる部分はないか、おかしな挙動をしていないか、を確認することが大切です



 以上でトランジションの設定は完了です。
AnyState と Exit のステートはまだ利用しませんので、どの位置に配置しておいても問題ありません。


完成図



 以上で Animator ビューでの設定は完了です。

 Animator ビュー、および、トランジションなどの設定は難しく、慣れが必要です。
何回も繰り返し設定をしながら覚えていくようにしてください。


7.プレイヤー用ゲームオブジェクトの Animator コンポーネントの確認を行う


 作成されている AnimationClip には、その場で再生するだけではなくて、再生にあわせてゲームオブジェクトの移動・回転を伴うものがあります。
その場合、アニメーションを再生するたびにゲームオブジェクトが自動的に移動・回転してしまうことになります。
今回のプレイヤーのアニメーションも、Idle アニメーションと Locomotion アニメーションの双方で、この移動を伴うアニメーションになっています。

 この設定は Animator コンポーネントの Apply Root Motion 項目によって設定されます。
この項目にチェックが入っていると、AnimationClip に設定されているゲームオブジェクトの移動・回転が発生します。
チェックが外れていると、その場でアニメーションの再生のみ行います。

 今回はスクリプトからのみゲームオブジェクトの移動・回転を行いたいので、この Apply Root Motion のチェックを外します


インスペクター画像



 スクリプトからのみ移動を制御したい場合、この Apply Root Motion のチェックを外しておくことで、
アニメーション再生時に移動・回転をさせないでアニメーションのみ再生することが出来ます。
(ただし、一部のアニメーションクリップはこのチェックを外してあっても強制的に移動するものもありますので、注意してください。)

 今後自分でプロジェクトを作成する場合には、実装したい内容に応じて使い分けてください。


<参考サイト>
いんでぃーづ 様
Unity : アニメーションとGameObjectの位置を同期させたい時に気をつけること



 以上で Animatorビューとステート遷移の設定は完了です。
次の手順で、アニメーションを制御するスクリプトを作成し、ステートからステートへの遷移の命令を出して制御する処理を追加します。

 またこのステートの制御機能を利用し、アニメーションと実際のゲーム上での移動の処理とを同期させます。
プレイヤーが移動しているときには、移動用のアニメーションを再生するように制御します。



 => 次は 手順10 −移動処理と移動アニメーションの同期− です。