Unity は、ボーン アニメーションをレンダリングするために Skinned Mesh Renderer (スキンメッシュレンダラー) コンポーネントを使用します。そのメッシュ形状は事前に定義されたアニメーションシーケンスで変形されます。この技法は、関節が曲がるキャラクターやその他のオブジェクト (関節部がヒンジに近いような機械とは対照的) に便利です。
スキンメッシュレンダラーはインポート時にそれが必要なすべてのメッシュに自動的に加えられます。
プロパティー | 機能 |
---|---|
Cast Shadows | 有効にすると、適切なライトに照らされるとき影を生成します。 |
Receive Shadows | 有効にすると、メッシュは他のオブジェクトが落とした影を受けるようになります。 |
Motion Vectors | 有効にすると、線によって Camera のモーションベクターテクスチャにモーションベクターがレンダリングされます。詳細はスクリプトリファレンスの Renderer.motionVectors を参照してください。 |
Materials | メッシュが一緒にレンダリングされる Materials のリストです。 |
Light Probes | プローブに基づいたライトの補間モード |
Reflection Probes | この機能が有効で、リフレクションプローブがシーンに存在する場合、リフレクションテクスチャがオブジェクトのために取得され、ビルトインシェーダーの統一変数として設定されます。 |
Anchor Override | ライトプローブや、リフレクションプローブが使用される場合、補間位置を決定するために使われるTransform。 |
Quality | スキニング中に頂点ごとに使用されるボーンの最大数を定義します。ボーンの数が多いほど、レンダラーのクオリティは高くなります。 Quality を Auto に設定すると、Quality ウィンドウの設定の Blend Weights 値を使用します。 |
Skinned Motion Vectors | 有効にすると、メッシュのスキンデータはダブルバッファリングされるので、スキン化されたモーションは補間されモーションベクターテクスチャに配置されます。これは、GPU メモリのオーバーヘッドになりますが、より正しいモーションベクターにすることができます。 |
Update When Offscreen | 有効にすると、スキンメッシュがまったくカメラに映っていなくてもアップデートされます。無効にすると、オブジェクトがカメラに映っていない場合はアニメーションの再生も停止します。 |
Mesh | レンダラーによって使用されるメッシュを定義します。 |
Root Bone | アニメーションの “ルート” となるボーン (つまり、このボーンの動きは、他のすべてのボーンに影響を与えます) を定義します。 |
Bounds | バウンディングボリュームは、メッシュをいつオフスクリーンにするかを決定します。バウンドは、メッシュとアニメーションのインポート時に、モデルファイルのメッシュとアニメーションから事前計算されます。シーンビューでモデルの周りにワイヤーフレームとして表示されます。 |
ボーン は、スキンされたメッシュ内部にあり、アニメーション時のメッシュ変形方法に影響する目に見えないオブジェクトです。基本的な考え方としては、ボーンは階層構造の “スケルトン” を形成するために互いに連結され、アニメーションはスケルトンの関節を回転させて動かすことによって定義されます。どのボーンにもその周囲を取り巻くメッシュの頂点がアタッチされます。アニメーションが再生されると、頂点がその接続されたボーンとともに動くため、スキンもスケルトンの動きに従って動きます。単純な関節 (肘など) では、メッシュの頂点は、繋がっている両方のボーンに影響され、ジョイントが曲げられると、メッシュはリアルに伸縮したり回転したりします。より複雑な状態では、2 本以上のボーンがメッシュの特定の領域に影響することになり、より繊細な動きを表現します。
スキンメッシュは事前計算アニメーションと一緒に使われるのが最も一般的ですが、スケルトンに含まれるすべてのボーンを物理エンジンで制御するために、リジッドボディ をアタッチすることも可能です。これは一般的にラグドール効果 (爆発の衝撃をうけたり、放り投げられる事によってキャラクターの手足が振り回される) を作成するために使われています。
Unity は頂点ごとに 1 本か 2 本、または 4 本のボーンを設定してスキン化できます。4 本使うと最良の結果になりますが、CPU のオーバーヘッドも高くなります。ゲームでは通常、ビジュアル品質とパフォーマンスの妥協点となる、2 本でのウェイトを使用します。
Quality が Auto に設定されている場合、Unity は Quality ウィンドウの設定から Blend Weights の値を使用します。これにより、エンドユーザーは独自の品質設定を選択し、アニメーション品質とフレームレートを好みのバランスにすることができます。
デフォルトでは、どのカメラにも表示されないスキンメッシュは更新されません。スキニングはメッシュが画面上に表示されるようになるまで、更新されません。これは、システムリソースを節約するために行われます。
オブジェクトのビジビリティはメッシュの Bounds によって決定されます (言い換えると、全体のバウンディングボリュームはあらゆる有効なカメラの視界角外にある必要があります)。ただし、アニメーションしているメッシュの実際のバウンディングボリュームは、アニメーションの再生によって変化します (例えば、キャラクターが手を頭上に伸ばすと、ボリュームの高さが増えます)。Unity は、すべてのアタッチされたアニメーションが最大のバウンディングボリュームになるときを考慮しますが、すべての使用可能な状況を予想してバウンディングボリュームを計算することは、不可能な場合があります。
以下のような状況では、ボーンや頂点が事前計算されたバウンディングボリュームの外に押し出されてしまい、問題が生じます。
これらの例では、2 つの解決方法があります。
通常は、パフォーマンスに与える影響も少ないため最初の方法を選択します。ただし、パフォーマンスを重視する必要がない場合や、バウンディングボリュームを予測できない場合 (例えばラグドール物理を使用する場合) に、2番目の方法を選択します。
スキンメッシュをラグドールとうまく連動させるために、インポート時、Unity は自動的にルートボーンに Skinned Mesh Renderer を再度割り当てます。ただし、Unity がこれを実行するのは、Skinned Mesh Renderer がモデルファイルに 1つしか存在しない場合のみです。つまり、すべての Skinned Mesh Renderer をルートボーンもしくは子供にアタッチできず、しかもラグドールを使用する場合、この最適化をオフにします。
スキンメッシュは、現在、以下からインポートできます。
モバイルデバイスでは、Unity はコーディングされた NEON/VFP 命令で CPU でスキニングします。ここでの制限は、法線とタンジェントは正規化されないため、自分でシェーダーを書く場合、自分で正規化を行う必要があるということです。ただし、サーフェス シェーダー を使用する場合は、Unity が自動的に正規化を行います。
注意 最適化されたメッシュでは、最適化されていないメッシュとは異なる方法でボーンをソートするので、結果、潜在的に重要なアニメーションの問題をもたらします。これは、最適化されたメッシュがボーンの名を利用し順番に依存しないのに対して、最適化されていないメッシュのアニメーションは、ボーンの順番に依存するためです。
単純にFBXファイルをインポートして使用するだけの場合は、Unity が変換のために処理を行います。
上級レベルのユーザー向けですが、SkinnedMeshRenderer.sharedMesh
を変更したい場合、以下のように行います。
SkinnedMeshRenderer.bones
が SkinnedMeshRenderer.sharedMesh
に一致することを確認する必要があります。参照した Transforms はそこに正しい順番である必要があります。SkinnedMeshRenderer.bones
は常に空です。