今回はUnityのAnimation Riggingについて見ていきたいと思います。
Animation RiggingはUnity2019.1以降で使用できます。
Animation Riggingを使うとUnity内でアニメーションリギングが出来ます(そのままですね・・・)。
リギングはアニメーションを作る為の仕組みを作る事でこの仕組みによってアニメーションを行うということになります。
UnityではスクリプトからIKを使って人型キャラクターの手や足の位置や角度を操作し、動かすことが出来ましたが、このAnimation Riggingを使うとスクリプトから操作せず自分でRigを設定しアニメーションをさせることが出来ます。
今回はAnimation Riggingの個々のコンポーネントの詳細を見ていきます。
Animation Riggingのインポート
Animation Riggingは現在はまだプレビューパッケージ(試用版)なので、Package Managerを使ってインポートする必要があります。
UnityメニューのWindow→Package Managerを選択します。
Package Managerウインドウが開くので、メニューのAdvancedを押し、Show preview packagesを選択し、プレビュー版のパッケージも表示するようにします。
Animation Riggingを選択し、右下のInstallボタンを押してインストールします。
Package ManagerのAnimation RiggingのサンプルもSamplesのImport in projectボタンを押すとインポートできます。
今回紹介する機能はサンプルに全てあるので実行して確認すると理解が早まるかもしれません。
Animation Riggingで使用するコンポーネント
Animation Riggingで使用するコンポーネントを個々に見ていきましょう。
Rig Builder
Rig BuilderコンポーネントはAdd ComponentのAnimation Rigging→Set up→Rig Builderから取り付けられます。
Rig BuilderはAnimatorコンポーネントを持つゲームオブジェクトに取り付けAnimatorコンポーネントと共存してRigを構築するコンポーネントです。
Rig BuilderのRig LayersにはRigコンポーネントを設定します。
エフェクターの設定
ヒエラルキー上のゲームオブジェクトにRig Builderコンポーネントを取り付けると、そのゲームオブジェクトの子要素のゲームオブジェクトを選択した時にシーンビューでエフェクター(シーンビューでIKやHintを確認する為の形状)の設定が出来るようになります。
+ボタンを押すと詳細を設定出来ます。
名前の横のチェックを外すとエフェクターが非表示になります。
Shapeでエフェクターの形を設定
Colorで色
Sizeでサイズ
Positionで位置のオフセット
Rotationで回転のオフセット
を設定出来ます。
Rig
Rigコンポーネントは取り付けたゲームオブジェクトの子要素に設定したリグのウエイトを設定出来ます。
Rigはスケルトンルート(ボーンのルート)と同じ階層のゲームオブジェクトに取り付けます。
例えばスタンダードアセットのEthanのスケルトンルートはEthanSkeletonという名前になっているのでRigコンポーネントを取り付けるゲームオブジェクトは
同じ階層にCreate Emptyで空のゲームオブジェクトを作成し名前をRig(名前は自由に設定)に変更し、Add ComponentのAnimation Rigging→Set up→Rigから取ります。
以下のような階層になります。
Rigコンポーネントを取り付けたゲームオブジェクトをRig BuilderコンポーネントのRig Layersにドラッグ&ドロップし設定します。
Rigゲームオブジェクトの子要素のゲームオブジェクトに設定したIKの設定がRigコンポーネントのウエイトで操作されます。
Bone Renderer
Bone RendererコンポーネントはAdd ComponentのAnimation Rigging→Set up→Bone Rendererから取り付けられます。
Bone Rendererコンポーネントはスケルトン(ボーン)をシーンビューで視覚的に確認出来たり、シーンビュー上で選択して操作をすることが出来るようになるコンポーネントです。
おそらくAnimatorコンポーネントが取り付けられているゲームオブジェクトに取り付けます。
Bone Sizeにチェックを入れ数値を変更すると表示されるボーンのサイズを変更する事が出来ます。
Shapeは表示するボーンの形状を設定します。
Colorは表示するボーンの色を設定します。
Tripod Sizeにチェックを入れるとボーンの方向軸が表示され、数値でその長さを指定出来ます。
Transformsには表示するボーンを設定します。
試しにスタンダードアセットのEthanにBone Rendererコンポーネントを取り付けBone RendererのTransformsにボーンを設定してみます。
EthanのEthanSpineとEthanの左足のボーン3つ、と右足のボーン3つを設定します。
シーンビューでは以下のようにボーンが表示されました。
Rig Transform
Add ComponentのAnimation Rigging→Set up→Rig Transformから取り付けられます。
IKの制約によって動くリグの親のゲームオブジェクトに取り付け、親のゲームオブジェクトを操作することによって子要素のIKの要素も動かすことが出来ます。
リグの制約コンポーネント
リグの制約をする為のコンポーネントがあらかじめ用意されているのでそれぞれ見ていきましょう。
制約コンポーネントはインスペクタのAdd ComponentからAnimation Riggingにあります。
Blend Constraint
Blend Constraintは2つのゲームオブジェクトの位置と回転をブレンドして別のゲームオブジェクトに適用する時に便利です。
Weightはウエイト。
Constrained Objectはブレンドの結果を適用するゲームオブジェクトを設定します。
SourceObjectsにはブレンドをする二つのゲームオブジェクトを設定します。
Maintain Offsetは元の位置や回転を維持するかどうかです。
Noneは維持しない
Position and Rotationは元の位置と回転を維持
Positionは位置だけ元の位置
Rotationは回転だけ元の回転
です。
Blend A | B Positionにチェックを入れスライダーを変更するとどちらに位置のウエイトを寄せるか設定出来ます。0なら完全にA、1なら完全にB。
Blend A | B Rotationにチェックを入れスライダーを変更するとどちらに回転のウエイトを寄せるか設定出来ます。0なら完全にA、1なら完全にB。
Blend Constraintを作成する時は、
空のゲームオブジェクトでBlendTestを作成し、AnimatorコンポーネントとRig Builderコンポーネントを取り付けます。
BlendeTestの子要素に空のゲームオブジェクトでModelを作成し、その子要素にブレンドする2つのゲームオブジェクト(CubeAとCubeB)を作成し、ブレンド結果を作用させるもうひとつのゲームオブジェクト(BlendObj)を作成します。
Animatorコンポーネントを持つBlendTestの子要素に空のゲームオブジェクトでRigを作成し、Rigコンポーネントを取り付けます。
BlendTestのRig BuilderコンポーネントのRig LayersにRigゲームオブジェクトのRigコンポーネントを設定します。
その子要素に空のゲームオブジェクトでBlendを作成し、インスペクタのAdd ComponentからAnimation Rigging→Blend Constraintを取り付けます。
Constrained ObjectにBlendObj、SourceObjectsのSourceAにCubeA、SourceBにCubeBを設定します。
Unityのプレイボタンを押して実行するとCubeAとCubeBの位置と回転をブレンドした結果がBlendObjの位置と回転に反映されます。
Rig BuilderコンポーネントとRigコンポーネントを取り付けるゲームオブジェクトやその階層等は基本的にこのやり方になります。
これを実行すると以下のようになります。
真ん中のオブジェクトがブレンドされたゲームオブジェクトです。
ChainIKConstraint
ChainIKConstraintは、ゲームオブジェクトの元と先のゲームオブジェクトを指定し、ターゲットのゲームオブジェクトの位置に応じてチェーンのように繋がれた位置と角度に制限します。
Weightはウエイト
Rootに根本のゲームオブジェクトを設定します。
Tipに先のゲームオブジェクトを設定します。
TargetにはTipに設定したゲームオブジェクトが追いかけるターゲットを設定します。
SettingsのMaintain Target Offsetはターゲットに依存するかどうかの設定でBlend Constraintとほぼ同じなので省略します。
Chain Rotation Weightはチェーン全体の回転のウエイトを設定します。1の場合はチェーンは完全にターゲットの回転になります。
Tip Rotation WeightはTipの回転のウエイトです。1の場合は完全にTipの回転がターゲットの回転になります。
Max Iterationsは許容範囲を満たさない時に満たすような結果を求める最大回数。
ToleranceはTargetとTipの許容する距離を指定します。
ChainIKConstraintを使用する時の階層やコンポーネントの取り付けはBlend Constraintとほとんど同じですが、チェーンにするゲームオブジェクトをRootからTipにかけて順番に子要素に入れていきます。
ChainIKConstraintのサンプルの階層は以下のようにしました。
ChanIKTestにはAnimator、Rig Builderを取り付け、Bone Rendererも取り付けてチェーンに使うゲームオブジェクトのCubeを全てTransformsに登録します。
Rigの子要素のChainIKConstraintは空のゲームオブジェクトで作成し、ChainIKConstraintコンポーネントを取り付けます。
ChanIKTestのRig BuilderのRig LayersにRigゲームオブジェクトのRigコンポーネントを設定します。
RootにはCube、TipにはCubeの一番下の子要素であるCube(4)を設定します。
Targetも空のゲームオブジェクトで作成し、ChainIKConstraintコンポーネントのTargetに設定します。
Unityのプレイボタンを押して確認すると以下のようにTargetゲームオブジェクトを動かすとTipに設定したゲームオブジェクトがターゲットの位置や回転に作用されて動き、それに伴ってチェーンとして繋がれている他のゲームオブジェクトの位置や回転も変わります。
Unityのプレイボタンを押してTargetゲームオブジェクトの位置や回転を変更すると以下のようになります。
Damped Transform
Damped TransformはSource Objectに指定したゲームオブジェクトの位置と回転にConstrained Objectに指定したゲームオブジェクトが影響を受けますが、位置や回転は指定した減衰値によって変換値が減衰されます。
Weightはウエイト
Constrained ObjectはSource Objectによって制約されるゲームオブジェクト
Source Objectは制約をするゲームオブジェクト
Settingsの
Damp Positionは位置の減衰値
Damp Rotationは回転の減衰値
Maintain Aimはチェックを入れるとConstrained ObjectがSource Objectの方を常に見るようになります。
Damped Transformを使用する際の階層は以下のような感じになります。
CubeのゲームオブジェクトはChainIKConstraintのサンプルをコピーして使いました。
Rigの子要素に空のゲームオブジェクトでDampedTransformを作成し、Damped Transformコンポーネントを取り付けました。
Cube(1)はCubeの動きによって制約をつけたいので、Constrained ObjectにCube(1)、Source ObjectにCubeを設定します。
その他のゲームオブジェクトの制約も親の要素によって子が影響を受けるようにしたいので、DampedTransformをCtrl+Dキーで複製し、Cube(2)はCube(1)の影響、Cube(3)はCube(2)の影響を受けるようにとSource Objectを設定します。
Unityのプレイボタンを押してCubeゲームオブジェクトを移動させるとその子要素のゲームオブジェクトは親のゲームオブジェクトの動きによって制約を受けているので以下のような動きをします。
Multi Aim Constraint
Multi Aim Constraintsは複数のゲームオブジェクトの方向を向かせる時に使用します。
Weightはウエイト
Constrained Objectは制約を受けるゲームオブジェクト
Aim Axisは回転するローカル軸を指定
Source ObjectsにはConstrained Objectに指定したゲームオブジェクトが見るゲームオブジェクトを複数設定出来ます。
Settingsの
Maintain Offsetは維持するオフセットをXYZで指定します。
Constrained Axesは制約する軸にチェックを入れます。
Min Limitは軸の回転の最小値
Max Limitは軸の回転の最大値
です。
Multi Aim Constraintを使用する際の階層は以下のような感じになります。
Unityのプレイボタンを押して確認してみます。
上のようになりました。
Source Objectsに指定しているゲームオブジェクトが全て1だとその平均値を取るようです。
キャラクターのボーンをConstrained Objectに指定して、Source Objectsにキャラクターが見るゲームオブジェクトを設定し、途中でSource Objectsのウエイトを変更して別のオブジェクトを見るというような機能も作成出来そうですね。
Multi Parent Constraint
Multi Parent Constraintを使用するとConstrained Objectに指定したゲームオブジェクトをSource Objectsで指定したゲームオブジェクトの子であるかのように制約出来ます。
Weightはウエイト
Constrained Objectは制約されるゲームオブジェクトを指定します。
Source Objectsは制約するゲームオブジェクト群を指定します。
Settingsの
Maintain Offsetは維持する項目を設定します。
Constrained Position Axesは制約をするPositionのXYZの軸を設定します。
Constrained Position Axesは制約をするRotationのXYZの軸を設定します。
Multi Parent Constraintを使用する際の階層は以下のような感じになります。
MultiParentConstraintゲームオブジェクトにMultiParentConstraintコンポーネントを取り付け、SourceゲームオブジェクトをSource GameObjectsに設定し、Model子要素のCube2をConstrained Objectに設定しました。
これでModel子要素のCube2はSourceゲームオブジェクトの子要素にあるかのように位置や回転が決定されます。
またMulti Parent ConstraintはTransformのScaleによる影響を受けません。
Unityのプレイボタンを押してSourceゲームオブジェクトを動かすと子要素にあるかのようにCube2が動きます。
Multi Position Constraint
Multi Position ConstraintはConstrained Objectに設定したゲームオブジェクトがSource Objectsに設定したゲームオブジェクトに制約されます。
Weightはウエイト
Constrained Objectは制約されるゲームオブジェクト
Constrained Axesは制約されるXYZの軸の指定
Source Objectsは制約するゲームオブジェクト
Settingsの
Maintain Position Offsetは位置を維持するかどうか
Offsetでオフセット値を指定
です。
Multi Position Constraintのサンプルは最初にインストールしたサンプルを試してみてください。
Multi Rotation Constraint
Multi Rotation ConstraintはConstrained Objectに設定したゲームオブジェクトがSource Objectsに設定したゲームオブジェクトに制約されます。
Weightはウエイト
Constrained Objectは制約されるゲームオブジェクトを設定します。
Constrained Axesは制約されるXYZの軸を指定します。
Source Objectsには制約するゲームオブジェクトを設定します。
Settingsの
Maintain Rotation Offsetは回転を維持するかどうか
Offsetは回転のオフセット値
です。
Multi Referential Constraint
Multi Referential ConstraintはReference Objectsに登録したゲームオブジェクトをDrivingで設定したゲームオブジェクトで制約をします。
Weightはウエイト
DrivingはReference Objectsに登録したゲームオブジェクトの中から他のオブジェクトを制約するゲームオブジェクトを選択します。
Reference Objectsは制約をするゲームオブジェクトを登録します。
Drivingに指定したゲームオブジェクトの動きに応じてReference Objectsに登録したゲームオブジェクトが動きます。
他のゲームオブジェクトはコントロール出来なくなります。
Override Transform
Override TransformはConstrained Objectに設定したゲームオブジェクトのTransformをOverride Transformに設定したゲームオブジェクトで上書きします。
Weightはウエイト
Constrained Objectには制約をされるゲームオブジェクト
Source Objectsの
Override Sourceには制約をするゲームオブジェクト
Override Positionは上書きする位置を指定しますが、Override Sourceにゲームオブジェクトが設定されている場合は無視されます。
Override Rotationは上書きする回転を指定しますが、Override Sourceにゲームオブジェクトが設定されている場合は無視されます。
Settingsの
SpaceはConstrained ObjectのTransformの上書き設定で、
WorldはConstrained Objectのグローバル値がOverride Sourceのローカル値で制約され、
LocalはConstrained Objectのローカル値がOverride Sourceのローカル値で制約され、
PivotはConstrained ObjectはOverride Sourceのゲームオブジェクトを中心点としてConstrained Objectを制約する?(位置や回転は元のままで制約を受ける?)
試しにスタンダードアセットのEthanをヒエラルキー上に配置し、名前をOverrideTransformTestと変え、子要素にRigとその子要素にOverrideTransformとOverrideSourceを作成しサンプルを作ってみました。
OverrideTransformにOverride Transformコンポーネントを取り付け、Override SourceにOverrideSourceゲームオブジェクトを設定し、Constrained ObjectにOverrideTransformTest(Ethan)のボーンのEthanSpine2を設定し試してみます。
Twist Collection
Twist CollectionはSourceに設定したゲームオブジェクトの動きでNodesに設定したゲームオブジェクトをねじれさせます。
Weightはウエイト
Sourceはねじれを起こさせるゲームオブジェクトを設定
Twist Axisはねじれさせる軸を設定
Twist Nodesはねじれるゲームオブジェクトを設定し、横のスライダーで個々のウエイトを設定します。
Twist Collectionを使用する際の階層は以下のような感じになります。
TwistCollectionにはTwist Collectionコンポーネントを取り付け、SourceにCube、NodesにCube(1)、Cube(2)を設定します。
その他の設定は他のRigの設定と同じです。
Unityのプレイボタンを押して試してみると以下のようにCubeの回転によってCube(1)、Cube(2)が個々のウエイトに従ってねじれているのがわかります。
Two Bone IK
Two Bone IKを使用すると二つのボーンのFKをIKとHintで制御できるようにします。
Weightはウエイト
Rootは二つのボーンのルートとなるゲームオブジェクトを設定
Midは二つのボーンの間のゲームオブジェクトを設定
Tipは二つのボーンの先のゲームオブジェクトを設定
Source Objectsの
TargetにはIKのターゲットとなるゲームオブジェクトを設定
HintにはIKHintに使用するゲームオブジェクトを設定
Settingsの
Maintain Target Offsetは維持をする位置や回転の設定
Target Position Weightはターゲットの位置のウエイト
Target Rotation Weightはターゲットの回転のウエイト
Hint WeightはIKHintのウエイト
です。
FKをIKとHintで制御する為に、例えば足であればボーンの足の付け根をRoot、膝をMid、足元をTipに設定し、Targetに足元のボーン、Hintに膝のボーンを設定する事で足元のボーンを動かす事で連動して足の付け根までのボーンが動くようになります。
Two Bone IKをEthanの両足に設定してみると以下のような階層になります。
スタンダードアセットのEthanをヒエラルキー上にドラッグ&ドロップし、名前を2BoneIKConstraintにし、Rig Builderコンポーネントを取り付けて、Animatorに適当なAnimatorControllerを取り付けて、HumanoidIdleアニメーションクリップを再生するようにしておきます。
2BoneIKConstraintを選択した状態で右クリックからCreate Emptyを選択し、名前をRigとし、Rigコンポーネントを取り付けます。
2BoneIKConstraintに取り付けたRig BuilderのRig LayersにRigゲームオブジェクトのRigコンポーネントを設定します。
Rigの子要素に空のゲームオブジェクトでRightFootとLeftFootを作成し、それぞれにTwo Bone IK Constraintを取り付けます。
それぞれの子要素にも空のゲームオブジェクトを作成し、RightKneeHint、RightFootIK、LeftKneeHint、LeftFootIKとします。
これらをIKのTargetやHintに使用します。
RightFootゲームオブジェクトのインスペクタは先ほど紹介した画像のようになります。
Unityのプレイボタンを押してRightKneeHintやRightFootIKを動かしてみると、以下のようにEthanの足が足元のIKに従って連動して動きます。
Animation Riggingを使ったサンプルを作成する
Animation Riggingの機能を使ってサンプルを作ってみます。
Cubeを繋いで鎖を作成しアニメーションを作成する
まずはCubeをChainIKConstraintを使って鎖状の制約を加えて鎖を作成し、左右に振られるアニメーションを作成してみます。
ヒエラルキー上で右クリックからCreate Emptyを選択し、名前をChainとします。
その子要素にCreate Emptyを選択し、名前をModelとします。
その子要素に右クリックから3D Object→Cubeを選択し名前をChainRootとします。
ChainRootの子要素にもCubeを階層上に配置し、間のCubeはChain、最後のCubeをChainTipとします。
ChainRootを選択した状態で右クリックからCreate Emptyを選択し、名前をRigとしRigコンポーネントを取り付けます。
Rigを選択した状態でCreate Emptyを選択し、名前をConstraintにします。
Constraintには制約のコンポーネントを取り付けて先ほど作成したモデルの動きを制約します。
ConstraintにはインスペクタのAdd ComponentからAnimation Rigging→Chain IK Constraint、Animation Rigging→Mulit Aim Constraintを選択し取り付けます。
Constraintを選択した状態でCtrl+Dキーを押して複製し、名前をTargetとします。
TargetはモデルのChainTipが追いかける対象のゲームオブジェクトとして使います。
ChainゲームオブジェクトのインスペクタのAdd ComponentからAnimation Rigging→Set Up→Rig Builder、Animation Rigging→Set Up→Bone Rendererコンポーネントを取り付けます。
Rig BuilderのRig LayersにはRigゲームオブジェクトに取り付けたRigコンポーネントを設定します。
Bone RendererのTransformsにはChainRoot、間のChainゲームオブジェクト群、ChainTipを設定し、シーンビューでボーンが確認出来るようにします。
Bone Rendererは特につけなくてもいいです。
Constraintに取り付けたコンポーネントの設定をします。
Chain IK ConstraintのRootにChainRootゲームオブジェクト、TipにChainTipゲームオブジェクト、TargetにTargetゲームオブジェクトを設定します。
これでChainRootからChainTipまでの階層のゲームオブジェクトが鎖で繋がれTargetゲームオブジェクトの位置を追いかけます。
Multi Aim ConstraintのConstrained ObjectにChainTipゲームオブジェクト、Source ObjectsにTargetゲームオブジェクトを設定します。
これでChainTipゲームオブジェクトはTargetゲームオブジェクトの方向を向くようになります。
鎖が左右に揺れるアニメーションの作成
次に鎖が左右に揺れるアニメーションを作成します。
Modelゲームオブジェクト以下の鎖のモデルのChainTipゲームオブジェクトはTargetゲームオブジェクトの位置を追いかけますので、それを利用してアニメーションを作成します。
Chainゲームオブジェクトを選択した状態でAnimationウインドウのCreateボタンを押します。
下の画像ではMain Cameraとなってますが、これはわたくしの場合Chainのアニメーションを作成済でボタンが表示されない為、Main Cameraを選択してサンプル画像を作成した為です。
通常ですとMain Cameraの部分がChainとなっていると思います。
Createボタンを押すとアニメーションクリップ保存ウインドウが開くので名前をChainAnimとします。
ChainゲームオブジェクトにはAnimatorコンポーネントが追加され、ChainAnimアニメーターコントローラーが設定されます。
またChainAnimアニメーターコントローラーのデフォルトの状態にChainAnim状態が作成され、ChainAnimアニメーションクリップが再生するように設定されます。
Animationウインドウに戻り丸い赤いボタンを押して録画モードにし、Targetゲームオブジェクトの位置を動かしてアニメーションを作成します。
まず0:00の位置でヒエラルキー上のTargetゲームオブジェクトを選択し、鎖が真っすぐ下に垂れ下がる状態に移動させます。
0:05の位置で少し鎖が動いた位置にTargetを移動させます。
0:20の位置で少し鎖がしなった状態になるようにTargetを移動させます。
後は同じような感覚で最初の位置に戻し、反対側にも鎖が動くようにTargetを動かします。
以下のようなフレームになりました。
このままだとアニメーションスピードが速いので、ChainAnimアニメーターコントローラーのChainAnim状態を選択し、インスペクタのSpeedを0.6にします。
これでアニメーションが出来ました。
鎖のサンプルの確認
鎖のサンプルが出来たので確認してみます。
上のように鎖が左右に揺れるアニメーションが出来ました。
アニメーションの作り方が雑なので動きがカクカクしてますが、キーフレームを細かく打って滑らかなアニメーションを作成してみてください。
アニメーションはChainAnimアニメーターコントローラーで制御されていますので、鎖のアニメーションの切り替えもChanAnimアニメーターコントローラーで行えます。
参考サイト
今回紹介したAnimation Riggingについてはマニュアルに詳細がありますので、参照してみてください。
Unity Blogで使い方の例も載っています。
高度な Animation Rigging:キャラクターとプロップのインタラクション – Unity Technologies Blog