未来を創る、テックコミュニティー

代表技術通信~Unityに舞い戻りでVR⑭

草場代表
2020/11/15

こんばんは。代表の草場です。

Unity LearnのIntroduction to 3D Animation Systemsの勉強です。Working with Assets です。

2.8 Configuring Generic Rigs

1.概要

リグは、インポートするモデルの構造を定義する方法であり、アニメーションの再生方法を定義するために使用されます。今回は、アニメーションタイプについて学び、Generic Rig用のアバターアセットを作成して設定します。

2.始める前に

3Dアニメーションシステム入門Unityプロジェクトをダウンロードしておいてください。
プロジェクトをダウンロードしたら、 Unityエディタでプロジェクトを開き、プロジェクトウィンドウで、アセット > 2.8: Configuring Generic Rigs(ジェネリックリグの設定)を選択します。

3.Rigタブを開く

リグの設定を始めるには、まずUnityでRigsタブを開く必要があります。
1. プロジェクト(Project)ウィンドウで、「2.8 – Configuring Generic Rigs(2.8 – 汎用リグの設定)」 > 「Model(モデル)」と進み、Ellen(エレン)モデルを選択します。

2. インスペクタで、リグタブ(モデルタブの隣)をクリックして開きます。

設定可能なのはアニメーションタイプのみです。
モデルにアニメーションがない場合や、アニメーションを再生するために使用することを意図していない場合は、アニメーションタイプを「なし」のままにしておきます。他のオプションはLegacy、Generic、Humanoidです。

4.アニメーションタイプの設定を見直す

他の3つのアニメーションタイプをもう少し詳しくおさらいしてみましょう。

レガシー
レガシーは、4.x以前のバージョンのUnityとの互換性を確保するために使用されます。

ジェネリック
アニメーションモデルで最も一般的なアニメーションタイプの設定はGenericです。ほとんどのアニメーションモデルにはこのアニメーションタイプを使用する必要があります。

ヒューマノイド
インポートするモデルがヒューマノイド形状のキャラクターで、以下のいずれかに当てはまる場合は、Humanoid Animation Typeを使用する必要があります。モデルには、異なる階層構造を持つ別のヒューマノイドモデルを通して再生することを意図したアニメーションがあります。
このモデルは、異なる階層構造を持つ別のヒューマノイドモデルを通して再生されることを意図したアニメーションを持っています。腕や脚のIKやターゲットのマッチングなど、内蔵のヒューマノイドの機能を使用したいのです。

ヒューマノイドリグタイプについては、「2.9 ヒューマノイドリグの設定」で詳しく説明します。

モデルのアニメーションタイプを選択する
このチュートリアルでは、アニメーションの種類をGenericに設定します。

5.新しいアバター資産を作成する

Animation TypeをGenericに設定したところで、さらに多くの設定が表示されるようになりました。Animation Typeの下にある最初の設定は、アバターの定義です。

アバターの紹介
アバターはモデルのリグのアセット表現です。リグがジェネリックかヒューマノイドかによって、さまざまな形をしています。アバターは、アニメーションのマスキングなど、いくつかのアニメーション機能に必要です。一般的な方法は、アニメーションを再生するモデルにアバターを作成し、アニメーションデータを含むモデルに使用させることです。

アバターの作成
モデルのアバターを作成するには
1. [アバター定義] フィールドを [このモデルから作成] に設定します。
2. 適用ボタンを選択して、新しいアバター・アセットを作成します。

6.ルートノードの選択

アニメーションの種類がGenericに設定されている場合、次の設定ではルートノードを選択することができます。

ルートノードの紹介
ルートノードはアニメーションのルートモーションを定義するために使用されます。ルートモーションとは、アニメーションによってGameObjectが絶対的に移動するのではなく、以前の位置からオフセットすることを意味します。
例えば、ある GameObject が z 軸上を前進するようにアニメーションされている場合、Root Motion を使用すると、アニメーションがループしても GameObject は z 軸に沿ってどんどん移動し続けます。
Root Motion を使用しない場合は、アニメーションがループするたびに GameObject は元の位置に戻り、再び z 軸方向に移動します。Rootノードは、このMotionの参照として使用されます。

モデルのRootノードを設定
サンプル・モデルの適切なルート・ノードは、Ellen_Skeleton の子である Ellen_Root GameObject です。
RootノードがEllen_Skeleton/Ellen_Rootに設定されていない場合は、ドロップダウンメニューを使用して設定してください。

7.肌の重さを設定する

次に使用可能な設定は、スキンウェイトです。2.3 モデル固有のアニメーションのインポート設定で説明したように、モデルは三角形のメッシュで表現されます。基本的なことを復習しておきましょう。
一般的に、アニメーションモデルはスキニングされたメッシュを持っています。
スキニングとは、メッシュの各頂点を1つまたは複数のボーンに接続し、それらのボーンに重みを与えてその頂点に影響を与えるプロセスです。
Unityでは、ボーンはモデルのTransformで表現されるため、各頂点はスキン化されたTransformの組み合わせに重みを付けて移動します。

スキンウェイトの設定では、頂点のスキンにするボーンの数を調整することができます。デフォルトでは4つのボーンに設定されていますが、ほとんどの場合は4つにしておくことをお勧めします。
上級者の中には、特別なケースではパフォーマンスや精度の理由からこの値を調整したいと思う人もいるかもしれません。そのような場合、Skin Weightsの設定をStandard(4ボーン)からCustom(カスタム)に変更することができます。つまり、Max Bones/VertexとMax Bone Weightの設定を調整することができます。

Max Bones/Vertexの設定
最大ボーン/頂点(Max Bones/Vertex)設定では、頂点の位置計算で考慮するボーンの数を設定できます。Max Bone Weight(最大ボーン重量)設定では、頂点の位置計算で考慮される前にボーンが持たなければならない最小の重量を設定することができます。サンプルモデルのスキンウェイトをデフォルトから変更する必要はありません。

8.GameObjects モデルの最適化

Rigタブで最後に利用可能な設定は、モデル内のGameObjectの最適化に関するものです。これらの設定は、任意の時点でインスタンス化されるモデルにとって重要です。
通常、モデルのボーンはGameObjectsの一部であるTransformで表現されます。しかし、モデルは非常に複雑な階層を持つことがあります。その結果、スキンメッシュの頂点の位置を定義するだけの GameObject が多数存在することになります。
Optimize GameObjectsを有効にすると、コンポーネントを持たないGameObjectがすべて削除されます。すると、スキンメッシュはアニメーションによって直接移動します。
GameObjectsを最適化するとパフォーマンスが大幅に向上するので、できるだけ頻繁に行うようにしましょう。

エクストラトランスフォームの設定を公開する
GameObjects の最適化を有効にしたときに削除されてしまうような GameObject を保持しておく必要がある場合があります。
例えば、変更可能なアーマーを装着しているキャラクターがいる場合、アーマーを装着できるように、Chest GameObject を公開する必要があるかもしれません。GameObject を保持するには、Expose Extra Transforms の設定を使用する必要があります。
キャラクターモデルの胸部を公開してテストしてみましょう。
1. インスペクタで、ゲームオブジェクトの最適化を有効にします。

2. エクストラトランスフォームをエクスポーズに展開します。

3. 各ノードの foldout を展開して、Ellen_Skeleton > Ellen_Root > Ellen_Hips > Ellen_Spine > Ellen_Chest に移動します。
4. Ellen_Chest ノードを有効にします。

5. Apply をクリックして、Rig に変更を保存します。
6. プロジェクトウィンドウからEllenモデルをヒエラルキー(階層)にドラッグしてインスタンス化します。
7. ヒエラルキー(階層)で、Ellen GameObject を展開してその子オブジェクトを確認します。
リグには、Ellen_Body(Skinned Mesh Renderer コンポーネントを持つ)と Ellen_Chest(公開した)以外の子 GameObject はありません。

9.アバターマスクの作成と適用
最後に考えることは、ジェネリックアバターのためのアバターマスクです。
アバターマスクは、アニメーションデータがバインディングに書き込まれるのを防ぐ方法です。ヒューマノイドアバターとジェネリックアバターでは動作が異なりますが、全体的な効果は同じです。
アバターマスクはアセットであり、他のアセットを作成するのと同じ方法で作成できます。
プロジェクト]ウィンドウの[作成]メニューを使用して、[アバター・マスク]を選択します。

一般的なアバターのためのアバター・マスク
一般的なアバターのためのアバターマスクには、折り畳み式のトランスフォームのリストがあります。このリストを使って、マスクするトランスフォームの選択を解除したり、マスクを解除したいトランスフォームを選択したりすることができます。

アバターマスクの適用
アバターマスクを適用するには、次の2つの状況があります。
インポート処理中にインポートしたアニメーションクリップに、特定のトランスフォームのアニメーションデータがそのアニメーションクリップに追加されないようにします。
アニメーターコントローラーのアニメーションレイヤーに、特定のトランスフォームのアニメーションデータがアニメーターコントローラーのすべてのレイヤーのブレンドの結果に追加されないようにします。これらのアバターマスクはアセットとして作成する必要がありますが、他のアバターマスクと同じように動作します。
アニメーションクリップとアニメーションレイヤーのインポートについては、このコースの他のチュートリアルを参照してください。
注意: アバターマスクはトランスフォームデータをマスクするだけであることを覚えておいてください。アバターマスクは、マスクされた Transform と同じ GameObject のデータをマスクすることはありません。

10.まとめ

ジェネリックリグを設定する方法を探ってきました。ここでは、以下のことを学びました。
3 種類のアニメーションタイプ(レガシー、ジェネリック、ヒューマノイド)をいつ使用するか。
アバターはリグのアセット表現であり、その作成方法。
ジェネリックリグとの関係でルートノードがどのように機能するか。
スキンウェイトの設定方法を学びました。
ジェネリックリグモデルを最適化する方法と、最適化プロセスでGameObjectの削除をオーバーライドする方法。
アバターマスクがジェネリックリグに適用される方法と、その作成方法と適用方法。
次は、別のタイプのアニメーションであるヒューマノイドリグを設定する方法を学びます。

この記事を書いた人
草場代表
エディター