【Blender→Unity】FBXでボーンが消える/スケールが100倍になる罠と原因
投稿日: 2026年6月23日
対象読者: BlenderからUnityへFBXでスキンメッシュやリグを持ち込んでいて、表示・スケールでハマっているエンジニア
この記事はこんな方向け:
- BlenderからエクスポートしたFBXが、Unityに入れるとモデルが表示されない方
- 再生時に「ボーンが見つからない」系のnull例外が出る方
- モデルが巨大すぎて(または極小で)カメラに収まらない方
TL;DR
- ボーンが丸ごと消えるのは、アーマチュアを「非表示のまま」
use_selection=Trueで書き出したから - 書き出し前に必ずアーマチュアを表示(unhide)し、再Import後にボーン数を検証する
- モデルが巨大なのは、Blenderがcm単位でエクスポートしてスケールが100倍になっているから
- アーマチュアの位置・回転・スケールをApplyしてからエクスポートするのが根本解決
はじめに
PoseMirrorやその関連モデルの制作では、Blenderで作った人体モデルをFBXでUnityに渡す工程が何度も発生します。ここで地味に時間を溶かしたのが「Unityに入れたのにモデルが表示されない」という症状でした。コードもリグ設定も間違っていないのに表示されない——原因はどちらもFBXエクスポートの設定にありました。よくある2つの罠を、実際にハマった順でまとめます。
罠①:アーマチュアが非表示だとボーンが丸ごと消える
症状
Blenderでスケールを直してFBXを書き出し、Unityにインポート。ところがシーンに置いてもモデルが表示されない。再生すると、ボーンを参照しているスクリプト(自前の CacheBones() のような初期化処理)が、参照すべきボーンを見つけられずにnull例外で止まる。
エラーが「表示されない」「null例外」という間接的な形なので、最初はインポート設定やスクリプトのバグを疑ってしまいます。
原因
犯人はBlender側のエクスポート時の状態でした。アーマチュアをアウトライナーで非表示(hide_set(True))にしたまま、選択オブジェクトのみを書き出す設定でエクスポートしていたのです。
# これがハマりの元:アーマチュアが非表示のまま選択書き出し
bpy.ops.export_scene.fbx(
filepath="model.fbx",
use_selection=True, # 選択オブジェクトのみ。非表示物は対象外になりやすい
)
use_selection=True で書き出すとき、非表示のオブジェクトは選択・エクスポート対象から外れます。結果、メッシュは出てもアーマチュア(=ボーン階層)がFBXに含まれず、Unity側にはスキンの当たり先がない状態で渡ってしまいます。Unityのインポータはエラーを出さないことも多く、後段のスクリプトで初めて顕在化するため発見が遅れます。
解決
書き出す前に、必ずアーマチュアを表示してから選択する。これだけです。
# アーマチュアを表示してから選択 → 書き出し
armature = bpy.data.objects["Armature"]
armature.hide_set(False) # 目のアイコンを表示に
armature.select_set(True)
bpy.ops.export_scene.fbx(
filepath="model.fbx",
use_selection=True,
)
さらに、Unityに再Importした直後に「期待するボーン数になっているか」を自動チェックすると、このミスを早期に検知できます(このモデルは65本だったので、その数と照合)。人的ミスを目視に頼らない仕組みにしておくのが安全です。
// 再Import後にボーン数を検証(期待値と違えば即気づける)
var bones = skinnedMeshRenderer.bones;
Debug.Assert(bones.Length == 65, $"ボーン数が不正: {bones.Length}(期待65)");
罠②:スケールが100倍になりモデルが巨大化する
症状
ボーン問題を直した後、今度はモデルが巨大すぎてカメラの中に収まらず、3Dビューに何も映らない。「また表示されない」と一瞬焦りますが、実際にはカメラの内側にモデルが展開していて、画面いっぱいが単色になっている状態でした。
原因
Blender側がcm単位でFBXをエクスポートしており、Unity(メートル基準)に持ち込むとスケールが約100倍になっていました。ボーンのワールドスケールを見ると0.8mm前後といった極端な値になっていて、単位換算が噛み合っていないのが一目で分かります。
スケールが100倍/100分の1にズレる典型要因は次の2つです。
- BlenderのUnit ScaleとFBXエクスポートのスケール設定(cm⇄m)の不一致
- アーマチュアやメッシュにApplyしていないスケールが残っている
解決
エクスポート前に、アーマチュアの位置・回転・スケールをApplyして素直な状態にし、単位を明示します。
# 位置・回転・スケールをApplyしてから書き出す
bpy.ops.object.select_all(action='DESELECT')
armature.select_set(True)
bpy.context.view_layer.objects.active = armature
bpy.ops.object.transform_apply(location=True, rotation=True, scale=True)
bpy.ops.export_scene.fbx(
filepath="model.fbx",
use_selection=True,
global_scale=1.0,
apply_unit_scale=True, # 単位換算を明示
)
アーマチュアのlocationをApplyして原点に置き、スケールも1.0に焼き込んでから出すのが根本解決です。再Import後にモデルがUnity内で常識的なサイズ(人体ならおよそ1.6〜1.8m)に収まることを確認すれば完了です。
| 症状 | 真の原因 | 対策 |
|---|---|---|
| Unityでモデルが見えない・null例外 | 非表示アーマチュアが書き出しから漏れ、ボーン欠落 | unhideしてから選択・書き出し+ボーン数検証 |
| モデルが巨大/極小でカメラに収まらない | cm⇄mの単位ズレでスケール100倍 | transform_applyで焼き込み+単位設定を明示 |
まとめ
- BlenderからのFBXで「表示されない」ときは、まずアーマチュアの表示状態とエクスポート対象を疑う
- 非表示のまま選択書き出しするとボーンが消える。書き出し前にunhideし、Unity側でボーン数を検証する
- 巨大化はcm⇄mの単位ズレが原因。transform_applyと単位設定の明示で直る
- どちらもコードやリグではなく「エクスポート時の状態」が原因という共通点がある
このパイプラインで作ったモデルは、MediaPipeとUnity WebGLでポーズ推定を動かす仕組みの記事や、写真からポーズを3D化する Pose Mirror 本体で動いています。