UnityのTransform.scaleは「相対的な倍率」であって、絶対的な「物理サイズ(メートル)」ではありません。
なぜ同じscale=1でも大きさが違うの?
→ BlenderからFBX(またはglTF)などでエクスポートされた際の「元々の大きさ(スケール)」が違うからです。
項目 | Blender | Unity |
---|---|---|
単位の基準 | 1 unit = 1 m(※実際はスケーリングに依存) | 1 unit = 1 m(デフォルト) |
エクスポート時のスケーリング | 見た目のスケール ≠ 実スケール | スケールはあくまで「倍率」 |
FBXエクスポート時の罠 | Apply Transformしないと見た目と内部スケールがズレる | FBXの中の実スケールをそのまま使う |
解決方法:Blenderから正しくスケールを保ったままエクスポートする
Blender側の準備
- 適用(Apply All Transforms)する
Ctrl + A
→ 「Scale」「Rotation」「Location」全部適用しておく- これで「見た目と実スケール」が一致する
- 正しい単位設定にしておく
- Blender右下のプロパティパネル →
Scene
→Unit
- 単位:
Metric
- Scale:
1.0
- 単位:
- これで「1m = 1 Blender Unit = 1 Unity Unit」になる
- Blender右下のプロパティパネル →
- FBX書き出し時の設定
- エクスポート時に Apply Transform にチェック ✅
- または、Scaleを1.0に固定で出力
Unity側で確認すること
- インポートされたモデルの実寸を確認するには?
- シーン上でモデルの
Renderer.bounds
を見る(実際のサイズ) Transform.scale
は倍率にすぎない!
- シーン上でモデルの
- 「小さく見える」モデルがscale=1でも、メッシュ自体が小さいだけかも!
まとめ:スケール問題の本質
問題 | 原因 | 解決策 |
---|---|---|
同じscale=1なのにサイズが違う | モデルの「メッシュ実寸」が違う | BlenderでApply Transformして出力 |
BlenderとUnityでサイズが合わない | 単位設定やエクスポート時のscale不一致 | BlenderのUnit設定&FBXのApply Transform |
スケール調整手順(実寸に合わせる)
① モデルの現在のサイズを調べる
- オブジェクトモードでモデルを選択
N
キー → サイドバーの「Item」パネルを開く- 「Dimensions(寸法)」を確認
- 例:Z軸方向が
4.5
→ 高さ4.5m(=450cm)
- 例:Z軸方向が
② 目標サイズを決める
たとえば「高さ1.8mにしたい」なら、
1.8 ÷ 4.5 = 0.4(= 40%) に縮小すればOK。
③ スケーリングする
S
キー → モデルをスケール縮小(数値入力OK)- この例なら
S
→0.4
→Enter
- この例なら
- スケール適用(重要!)
Ctrl + A
→ 「Apply Scale」で確定- これを忘れると、FBXエクスポート時にサイズがズレる
補足:Blenderの単位系を明示的に「現実寄り」に設定する
- プロパティエディタ →
Scene
タブ(地球アイコン) - 「Units」セクションで:
設定項目 | 推奨値 |
---|---|
Unit System | Metric(メートル系) |
Unit Scale | 1.0(1BU = 1m) |
Length | Meters(必要なら Centimeters) |
→ これでBlender内のサイズと現実の物理サイズが一致します。
モデルの現実スケールに関する注意点
- モデル作成者が必ずしも現実スケールを意識して作っているとは限らない
- 既存モデルやアセットを読み込んだら、サイズの再確認が超重要
- Unityなど外部エンジンと連携するなら1BU = 1m = 1 Unity unitの前提が一番トラブルが少ない
まとめ
やりたいこと | 手順 |
---|---|
モデルを現実サイズにしたい | 寸法(Dimensions)を確認 → 目標サイズでスケール調整 → Ctrl + A で適用 |
Blenderを実寸ベースで使いたい | SceneのUnitsを「Metric」「Unit Scale = 1.0」に設定 |
nityの3Dオブジェクトの「寸法(実サイズ)」を取得するには
Renderer.bounds.size を使うのが基本です!
csharpコピーする編集するVector3 size = GetComponent<Renderer>().bounds.size;
解説
Renderer.bounds
は ワールド空間上の軸揃えバウンディングボックス(AABB)を返します- つまり:回転やスケーリングを含めた「見た目上のサイズ」
- 単位は Unity Units(≒メートル)
例:幅・高さ・奥行きを取得するコード
Renderer renderer = GetComponent<Renderer>(); Vector3 size = renderer.bounds.size; float width = size.x; float height = size.y; float depth = size.z; Debug.Log($"Size: W:{width} H:{height} D:{depth}");
MeshFilter.sharedMesh.bounds との違い
プロパティ | 空間 | スケール反映 | 用途 |
---|---|---|---|
Renderer.bounds | ワールド空間 | 含まれる | 「見た目」のサイズ取得に最適 |
Mesh.bounds | ローカル空間 | スケール未反映 | プリミティブなサイズだけ欲しい時向き |
コライダーのサイズが知りたい場合は?
たとえば BoxCollider
の場合:
BoxCollider box = GetComponent<BoxCollider>(); Vector3 size = Vector3.Scale(box.size, transform.lossyScale); // スケールを考慮
box.size
はローカル空間サイズなので、ワールド空間で正確にしたい場合は transform.lossyScale
との積が必要です。
結論(用途別にまとめ)
目的 | 使うもの |
---|---|
見た目の大きさが知りたい | Renderer.bounds.size |
メッシュの元サイズを知りたい(スケーリング無視) | MeshFilter.sharedMesh.bounds.size |
UIのサイズ | RectTransform.sizeDelta |
コライダーのサイズ(ワールドスケール) | BoxCollider.size * transform.lossyScale |
コメント