UnityとBlenderのオブジェクトサイズ

スポンサーリンク
3Dモデリング
スポンサーリンク
↑管理人が個人でUnity+Live2Dで作成しているスマホゲームです

UnityのTransform.scaleは「相対的な倍率」であって、絶対的な「物理サイズ(メートル)」ではありません。

なぜ同じscale=1でも大きさが違うの?
→ BlenderからFBX(またはglTF)などでエクスポートされた際の「元々の大きさ(スケール)」が違うからです。

項目BlenderUnity
単位の基準1 unit = 1 m(※実際はスケーリングに依存)1 unit = 1 m(デフォルト)
エクスポート時のスケーリング見た目のスケール ≠ 実スケールスケールはあくまで「倍率」
FBXエクスポート時の罠Apply Transformしないと見た目と内部スケールがズレるFBXの中の実スケールをそのまま使う
スポンサーリンク

解決方法:Blenderから正しくスケールを保ったままエクスポートする

Blender側の準備

  1. 適用(Apply All Transforms)する
    • Ctrl + A → 「Scale」「Rotation」「Location」全部適用しておく
    • これで「見た目と実スケール」が一致する
  2. 正しい単位設定にしておく
    • Blender右下のプロパティパネル → SceneUnit
      • 単位:Metric
      • Scale:1.0
    • これで「1m = 1 Blender Unit = 1 Unity Unit」になる
  3. 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

スケール調整手順(実寸に合わせる)

① モデルの現在のサイズを調べる

  1. オブジェクトモードでモデルを選択
  2. Nキー → サイドバーの「Item」パネルを開く
  3. 「Dimensions(寸法)」を確認
    • 例:Z軸方向が4.5 → 高さ4.5m(=450cm)

② 目標サイズを決める

たとえば「高さ1.8mにしたい」なら、
1.8 ÷ 4.5 = 0.4(= 40%) に縮小すればOK。

③ スケーリングする

  1. Sキー → モデルをスケール縮小(数値入力OK)
    • この例なら S0.4Enter
  2. スケール適用(重要!)
    • Ctrl + A → 「Apply Scale」で確定
    • これを忘れると、FBXエクスポート時にサイズがズレる

補足:Blenderの単位系を明示的に「現実寄り」に設定する

  1. プロパティエディタ → Scene タブ(地球アイコン)
  2. 「Units」セクションで:
設定項目推奨値
Unit SystemMetric(メートル系)
Unit Scale1.0(1BU = 1m)
LengthMeters(必要なら 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
1 Star2 Stars3 Stars4 Stars5 Stars (まだ投票されていません)
読み込み中...

コメント

広告ブロッカーを無効にしてください。

タイトルとURLをコピーしました