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