Version: 2018.1
Mesh Renderer
Text Mesh

Skinned Mesh Renderer

Unity は、ボーン アニメーションをレンダリングするために Skinned Mesh Renderer (スキンメッシュレンダラー) コンポーネントを使用します。そのメッシュ形状は事前に定義されたアニメーションシーケンスで変形されます。この技法は、関節が曲がるキャラクターやその他のオブジェクト (関節部がヒンジに近いような機械とは対照的) に便利です。

スキンメッシュレンダラーはインポート時にそれが必要なすべてのメッシュに自動的に加えられます。

プロパティー

プロパティー 機能
Cast Shadows 有効にすると、適切なライトに照らされるとき影を生成します。
Receive Shadows 有効にすると、メッシュは他のオブジェクトが落とした影を受けるようになります。
Motion Vectors 有効にすると、線によって Camera のモーションベクターテクスチャにモーションベクターがレンダリングされます。詳細はスクリプトリファレンスの Renderer.motionVectors を参照してください。
Materials メッシュが一緒にレンダリングされる Materials のリストです。
Light Probes プローブに基づいたライトの補間モード
Reflection Probes この機能が有効で、リフレクションプローブがシーンに存在する場合、リフレクションテクスチャがオブジェクトのために取得され、ビルトインシェーダーの統一変数として設定されます。
Anchor Override ライトプローブや、リフレクションプローブが使用される場合、補間位置を決定するために使われるTransform。
Quality スキン化を行うときに各頂点に使用されるボーンの最大数を決定します。ボーンの数が多いほど、レンダラーの質が高くなります。Quality Settings から Blend Weights 値を使用するには、QualityAuto に設定します。
Skinned Motion Vectors 有効にすると、メッシュのスキンデータはダブルバッファリングされるので、スキン化されたモーションは補間されモーションベクターテクスチャに配置されます。これは、GPU メモリのオーバーヘッドになりますが、より正しいモーションベクターにすることができます。
Update When Offscreen 有効にすると、スキンメッシュがまったくカメラに映っていなくてもアップデートされます。無効にすると、オブジェクトがカメラに映っていない場合はアニメーションの再生も停止します。
Mesh レンダラーによって使用されるメッシュを定義します。
Root Bone アニメーションの “ルート” となるボーン (つまり、このボーンの動きは、他のすべてのボーンに影響を与えます) を定義します。
Bounds バウンディングボリュームは、メッシュをいつオフスクリーンにするかを決定します。バウンドは、メッシュとアニメーションのインポート時に、モデルファイルのメッシュとアニメーションから事前計算されます。シーンビューでモデルの周りにワイヤーフレームとして表示されます。

詳細

ボーン は、スキンされたメッシュ内部にあり、アニメーション時のメッシュ変形方法に影響する目に見えないオブジェクトです。基本的な考え方としては、ボーンは階層構造の “スケルトン” を形成するために互いに連結され、アニメーションはスケルトンの関節を回転させて動かすことによって定義されます。どのボーンにもその周囲を取り巻くメッシュの頂点がアタッチされます。アニメーションが再生されると、頂点がその接続されたボーンとともに動くため、スキンもスケルトンの動きに従って動きます。単純な関節 (肘など) では、メッシュの頂点は、繋がっている両方のボーンに影響され、ジョイントが曲げられると、メッシュはリアルに伸縮したり回転したりします。より複雑な状態では、2 本以上のボーンがメッシュの特定の領域に影響することになり、より繊細な動きを表現します。

スキンメッシュは事前計算アニメーションと一緒に使われるのが最も一般的ですが、スケルトンに含まれるすべてのボーンを物理エンジンで制御するために、リジッドボディ をアタッチすることも可能です。これは一般的にラグドール効果 (爆発の衝撃をうけたり、放り投げられる事によってキャラクターの手足が振り回される) を作成するために使われています。

Quality

Unity は頂点ごとに1本か2本、または4本のボーンを設定してスキン化できます。4本だと最良の結果になりますが、CPU のオーバーヘッドも高くなります。ゲームでは通常、ビジュアル品質とパフォーマンスの妥協点となる、2本でのウェイトを使用します。

QualityAuto に設定されると Quality SettingsBlend Weights の値が使用されます。これによりエンドユーザーが最適なパフォーマンスの品質設定を選択し、アニメーション品質とフレームレートの好みのバランスを設定することができます。

オフスクリーン時の更新

デフォルトでは、どのカメラにも表示されないスキンメッシュは更新されません。スキニングはメッシュが画面上に表示されるようになるまで、更新されません。これは、システムリソースを節約するために行われます。

オブジェクトのビジビリティはメッシュの Bounds によって決定されます (言い換えると、全体のバウンディングボリュームはあらゆる有効なカメラの視界角外にある必要があります)。ただし、アニメーションしているメッシュの実際のバウンディングボリュームは、アニメーションの再生によって変化します (例えば、キャラクターが手を頭上に伸ばすと、ボリュームの高さが増えます)。Unity は、すべてのアタッチされたアニメーションが最大のバウンディングボリュームになるときを考慮しますが、すべての使用可能な状況を予想してバウンディングボリュームを計算することは、不可能な場合があります。

以下のような状況では、ボーンや頂点が事前計算されたバウンディングボリュームの外に押し出されてしまい、問題が生じます。

  • ランタイム時にアニメーションを追加する場合
  • アニメーションを追加する場合
  • スクリプトを使ってボーンの位置を手順通りに変更する場合
  • 頂点シェーダーを使用して、事前計算された境界の外に頂点を押し出す場合
  • ラグドール物理を使用する場合

これらの例では、2 つの解決方法があります。

  1. Bounds (境界) を修正してメッシュの可能なバウンディングボリュームに適合するように修正します。
  2. Update When Offscreen をスキンに対して有効にし、常にスキンメッシュをレンダリングします。

通常は、パフォーマンスに与える影響も少ないため最初の方法を選択します。ただし、パフォーマンスを重視する必要がない場合や、バウンディングボリュームを予測できない場合 (例えばラグドール物理を使用する場合) に、2番目の方法を選択します。

スキンメッシュをラグドールとうまく連動させるために、インポート時、Unity は自動的にルートボーンに Skinned Mesh Renderer を再度割り当てます。ただし、Unity がこれを実行するのは、Skinned Mesh Renderer がモデルファイルに 1つしか存在しない場合のみです。つまり、すべての Skinned Mesh Renderer をルートボーンもしくは子供にアタッチできず、しかもラグドールを使用する場合、この最適化をオフにします。

スキンメッシュのインポート

スキンメッシュは、現在、以下からインポートできます。

  • Maya
  • Cinema4D
  • 3D Studio Max
  • Blender
  • Cheetah 3D
  • XSI
  • FBX 形式をサポートするツールすべて

モバイルデバイスでは、Unity はコーディングされた NEON/VFP 命令で CPU でスキニングします。ここでの制限は、法線とタンジェントは正規化されないため、自分でシェーダーを書く場合、自分で正規化を行う必要があるということです。ただし、サーフェス シェーダー を使用する場合は、Unity が自動的に正規化を行います。

注意 最適化されたメッシュでは、最適化されていないメッシュとは異なる方法でボーンをソートするので、結果、潜在的に重要なアニメーションの問題をもたらします。これは、最適化されたメッシュがボーンの名を利用し順番に依存しないのに対して、最適化されていないメッシュのアニメーションは、ボーンの順番に依存するためです。

単純にFBXファイルをインポートして使用するだけの場合は、Unity が変換のために処理を行います。

上級レベルのユーザー向けですが、SkinnedMeshRenderer.sharedMesh を変更したい場合、以下のように行います。

  1. ‘non-optimized’ (非最適化) モードで、厳密な方法で SkinnedMeshRenderer.bonesSkinnedMeshRenderer.sharedMesh に一致することを確認する必要があります。参照した Transforms はそこに正しい順番である必要があります。
  2. ‘optimized’ (最適化) モードでは、ずっと簡単です。アバターが参照されたボーンを持っている限り、正しくレンダリングが行われます。この場合、SkinnedMeshRenderer.bones は常に空です。
Mesh Renderer
Text Mesh