Unityのアニメーションシステムを詳しく解説3:アニメーションの再生・切り替え方法は?

要約: [長い記事の警告、最初にブックマークすることをお勧めします] モデルと複数のアニメーションを用意した後、Unity でそれらの再生と切り替えを制御するにはどうすればよいですか? この記事では、Unity の Animator モジュールのワンストップ分析について説明します。

紅流アカデミーはあなたを数歩速くします。こんにちは、私は Dazhi から Unity を学んでいる新参者です。私の名前は Xiaoxin です。ここ数週間、一緒にアニメーション システムを復習 (yu) 学習 (xi) するために来ました。

Dazhi: 「Xiaoxin、Unity のアニメーション ソースをまだ覚えていますか?」

Xiaoxin: 「Unity での制作と外部インポートの 2 種類があります。そうそう! コードを使用してアニメーションを書くこともできますが、私には無理です、ふふ。」

Dazhi: 「そうです。最初の 2 日間で学んだのは主に、アニメーション システム全体の基本要素である、アニメーション クリップ、つまりオブジェクトに対応するアニメーションの内容でした。今日は Animator の学習に焦点を当てます。」アニメーション クリップをビデオに例えると、Animator は複数のビデオの再生や切り替えなどを制御するビデオ プレーヤーです。

アニメーターコンポーネント

オブジェクト上でアニメーションを再生するには、Animator コンポーネントをオブジェクトに追加する必要があります。

Animator の非常に重要な属性はControllerです。これはAnimator Controllerと呼ばれるリソースを指します。このリソースはファイルの形式でプロジェクトに保存され、アニメーションのさまざまな状態と状態間の切り替えルールが保存されます。この記事の後半で詳しく説明します。

アバター設定で使用されるボーン ノード マッピング。

[ルート モーションを適用] は、ルート ノードのモーションを適用します。有効にしない場合、アニメーションの再生時にルート ノードが所定の位置に残るため、スクリプトを使用してオブジェクトの動きを制御する必要があります。有効にすると、アニメーションにモーションがある場合、アニメーション内のモーションがルート ノードに変換され、ルート ノードが移動します。(通常、キャラクター/動物のモーション アニメーションに使用されます)

Update Mode では、 Animator の更新のタイミングとタイムスケールの設定を設定します。

  • Normal Animator は通常の方法で更新されます (Update 呼び出しが更新されるため、タイムスケールが減少すると、アニメーションの再生も遅くなります。タイムスケールの具体的な意味と使用法については、後で詳しく説明します)
  • Animate Physics Animator は物理システムの周波数に応じて更新され (後で詳しく説明するFixedUpdate 呼び出しに従って更新されます)、物理的なインタラクションに適しています。たとえば、物理プロパティを持つキャラクターが他のオブジェクトを押すことができます。その周りに。
  • スケールなし時間は、タイムスケールに関係なく、Update 呼び出しに従って更新されます。通常、UI インターフェイスに使用されます。タイムスケールを使用してゲームを一時停止すると、インターフェイスは通常のアニメーションを維持します。

カリングモードクロッピングモード

  • Always Animateアニメーションは、オブジェクトが画面から切り取られてレンダリングされない場合でも実行され続けます。
  • Cull Update Transformsオブジェクトが表示されない場合は、Retarget、IK、および Transforms の更新を無効にします (フォローアップのアニメーションの高度なモジュールで詳しく説明します)。
  • Cull Completely は、オブジェクトが表示されていない場合にアニメーションを完全に無効にします。

アニメーターコントローラー

Animator Controller はAnimator コンポーネントに必要なリソースです。このリソースはファイルの形式でプロジェクトに保存され、アニメーションのさまざまな状態と状態間の切り替えルールが保存されます。

上の図には 2 つの Animator Controller ファイルがあります

通常、オブジェクトには複数のアニメーションがありますが、Animator Controller を使用すると、アニメーションとアニメーション間の切り替えを簡単に管理できます。たとえば、キャラクターには歩く、走る、ジャンプする、しゃがむなどのアニメーションがあり、アニメーター コントローラーを使用して簡単に管理できます。ただし、アニメーションが 1 つしかない場合でも、アニメーションを再生するには Animator コンポーネントをアニメーション オブジェクトに追加する必要があります。

Dazhi は以前、PlayableAPI を使用して Animator Controller をバイパスしてアニメーションを再生できると述べました。

Animator Controller は、State Machine (ステート マシン) と呼ばれる技術を使用して状態を管理し、状態間の切り替えを行います。

StateMachine ステートマシン

ステートマシンはState(状態)とTransition(遷移)から構成されます。State は状態を表します。Animator Controller では、State にはアニメーション、サブステート マシン、またはハイブリッド ツリーを含めることができます (これについては後で詳しく説明します)。遷移は、状態間の切り替え条件を設定するために使用され、通常、ある状態から別の状態に切り替えるには 1 つ以上の条件が存在します。

Animator ウィンドウでは、状態と遷移を視覚化できます。

アニメーターコントローラーの作成¶

Animator Controller リソースを作成するには、いくつかの方法があります。

  • Unity でアニメーション クリップを作成するときに、選択したゲームオブジェクトに Animator コンポーネントが存在しない場合、Animator コンポーネントが自動的に追加され、Animator Controller ファイルがプロジェクト内に作成されます (アニメーション クリップ ファイルと同じディレクトリ)。
  • アニメーション クリップをオブジェクトにドラッグするときに、ドラッグしたオブジェクトに Animator コンポーネントが存在しない場合、Animator コンポーネントが自動的に追加され、Animator Controller ファイルがプロジェクト内に作成されます (アニメーション クリップ ファイルと同じディレクトリ)。
  • 次の図に示すように、Animator Controller ファイルはプロジェクト ウィンドウで手動で作成できます。

アニメーターコントローラーファイルの作成

アニメーターコントローラーの編集

Animator Controller ファイルをダブルクリックして、ファイルを編集するための Animator ウィンドウを開きます。

今日は、インポートしたアニメーションを再生する方法を簡単に学習します。その後のアニメーションの高度なモジュールでは、Animator Controller の高度な機能について詳しく説明します。

Animator Controller がプロジェクト ウィンドウで直接作成された場合、アニメーションは含まれません。以下に示すように:

グラフには 3 つのノードが含まれています。

入口入口。アニメーション ステート マシンはこのノードから開始され、トランジションに従ってデフォルト状態に入ります。

任意の状態 任意の状態。任意の状態から特定の状態に遷移するために使用されます。例えばシューティングゲームでは、弾が当たるとどんな状態であっても地面に倒れて死んでしまいます。

Exit はステート マシンを終了します。これは通常、ネストされたステート マシンの終了に使用されます (高度なアニメーション モジュールについては後ほど説明します)。

ステータスを追加

空白スペースを右クリックして Empty State を追加する、アニメーション クリップ ファイルを Animator ウィンドウにドラッグして State を追加します。

現在プロジェクト ウィンドウでアニメーション クリップが選択されている場合は、上図の [選択したクリップから] を使用してステートを作成することもできますが、図に示すように、クリップをアニメーターに直接ドラッグしてステートを作成する方が簡単です。下。

ドラッグ アンド ドロップして State.gif を追加します

最初に作成された状態はデフォルトでオレンジ色であり、デフォルトの状態を表します。Entry からオレンジ色の State を指す黄色の矢印があります。Animator コンポーネントは最初に新しい状態を再生し、新しい状態にアニメーションがある場合は、対応するアニメーションも再生します。

このとき、このシーンを再生するとオブジェクトを設定するとデフォルトのStateのアニメーションが再生されます。

状態の設定

各状態にはアニメーション クリップを含めることができ、Animator コンポーネントが配置されているオブジェクトは、この状態にあるときにアニメーションを再生します。状態を選択すると、インスペクターに次の内容が表示されます。

モーションにはAnimation Clipを設定することができ、Animation Clipから作成したアニメーションであれば、すでにここにアニメーションが存在しているはずですが、プロジェクトからアニメーションを選択することもできます。

スピードアニメーションの再生速度

Multiplier乗数、パラメータを使用してアニメーションの再生速度を制御でき、アニメーションの最終的な再生速度は Speed Multiplier になります。Animator のパラメータとコード内でのパラメータの制御方法については後述します。

正規化時間は 0 ~ 1 の範囲で単位化された時間であり、パラメータで制御する必要があります。

ミラーミラーアニメーション。パラメータで制御することも可能です。

サイクル オフセットサイクル オフセット。ループを同期するために使用できるアニメーション。オフセットには単位化された時間が使用され、範囲は 0 ~ 1 です。パラメータを使用して制御することもできます。

Foot IKはヒューマノイド アニメーションにのみ使用されます。キャラクターの足が逆運動学を使用するかどうか。

Write Defaults が、State で使用されていないパラメーターをデフォルト値に初期化するかどうか。

Transitionsこの状態が参加する状態遷移。以下で詳しく説明します。

パラメーター

パラメータの概念については上で説明しましたが、パラメータとは何でしょうか?

アニメーター コントローラーのパラメーターは、トランジションの切り替えを制御する条件として使用でき、また、State のいくつかのプロパティなど、上でパラメーター化できるプロパティを制御することもできます。

州はパラメータを属性値のソースとして使用できます

アニメーター コントローラーのパラメーターはコードを通じて制御でき、アニメーター ステート マシン全体の動作を制御します。

パラメータには次の 4 種類があります。

  • Int整数型
  • Float浮動小数点(10 進数)型
  • Bool true または false (true または false、論理的な判断に使用)、インターフェイス上にチェック ボックスとして表示されます。
  • Triggerトリガー。Bool に似ていますが、このパラメーターを使用した後、遷移は自動的に false 状態に設定されます。これはインターフェイス上に円形のボタンとして表示されます。

遷移

遷移は状態間の切り替え条件を表します。通常、ある状態から別の状態に切り替えるには 1 つ以上の条件があります。

トランジションの追加

状態を右クリックし、ポップアップ メニューで [遷移の作成] を選択して、他の状態への遷移を作成します。

トランジションを増やす

トランジションを表す矢印をクリックすると、インスペクターでこのトランジションの詳細が表示されます。遷移のソース状態 (どの状態からのものか) を選択すると、状態のインスペクターでこの遷移の特定の情報を確認することもできます。

トランジションには、現在選択されているトランジションが表示されます。後ろにはソロとミュートを含む 2 つのチェック ボックスがあります。

  • ソロ2 つの状態間に複数のトランジションがある場合、このオプションをチェックすると、選択したソロ トランジションのみが有効になります。他のトランジションは無効になります。

たとえば、Transition1 が Solo に設定されている場合、ソース ステートからデスティネーション ステートへの 3 つのトランジションのうち 1 つだけが有効になります。

  • ミュートでこのオプションをオンにすると、トランジションが無効になります。ソロとミュートの両方が選択されている場合は、ミュートが最初に有効になります。

名前フィールド名ボックス。上の図に示すように、遷移には名前を付けることができます。これは、2 つの状態間の複数の遷移を区別するのに非常に役立ちます。

「終了時間があるかどうか」には終了時間の条件があります。終了時刻は特殊な遷移条件であり、後述するパラメータに依存せず、設定された終了時刻を条件として状態遷移を行います。

設定遷移の一部のパラメータ設定。

  • 終了時間 [終了時間あり]がチェックされている場合、このパラメータを設定してアニメーション終了の単位時間を設定できます。例えば ​​0.75 に設定するとアニメーションが 75% に達した時点で true となることを意味し、他に条件がなければそのまま次の State に切り替わります。

    終了時間が 1 未満の場合、状態が対応する位置にループするたびに条件が true になります (アニメーションがループするように設定されているかどうかに関係なく、状態は常にループされます)。たとえば、最初の再生が 75% に達し、2 回目の再生が 75% に達すると、終了条件が true になります。

    終了時間が 1 より大きい場合、条件は 1 回だけチェックされます。たとえば、終了時間が 3.5 の場合、状態のアニメーションは 3 回ループした後の 4 回目の 50% に達したときに true になります。

  • [固定期間]がチェックされている場合、以下の[トランジション期間]パラメーターの単位は秒ですが、チェックされていない場合、パラメーターはパーセンテージとして使用されます。

  • 移行期間移行の移行時間。2 つの状態が遷移するとき、通常、ある状態から別の状態に瞬時に遷移するのではなく、スムーズにブレンドされます。このプロパティは、スムーズ ブレンド時間を設定することです。移行時間は、下の画像の 2 つの青い矢印で確認できます。

  • Transition Offsetターゲット ステートの再生が開始される時間オフセット。たとえば、0.5 に設定すると、次のステートに切り替えるときに 50% の位置から再生が開始されます。

図のように 0.5 に設定すると、次の State は 50% から変換を開始します。

  • 2 つのパラメータ「割り込みソース」「順序付けされた割り込み」を使用して、遷移の割り込みを制御できます。以下、詳細を説明する。

遷移図

上記のパラメータは値を手動で変更できるだけでなく、遷移図を通じてプレビューして変更することもできます。

条件

遷移には、1 つの条件を含めることも、複数の条件を含めることも、条件を含めないこともできます。

[条件] に条件がなく、[終了時刻あり] がチェックされている場合、終了時刻が状態終了の条件として使用され、終了時刻に達すると次の状態に切り替わります。

1 つ以上の条件がある場合、次の状態に切り替えるには、それらの条件が同時に満たされる必要があります。

条件には次のようなものがあります。

  • 等価/不等判定、パラメータが定数と等しい/等しくない場合に true (int、float、bool 型パラメータ)
  • パラメータと定数(int、float型パラメータ)の比較判定、比較結果
  • トリガー、トリガーがアクティブな場合は true

[終了時間あり]がチェックされており、遷移に 1 つ以上の条件がある場合、遷移は次の状態に切り替える前に同時に終了時間を満たす必要があり、条件がすべて true である必要があります。

遷移には少なくとも 1 つの条件が必要です (「終了時刻あり」を条件として使用できます)。そうでない場合、遷移は無視されます。

【選択された読み物】遷移中断

前述したように、2 つのパラメーター[割り込みソース][順序付き割り込み]を使用して、遷移の割り込みを制御できます。では、遷移割り込みとは正確には何でしょうか?

一般に、アニメーション システムの遷移は中断できません。遷移が 1 つの状態から別の状態に切り替わり始めると、それを中断する方法はありません。大西洋横断便の乗客のように、目的地に到着するまで座席に快適に座り、気が変わることはありません。ほとんどのユーザーにとっては、これで問題ありません。

ただし、トランジションをより詳細に制御する必要がある場合は、ニーズに合わせてさまざまな方法でアニメーション システムを構成できます。現在の目的地に満足できない場合は、操縦席に飛び乗って、飛行中に計画を変更することができます。これにより、より柔軟なアニメーション制御が可能になりますが、複雑な中断で道に迷う可能性も高くなります。

いくつかの例を使用して割り込みを詳しく見てみましょう。A ~ D のラベルが付いた 4 つの状態があり、各遷移の条件としてトリガーを使用する、非常に単純なステート マシンから始めます。

デフォルトでは、A から B への切り替えがトリガーされると、ステート マシンは B への切り替えを開始し、B に切り替える前に変更することはできません。ただし、 A->B の遷移の中断ソースプロパティが [なし] から [現在の状態] に切り替えられた場合、A から B への切り替えは、 A 上のいくつかのトリガーによって中断される可能性があります。

なぜ一部だけなのでしょうか?順序付き中断属性もデフォルトでチェックされているためです。これは、現在の遷移よりも優先度の高い遷移のみを中断できることを意味します。ステート A を選択し、インスペクターで表示します。A -> C の優先順位が A -> B よりも高いことがわかります。これは、A -> C のみが A -> B の変換を中断できることを意味します。

A->B トリガーをアクティブにして、すぐに A->D トリガーをアクティブにしても、A から B への遷移は中断されません。ただし、A->B トリガーをアクティブにして、すぐに A->C トリガーをアクティブにすると、A から B への遷移は中断され、代わりに C に切り替わります。

アニメーション システム内では、アニメーションが中断されたときの状態が記録され、中断された状態から新しいターゲット アニメーションにブレンドされます。

Ordered Interruption属性をチェックしないとどうなりますか? A->C と A->D は両方とも、A -> B の遷移を中断できます。ただし、A->C トリガーと A->D トリガーが同じフレームでアクティブ化された場合、A->C の優先順位が高いため、A->C が最初にアクティブ化されます。

A→Bの割り込み元属性をNext Stateに変更すると次の状態になります。A->C および A->D は A -> B を中断できません。A->B トリガーをアクティブにし、すぐに B->D トリガーをアクティブにすると、A から B への遷移は中断され、代わりに D に切り替わります。

B のトランジションの順序も重要です。ただし、この時点では、順序付き割り込み属性はチェックできません (A -> B は状態 A にありますが状態 B にはないため、B の並べ替えには参加しません)。B のトランジションの順序によって、同時にトリガーされた場合にどのトランジションが使用されるかが決まります。たとえば、下図のシーケンスで、B->D と B->C が同じフレーム内でトリガーされた場合、B->D のトランジションが実行されます。

完全な制御が必要な場合は、割り込みソースのプロパティを「現在の状態から次の状態」または「次の状態から現在の状態」に設定できますこれら 2 つの値に設定すると、状態 A と状態 B の両方の遷移が考慮されます。たとえば、設定は次のとおりで、現在の状態から次の状態が選択されています。

A から B に切り替えるときに、A->C、A->D、B->C、および B->D が同時にアクティブになったらどうなりますか?

順序付き割り込みが選択されている場合、A->D は最初に無視できます (A->B よりも優先順位が低いため)。次に、最初に現在の状態 A を検討し、次に A->C が勝ち、次の状態 B を考慮する必要さえありません。

同じ構成で B->C と B->D のみがアクティブ化される場合、B->D の優先順位が B->C よりも高いため、B->D が優先されます。

まとめ

上記では、説明のための例として A->B の場合のみを使用しました。他の割り込みも同様で、独自のルールに従う必要があるだけです。

どれだけ多くの中断が発生しても、遷移が完了しない限り、ソースの状態は変化しないことを覚えておくことが非常に重要です。たとえば、A->B は B->C によって中断され、次に C->D によって中断されます。遷移が完了するまで、ソース状態は常に A になります。Animator.GetCurrentAnimatorStateInfo() も状態 A を返します。

つまり、トランジション ブレークは強力で柔軟性が高くなりますが、非常に混乱する可能性があります。したがって、遷移割り込みを合理的に使用し、必ずエディターでさらにテストしてください。

要約する

今日は Animator コンポーネントについて説明しました。いくつかの点を覚えておいていただければ幸いです。

  • アニメーション クリップをビデオに例えると、Animator は複数のビデオの再生や切り替えなどを制御するビデオ プレーヤーです。
  • Animator Controller は、ビデオ プレーヤーに複数のビデオを再生する方法を指示するために使用されるスクリプトです。

今日の質問

Dazhi: 「Standard Assets に Character パッケージをインポートして、中の Animator Controller がどのように設定されているかを確認してください。」
Xiaoxin: 「わかりました~」
Dazhi: 「収穫物を共有することを忘れないでください。右下をクリックすることを忘れないでください。」友達に見てもらうためのコーナーです。無料で友達と共有すれば、彼の助けになるかもしれません。」

参考文献

【延長学習】Hongliu Academy の公式アカウントに返信する动画、このシリーズのすべての記事を読むことができます。さらに多くのビデオチュートリアルがあなたを待っています。


え~今日はXiaoxinのせせらぎだけで本当に十分です。明確でない場合はコメントを歓迎します。一緒に検討しましょう。

私はテクノロジーの探求者である Dazhi (WeChat: zhz11235) です。また次回お会いしましょう!

行かないでください!いいね集めてください

はい、行ってもいいです。

おすすめ

転載: blog.csdn.net/zhenghongzhi6/article/details/106459895