以下の内容はhttps://kafkafinancialgroup.hatenablog.com/entry/2025/05/15/002252より取得しました。


Unity SkinnedMeshRenderer

Unity SkinnedMeshRendererは、キャラクターやオブジェクトの変形可能なメッシュをレンダリングするための強力なコンポーネントです。このコンポーネントはボーンアニメーションやブレンドシェイプなどの技術を利用して、3Dモデルに自然な変形と動きを与えます。本レポートでは、SkinnedMeshRendererの基本機能から高度な使用方法まで詳細に解説します。

SkinnedMeshRendererの基本概念

SkinnedMeshRendererコンポーネントは、可変(deformable)メッシュをレンダリングするために設計されています。このコンポーネントは主に以下のタイプのメッシュを扱います:

  • スキンされたメッシュ(ボーンとバインドポーズを持つメッシュ)
  • ブレンドシェイプを持つメッシュ
  • クロス(布)シミュレーションを実行するメッシュ

通常のメッシュをレンダリングする場合は、代わりにMesh RendererとMesh Filterコンポーネントの組み合わせが使用されます。可変メッシュやそれを持つモデルをシーンに追加すると、Unityは自動的に生成されたゲームオブジェクトにSkinnedMeshRendererコンポーネントを追加します[2][4][17]。

SkinnedMeshRendererクラスは、Rendererクラスから多くの機能を継承しており、Line RendererやTrail Rendererなどの他のレンダリングコンポーネントと共通点があります[2][4]。

ボーンとスキニングの仕組み

ボーンは、スキンメッシュ内部にある目に見えないオブジェクトで、アニメーション時のメッシュ変形方法に影響します。これらのボーンは互いに連結されて階層構造の「スケルトン」を形成し、関節を回転させて動かすことでアニメーションを作成します[6]。

各ボーンには周囲のメッシュ頂点の一部が割り当てられ、アニメーション再生時に頂点はそれに接続されたボーンと共に動きます。これにより、「スキン」がスケルトンの動きに追従する効果が生まれます[6]。

主要プロパティと設定

SkinnedMeshRendererコンポーネントには多数の重要なプロパティがあります。主なものは以下の通りです:

基本設定

プロパティ 説明
Mesh レンダラーが使用するメッシュを設定します。メッシュは有効なバインドポーズとスキンウェイト、またはブレンドシェイプを持つ必要があります[2][4]
Bones スキンメッシュのボーンを参照します。スケルトンの階層構造を表します[1]
Root Bone ケルトンの「ルート」となるTransformを設定します。バウンディングボリュームはこのトランスフォームに沿って移動します[2][4]
Quality 頂点に影響を与えることができるボーンの最大数のランタイム上限を設定します。値が大きいほど動きの品質は向上しますが、計算リソースも増加します[2][4][6]
BlendShapes メッシュに定義されたブレンドシェイプに使用するウェイト値を保存します[2][4][6]

パフォーマンス関連設定

プロパティ 説明
Update When Offscreen 有効にすると、メッシュがカメラの視野外にあってもアップデートします。無効の場合、画面外ではアニメーションの更新も停止します[2][4][9]
Bounds Unityがメッシュをいつオフスクリーンとして扱うかを決定するバウンディングボリュームを設定します[2][4]
Skinned Motion Vectors 有効にすると、メッシュのスキンデータがダブルバッファリングされ、より正確なモーションベクトルの計算が可能になりますが、GPUメモリのオーバーヘッドが増加します[6]

主要メソッドと実装テクニック

SkinnedMeshRendererクラスには、さまざまな操作のための便利なメソッドが用意されています。特に重要なものを以下に示します:

BakeMeshメソッド

BakeMesh()は現在のスキンメッシュの状態を通常のメッシュに「焼き付ける」機能を提供します。これは特に、以下のような場合に便利です:

Mesh bakedMesh = new Mesh();
skinnedMeshRenderer.BakeMesh(bakedMesh);

このメソッドを使用すると、特定のポーズでのメッシュの状態を取得できますが、頂点数の多いメッシュでは処理に時間がかかる場合があります[3][8]。例えば約7000頂点のメッシュでは、実行に約15msかかるケースが報告されています[3]。

ブレンドシェイプの操作

ブレンドシェイプは、メッシュの形状を変形させるための強力なツールです。以下のメソッドを使用して操作できます:

  • SetBlendShapeWeight(int index, float weight): 特定のブレンドシェイプの重みを設定します[1]
  • GetBlendShapeWeight(int index): 特定のブレンドシェイプの現在の重みを取得します[1]

Unity 2023では、ブレンドシェイプのGPU処理が改善され、パフォーマンスが向上しています[7]。

パフォーマンス最適化戦略

SkinnedMeshRendererを効率的に使用するためのいくつかの重要な最適化戦略があります:

スキンウェイトの最適化

頂点あたりの影響するボーン数は、パフォーマンスに大きな影響を与えます。ボーンの影響数が多いほど品質は向上しますが、計算コストも増加します[2][4][6]。

  • 1 Bone: 最も軽量だが、変形の品質は低下
  • 2 Bones: ゲームでよく使われる一般的な設定。品質とパフォーマンスのバランスが良い
  • 4 Bones: より高品質な変形が可能だが、より多くのリソースを消費
  • Auto: Quality Settingsで設定したグローバル制限を使用

パフォーマンスを最適化するには、モデルのインポート設定で頂点に影響するボーン数を適切に設定することが推奨されます[2][4]。

スタティックメッシュへの変換

アニメーションしないスキンメッシュは、MeshRendererに変換することでパフォーマンスを大幅に向上できます。「SkinnedMeshBaker」のようなツールを使用すると、現在のポーズを保持したままMeshRendererに変換できます[5]。

// ポーズを「焼き付け」てMeshRendererに変換する例
Mesh bakedMesh = new Mesh();
skinnedMeshRenderer.BakeMesh(bakedMesh);

// 新しいMeshRendererを設定
GameObject newObj = new GameObject("BakedMesh");
MeshFilter meshFilter = newObj.AddComponent();
meshFilter.mesh = bakedMesh;
MeshRenderer meshRenderer = newObj.AddComponent();
meshRenderer.materials = skinnedMeshRenderer.materials;

これにより描画負荷が「圧倒的に軽く」なり、ボーンでアニメーションしないメッシュではこのアプローチが推奨されます[5]。

バウンディングボリュームの管理

SkinnedMeshRendererのバウンディングボリュームは変形に伴って変化します。Unityはインポート時にすべてのアニメーションを考慮して最大のバウンディングボリュームを計算します[2][4]。

しかし、インポート後に追加されたアニメーションや極端な変形により、頂点やボーンが既知の最大境界の外に出ると、メッシュが正しく表示されない問題が発生することがあります。この問題に対処するには以下の方法があります:

  1. Boundsプロパティを手動で調整
  2. Update When Offscreenを有効にして動的に境界を更新

応用例と高度なテクニック

パーティクルシステムとの連携

Particle SystemのShapeモジュールで「Skinned Mesh Renderer」を選択することで、キャラクターのアニメーションに合わせてパーティクルエフェクトを生成できます[13]。これにより、キャラクターに炎やオーラなどのエフェクトを追加する際に、アニメーションの動きに追従させることが可能になります。

カスタムスキニングとGPU実装

高度なパフォーマンス最適化では、カスタムのスキニングシェーダやコンピュートシェーダを実装することも選択肢になります[7]。Unity 2023では公式にスキニングとブレンドシェイプ両方のGPUパフォーマンス改善が導入されていますが、さらなる最適化が必要な場合は、カスタム実装を検討することもできます[7]。

Mesh Bindposesの活用

BakeMeshで得られたメッシュをSkinnedMeshRendererで再利用する場合、適切なbindposesの設定が重要になります:

mesh.bindposes = skinnedMeshRenderer.bones.Select(x => x.worldToLocalMatrix).ToArray();

これにより、ミラーリングなどの変換を正しく処理できます[8]。

結論

SkinnedMeshRendererはUnityにおけるキャラクターアニメーションや変形メッシュの表現に不可欠なコンポーネントです。適切に設定・最適化することで、高品質なアニメーションを維持しながらもパフォーマンスへの影響を最小限に抑えることができます。アプリケーションの要件に合わせて、ボーン数の制限、Update When Offscreenの適切な設定、必要に応じたMeshRendererへの変換など、様々な最適化戦略を組み合わせることが重要です。

また、将来的なUnityのバージョンではGPU処理の最適化が進み、特にBlendShapeやスキニング処理の効率が向上することが期待されます。最新のバージョンの機能を理解し活用することで、より効率的で高品質な3Dキャラクター表現が可能になるでしょう。




以上の内容はhttps://kafkafinancialgroup.hatenablog.com/entry/2025/05/15/002252より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14