1.

Unity Skinned Mesh Renderer 完全ガイド — ボーン・BlendShape・最適化

編集
この記事の要点
  • Skinned Mesh Rendererボーン (Bone) と連動して変形するメッシュレンダラー
  • 通常の Mesh Renderer は剛体描画のみ、Skinned は人型・動物・布など可動キャラ用
  • Bone Weight (頂点ごとのボーン影響度) と Bind Pose がスキニングの肝
  • 表情変化は BlendShapes (頂点モーフ) で実装、笑顔・口パク等
  • 最適化: Skin Weights 設定、Optimize Game Objects、GPU Skinning

Skinned Mesh Renderer とは

3D キャラクターを動かす際、頂点が ボーン に追従して変形する仕組みを スキニング (Skinning) と呼びます。Unity でこの機能を担うコンポーネントが Skinned Mesh Renderer です。

FBX / glTF キャラクターを Unity にインポートすると、自動的に Skinned Mesh Renderer が割り当てられます。

Mesh Renderer との違い

項目Mesh RendererSkinned Mesh Renderer
対象剛体オブジェクト (建物・道具)可動キャラ (人・動物)
変形不可 (Transform 全体のみ)ボーンごとに変形
必要 ComponentMesh Filter + Mesh RendererSkinned Mesh Renderer 単体
負荷軽い重い (頂点計算)
BlendShape不可

主要プロパティ

プロパティ意味
Mesh描画するメッシュ (FBX 内のもの)
Materials描画マテリアル (複数可)
Root Boneボーン階層の根 (通常 Hips)
Bones影響を受ける全ボーンの Transform 配列
QualityBone Weight の品質 (1/2/4 本)
Update When Offscreen画面外でも変形計算するか
Skinned Motion Vectorsモーションブラー用
BlendShapes表情モーフのスライダー

ボーンと Bone Weight

各頂点は 最大 4 個 のボーンから影響を受け、その重み (Weight) の合計が 1.0 になるよう正規化されています。

頂点 V (肘の内側)
  ├ Upper Arm Bone:  Weight 0.6
  └ Lower Arm Bone:  Weight 0.4
                    合計 1.0

→ Upper Arm が 30 度回転すれば V は Upper Arm の動きを 60%、
  Lower Arm の動きを 40% 取り込む形で移動する

Avatar と Rig (Humanoid / Generic)

FBX インポート時に Rig を設定します。

Rig 種類用途備考
Humanoid人型キャラAvatar 経由でモーション使い回し可
Generic4 足獣・モンスターモーションはそのキャラ専用
Legacy旧 Animation システム非推奨
Noneスキニングなし背景小物

Humanoid を選ぶと Avatar が生成され、別キャラの Animation Clip を流用できます (リターゲティング)。

BlendShapes (表情・口パク)

同じトポロジで形だけ違う モーフターゲット をブレンドする仕組みです。

using UnityEngine;

public class FaceController : MonoBehaviour {
    [SerializeField] private SkinnedMeshRenderer face;

    void Update() {
        // BlendShape の値は 0–100
        // 「Smile」という名前の BlendShape を 0→100 で笑顔に
        int index = face.sharedMesh.GetBlendShapeIndex("Smile");
        face.SetBlendShapeWeight(index, 100f);

        // 口パク: A / I / U / E / O を音量に応じて
        float volume = GetCurrentVolume();
        face.SetBlendShapeWeight(0, volume * 100f);
    }

    float GetCurrentVolume() { return 0.5f; }
}

スクリプトから Skinned Mesh Renderer を扱う

SkinnedMeshRenderer smr = GetComponent();

// マテリアル変更
smr.material.color = Color.red;

// ボーン参照
foreach (Transform b in smr.bones) {
    Debug.Log(b.name);
}

// 衣装替え: メッシュとボーンを差し替え
SkinnedMeshRenderer newCloth = newClothPrefab.GetComponent();
Transform[] newBones = new Transform[newCloth.bones.Length];
for (int i = 0; i < newBones.Length; i++) {
    newBones[i] = FindBone(transform, newCloth.bones[i].name);
}
smr.sharedMesh = newCloth.sharedMesh;
smr.bones = newBones;
smr.rootBone = FindBone(transform, newCloth.rootBone.name);

Transform FindBone(Transform root, string name) {
    foreach (Transform t in root.GetComponentsInChildren()) {
        if (t.name == name) return t;
    }
    return null;
}

パフォーマンス最適化

Quality Level の Skin Weights

Edit → Project Settings → Quality → Skin Weights:

  • 1 Bone — 最速。剛体的な変形 (関節がカクつく)
  • 2 Bones — 軽量モバイル向け
  • 4 Bones — 標準 (関節滑らか)
  • Unlimited — 最高品質 (8 本制限)

Optimize Game Objects

FBX Import Settings → Rig タブ → Optimize Game Objects にチェック。Hierarchy 上のボーン GameObject が消え、内部配列化されて高速化します。

その他の最適化

  • GPU Skinning (Player Settings) を有効化
  • Update When Offscreen を OFF にして画面外停止
  • 遠距離は LOD Group で低ポリ Skinned に切替、最遠距離は Mesh Renderer に
  • BlendShape 多用時は Legacy Clip Importer を避ける

よくあるトラブル

症状原因対処
関節がガタつくSkin Weights が 1 BoneQuality Settings で 4 Bones へ
画面外でアニメ停止Update When Offscreen 未設定影だけ必要ならチェック ON
メッシュが膨らんで描画されるBounds が小さいLocal Bounds を拡大
BlendShape が反映されないFBX で BlendShape を未インポートModel → Import BlendShapes ON
Optimize で他スクリプトが壊れるボーン GameObject が消えたExtra Exposed Transforms に追加

FAQ

Q: Skinned と Mesh Renderer を併用したい (剣や帽子)
A: 剣は手のボーンを親にして通常の Mesh Renderer で OK。帽子は頭ボーンの子。

Q: Cloth (布) シミュは別物?
A: 別 Component の Cloth ですが、Skinned Mesh Renderer 上にあるメッシュを対象にします。

Q: Skinned の頂点位置をスクリプトで取得したい
A: smr.BakeMesh(mesh) でその瞬間のスナップショットを取得できます。

編集
Post Share
子ページ

子ページはありません

同階層のページ

同階層のページはありません