Unity は、ボーン アニメーション (Bone animation) をレンダリングするために Skinned Mesh Renderer コンポーネントを使用します。そのメッシュ形状はアニメーションボーンで変形されます。この技法は、関節が曲がるキャラクターやその他のオブジェクト (関節部がヒンジに近いような機械とは対照的) に便利です。
ボーン は、スキンメッシュ内部にあり、アニメーション時のメッシュ変形方法に影響する目に見えないオブジェクトです。ボーンは互いに連結されて階層構造の “スケルトン” を形成し、その関節を回転させて動かし、アニメーションを作ります。どのボーンにもその周囲を取り巻くメッシュの頂点の一部がアタッチされます。アニメーションが再生されると、頂点がその接続されたボーンとともに動き、そのため、“スキン” がスケルトンの動きに従います。単純な関節 (肘など) では、メッシュの頂点は繋がっている両方のボーンに影響され、それによりメッシュはリアルな関節のように伸縮や回転をします。より複雑な状態では、2 本以上のボーンがメッシュの特定の領域に影響することになり、より繊細な動きとして現れます。
スキンメッシュはアニメーションと一緒に使われるのが最も一般的ですが、スケルトンのすべてのボーンを物理エンジンで制御するために、リジッドボディ をアタッチすることも可能です。これは一般的にラグドール効果 (爆発の衝撃をうけたり、放り投げられる事によってキャラクターの手足が振り回される) を作成するために使われます。
これらのプロパティの一部は、Mesh Renderer のリファレンスページにも記述されています。以下の表は、青色の枠内に表示される残りのプロパティに関して説明します。
プロパティ | 機能 |
---|---|
BlendShapes | このメッシュで定義された ブレンドシェイプ を格納します。 |
Rendering Layer Mask | このレンダラーが存在するレンダリングレイヤーを定義します。スクリプタブルレンダーパイプライン を使用する場合は、追加のレンダリング固有のレイヤーマスクを指定できます。これはレンダラーが持っているマスクと DrawRenderers コマンドに渡されたマスクに基づいてレンダラーをフィルタリングします。 |
Renderer Priority | レンダラーを優先度でソートします。低い値が最初に描画され、高い値が最後に描画されます。 |
Quality | スキン化を行うときに各頂点に使用されるボーンの最大数を決定します。ボーンの数が多いほど、レンダラーの質が高くなります。 すべての頂点を 1 から 32 までの任意の数のボーンでスキンすることができます。ただし、5 つ以上ボーンを使うとパフォーマンスが低下します。多くのボーンを使うほど良い結果を得られますが、ボーンが 1 つ増えるごとに処理オーバーヘッドは増加します。 |
Auto |
Blend Weights Quality 設定を使用します。 ノート: 独自に設定した数の スキンウェイト をインポートし 4 つを超える数のボーンの影響を許容したい場合は、このオプションを選択し ブレンドウェイト が Unlimited に設定されていることを確認してください。 |
1 Bone | 各頂点に影響を与える ボーンを 1 つだけ使用します。 |
2 Bones | 頂点ごとに最大 2 つのボーンを使用します。これはゲームの一般的な設定です。なぜなら、これは視覚的品質とパフォーマンスの間のちょうど良い妥協点だからです。 |
4 Bones | 頂点ごとに最大 4 つのボーンを使用します。4 つを超える数のボーンが 1 つの頂点に影響を与える必要がある場合は、Blend Weights Quality 設定を使用します。 |
Update When Offscreen | これを有効にすると、どのカメラからも見えない場合でも、すべてのフレームでバウンディングボリュームを計算します。ゲームオブジェクトが画面上にないときにアニメーションの実行を停止するには、このオプションを無効にします。 デフォルトでは、Unity はどのカメラからも見えないスキンメッシュを更新しません。メッシュが画面に戻ると、Unity は再びスキンを更新します。これにより、システムリソースを節約できます。詳細は、後述の ゲームオブジェクトの可視性の決定 を参照してください。 |
Skinned Motion Vectors | これを有効にすると、メッシュのスキンデータをダブルバッファにします。そのため、Unity はスキンしたモーションを補間し、モーションベクトルテクスチャにそれを置くことができます。これは、より多くの GPU メモリを使用しますが、より正確なモーションベクトルになります。 |
Mesh | このレンダラーが使用するメッシュ (スキン) を設定します。 |
Root Bone | アニメーションの “ルート” となるボーン (つまり、このボーンの動きは、他のすべてのボーンに影響を与えます) を設定します。 |
Bounds | Unity がメッシュをいつオフスクリーンにするかを決定するために使用するバウンディングボリュームを設定します。Unity はモデルファイルにメッシュとアニメーションをインポートするときに境界を事前計算し、シーンビューでモデルの周囲の境目をワイヤーフレームとして表示します。詳細は、後述の ゲームオブジェクトの可視性の決定 を参照してください。 |
Unity では、オブジェクト可視かどうかはメッシュの Bound (境界) によって決定されます。言い換えると、全体のバウンディングボリュームはあらゆる有効なカメラの視界外にある必要があります。ただし、アニメーション可されたメッシュの実際のバウンディングボリュームは、アニメーションの再生によって変化します (例えば、キャラクターが手を頭上に伸ばすと、ボリュームの高さが増えます)。Unity は、バウンディングボリュームの最大値を計算するときにすべてのアタッチされたアニメーションを考慮しますが、すべての起こりうる状況を予想してバウンディングボリュームを計算することは、不可能な場合があります。
以下のような状況では、ボーンや頂点が事前計算されたバウンディングボリュームの外に押し出された場合に問題が生じます。
このような場合は、以下のいずれかの解決策を試して問題を解決できます。
Bounds (境界) を修正してメッシュの可能なバウンディングボリュームに適合するように修正します。
可能な場合はこのオプションを使用してください。パフォーマンスが向上します。
Update When Offscreen をスキンに対して有効にし、常にスキンメッシュをレンダリングします。
このオプションは 、パフォーマンスがそれほど重要でない場合、またはバウンディングボリュームのサイズを予測できない場合 (ラグドールを使用する場合など) に使用します。
スキンメッシュをラグドールとうまく連動させるために、インポート時、Unity は自動的にルートボーンに スキンしたメッシュレンダラーを再度割り当てます。ただし、Unity がこれを実行するのは、Skinned Mesh Renderer がモデルファイルに 1 つしか存在しない場合のみです。ラグドールを使用しており、すべてのスキンしたメッシュレンダラーをルートボーンもしくは子供にアタッチできない場合は、この最適化をオフにします。
2019–05–31 修正されたページ
スキンウェイトを含むように更新 (2019.1)