
4.2 ヒューマノイドに特化したアニメーションスクリプティングの概要
Tutorial
Beginner
+10XP
40 mins
(14)
Unity Technologies

本チュートリアルでは、ヒューマノイドリグ専用の機能に触れます。
本チュートリアルは、C# スクリプトの経験がある学習者を対象とした、ヒューマノイドに特化したアニメーションスクリプティングの概要です。アニメーションスクリプティングのステップバイステップのガイドは、このコースの範囲外です。
1. 概要
本チュートリアルでは、ヒューマノイドリグ専用の機能をいくつかご紹介します。ヒューマノイドリグは予測可能な構造を持っており、そのアニメーションは Unity が Transform の値を設定する前に「マッスルスペース (Muscle Space)」に変換されます。これは、IK やターゲットマッチングなどの機能が組み込まれることを意味します。
本チュートリアルは、C# スクリプトの経験がある学習者を対象とした、ヒューマノイドに特化したアニメーションスクリプティングの概要です。アニメーションスクリプティングのステップバイステップのガイドは、このコースの範囲外です。
2. はじめる前に
このチュートリアルでは、「3D アニメーションシステム入門」Unity プロジェクトを使用しています。まだダウンロードされていない方は、続ける前にダウンロードしてください。
プロジェクトのダウンロードが完了したら:
1. プロジェクトを Unity エディターで開きます。
2. Project ウィンドウで、 Assets > 4.2 - Introduction to humanoid-specific animation scripting と進みます。
3. ターゲットマッチングと IK の基本
通常、Transform の階層は Forward Kinematics(略して FK)と呼ばれるシステムで動いています。
各 Transform の位置と回転は、その親に対して相対的に設定されます。つまり、親の位置や回転を変更すると、その子のグローバルな位置や回転に影響を与えます。ヒューマノイドリグでは、このような動作がアニメーションに求められます。キャラクターの肩の位置が変われば、肘の位置も変わり、指先までもが変わります。
ただし、階層の最も下層に位置するボーン(エフェクターと呼びます)の位置や回転を個別に設定したい場合があります。この場合、エフェクターの位置や回転に合わせて、残りの階層を変更する必要があります。
これには 2つの方法があります:
- ターゲットマッチング
- インバースキネマティックス (IK )
4. ターゲットマッチングの概要
ターゲットマッチングは、階層の残りの部分を変更することなく、エフェクターが正しい位置や回転になるように、階層のルートを移動します。
例えば、プレイヤーが操作するヒューマノイドが路地を走っている場合を考えてみましょう。路地には低いフェンスがあり、キャラクターはフェンスの上に手を置いて飛び越えなければなりません。プレイヤーがどこから飛び降りるかを正確に把握することは不可能かもしれませんが、どこから飛び降りるかに関わらず、キャラクターの手がフェンスに触れている必要があります。
これは、ターゲットマッチングに適したケースです。キャラクターのポーズは変えず、アニメーションで設定されたジャンプのポーズを維持しなければなりませんが、キャラクターの手はゲームの世界の特定の場所にある必要があります。
5. インバースキネマティクスの概要
IK は、階層のルートを動かすわけではありませんが、キャラクターのポーズを変えることができます。IK にはさまざまなアルゴリズムがありますが、共通しているのは、エフェクターが希望の位置や回転になるように、さらに上の階層のボーンの位置や回転を設定することです。
ヒューマノイドリグに使用する場合、IK は腕か脚のどちらかに 2つのボーンを使用します。例えば、プレイヤーが操作しているキャラクターがテーブルに座っていて、何かに手を伸ばす必要がある場合を考えてみましょう。キャラクターがどこに座っているのか、手を伸ばさなければならないアイテムがどこにあるのかが正確にわからない場合、IK を使って手を伸ばす位置を調整する必要があります。
6. ターゲットマッチング
ターゲットマッチングはアニメーターコントローラーの MatchTarget メソッドで行います。このメソッドは、マッチングを開始する前であればいつでも、ターゲットマッチングを行う状態で 1回呼び出す必要があります。
MatchTarget メソッドのパラメータは 3つのグループに分けられ、それぞれに 2つのパラメーターがあります。この 3つのグループは:
- マッチングするターゲットに関する情報
- マッチングするエフェクターに関する情報
- ターゲットマッチングがいつ行われるかについての情報
ターゲット情報のパラメーターは、単純にマッチングするワールド空間での位置 (position) と、マッチングするワールド空間の回転 (rotation) です。
AvatarTarget
エフェクター情報のパラメーターの 1つ目は、エフェクターがどの体の一部であるかを判断するための列挙です。ヒューマノイドアバターのどの部分がターゲットに一致するかを判断するために使用されるため、AvatarTarget と呼ばれ、以下の値があります:
- Root
- Body
- LeftFoot
- RightFoot
- LeftHand
- RightHand
手と足は一目瞭然です。Root はキャラクターのルート、通常は足の間のキャラクターのルートを意味し、Body はキャラクターの重心を意味します。
MatchTargetWeightMask
エフェクターの情報パラメーターの 2つ目は MatchTargetWeightMask という構造体です。これは、エフェクターが取るべき元の位置とターゲットの位置のバランスを決定します。
2つのパートに分かれています:
- Positional ウェイト
- Rotational ウェイト
positional (位置) ウェイト(positionXYZWeight と呼びます)は Vector3 で、各軸に 0 ~ 1 の値を設定して、エフェクターがターゲット位置のその軸をどれだけ使用するかを制御します。
rotational (回転) ウェイト(rotationWeightと呼ばれる)は、元の回転とターゲットの回転の間の線形補間を可能にする浮動小数点 (float) です。
最後の 2つのパラメーターは、ステートの正規化された時間を示す浮動小数点 (floats) です。これらのパラメーター、ターゲットマッチングを開始する時間と、ターゲットに到達する時間です。
7. ターゲットマッチングのサンプルの確認
低いフェンスをサンプルに使って、MatchTarget の使い方を確認してみましょう:
1. Project ウィンドウで、Assets > 4.2 - Humanoid-specific animation scripting > Scenes と進みます。
2. HumanoidAnimation シーンをダブルクリックしてロードします。
3. Hierarchy で、MazeLowMan ゲームオブジェクトを選択します。
4. Inspector で、Vault Target Matching スクリプトを無効にします。これにより、設定されているターゲットマッチングが行われなくなるので、通常の状態を確認することができます。
5. Play ボタンを押して、プレイモードに入ります。
注意:キャラクターがわずかに壁を突き抜けています。キャラクターの左手を壁の上部に合わせることで修正できます。
6. Play ボタンを押してプレイモードを終了します。
7. Inspector で、Vault Target Matching スクリプトを再度有効にします。
8. もう一度 Play ボタンを押すと、プレイモードに戻ります。
これで、キャラクターが正しく壁を乗り越えられるようになりました。ここで注意すべき点は、キャラクターの跳躍アニメーションが、通常のゲームで行うよりもわずかに長くなっていることです。これは、スクリプトによる変更を説明するためのものです。あなたのプロジェクトで同様のシステムを導入する場合は、少しでも近いターゲットマッチングを目指すべきです。
9. Play ボタンを押してプレイモードを終了します。
8. ヒューマノイドのインバースキネマティクス
アニメーターが使用する 2つのボーンのインバースキネマティクス(IK)アルゴリズムには、3つの重要な変数があります:
- ターゲット位置 (target position)
- ターゲット回転 (target rotation)
- ヒント位置 (hint position)
target position と target rotation は、手や足が到達しようとする位置と回転です。hint position とは、その手足の肘や膝が到達しようとする位置のことです。
例えば、テーブルに座っているヒューマノイドが、机の上の扇風機に手を伸ばしているとします。ターゲット位置は扇風機です。ターゲット位置、肩、ヒント (hint) 位置は平面を形成しています。肘は、ヒントの位置にできるだけ近い平面上にあります。
9. IK メソッドの確認
重要な 3つの変数にはそれぞれウェイトがあり、腕や脚のどちらにも適用できます。アニメーターコントローラーには、これらの変数とそのウェイトを設定するメソッドがあり、全部で 6つのメソッドがあります。メソッドは以下の通りです:
- SetIKHintPosition
- SetIKHintPositionWeight
- SetIKPosition
- SetIKPositionWeight
- SetIKRotation
- SetIKRotationWeight
これらのメソッドはすべて、あるパターンに従っています。これらのメソッドには 2つのパラメーターがあります:
- 影響を与える身体の部位
- 設定する値
身体の部位を表す型と値は、メソッドによって異なります。ヒント (hint) に影響を与えるメソッドでは、身体の部位は AvatarIKHint という列挙型で、左右の膝または肘のいずれかになります。
その他のメソッドでは、身体の部位は AvatarIKGoal という列挙型で、左右の足か手のどちらかになります。
ウェイトを設定するメソッドは、値として float を取ります。位置を設定するメソッドは Vector3 を値として取り、SetIKRotation メソッドは Quaternion を値として取ります。
OnAnimatorIK メソッドの使用
これらのメソッドはアニメーターの IK パス中に呼び出される必要があります。そのためには、MonoBehaviour の OnAnimatorIK メソッドを使用する必要があります。
OnAnimatorIK は、MonoBehaviours の Update と非常によく似た動作をします。アニメーターの更新中に呼び出され、Update または FixedUpdate の直後に行われます(アニメーターの Update モードによります)。
OnAnimatorIK は、IK パスが有効になっているすべてのアニメーターレイヤーに対して、更新ごとに 1回呼び出されます。各呼び出しには、パラメーターとしてレイヤーのインデックスが渡されます。つまり、IK の様々な用途を別々に扱うことができます。
10. まとめ
本チュートリアルでは、ヒューマノイドリグに特化したスクリプティングについて触れました。学んだことは:
- ターゲットマッチングとインバースキネマティクスの違いと、それぞれの使い分けについて
- スクリプティングを使ってそれぞれを設定する方法
これで「3Dアニメーションシステム入門」は終了です!皆さんの作品を楽しみにしています。