Restart of Unity – No.04(オブジェクトのサイズ)

対象バージョン:Unity 2019.4.1f1(LTS)

Unityでの単位

Unityでの長さの単位はm(メートル)、重さの単位はKg(キログラム)です。

※UnityのManualやCommunityで「Defaultではそうだ」と書かれていますが、自分で設定変更する方法は分かりません。ただ、人と話したり、開発したりする際に単位をそろえておく事は重要なので、単位が統一されているというのは良い事かも知れません。

オブジェクトのサイズは?

さて、Hierarchyビュー・Sceneビューにオブジェクトを配置した際、オブジェクトのサイズを確認しようと、Inspectorビューを確認してみると…

基本的にはScale(スケール)しか表示されていません。

表示サイズ = メッシュデータのサイズ × スケール

のはずですが、もともとのメッシュデータのサイズがどこにも見当たりません…

サイズ確認用スクリプト

一生懸命調べるよりも、早いだろうという事で、サイズ確認用スクリプトを作成してみました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SizeCheck : MonoBehaviour
{
    // 実行後、Inspector表示用
    public Vector3 originalSize;
    public Vector3 realSize;

    // Start is called before the first frame update
    void Start()
    {
        // メッシュの(バウンズ)サイズを取得
        Mesh mesh = transform.GetComponent<MeshFilter>().mesh;
        Bounds bounds = mesh.bounds;
        originalSize = bounds.size;

        // スケールを掛け合わせた実際のサイズを取得
        realSize = bounds.size;
        realSize.x *= transform.localScale.x;
        realSize.y *= transform.localScale.y;
        realSize.z *= transform.localScale.z;

        // Consoleへ表示
        print(string.Format("name = {0} : Original Size(m) = ({1}, {2}, {3}), Real Size(m) = ({4}, {5}, {6})",
            this.name,
            originalSize.x, originalSize.y, originalSize.z,
            realSize.x, realSize.y, realSize.z));
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

※メッシュのBounds(境界)を取得してサイズとして表示するスクリプトです。

実際に動かして確認

作成したスクリプトをサイズを確認したいオブジェクトに追加して、Play(▶)ボタンを押して、Consoleビューで確認してみます。

name = Cube : Original Size(m) = (1, 1, 1), Real Size(m) = (1, 1, 1)
name = Sphere : Original Size(m) = (1, 1, 1), Real Size(m) = (1, 1, 1)
name = Capsule : Original Size(m) = (1, 2, 1), Real Size(m) = (1, 2, 1)
name = Cylinder : Original Size(m) = (1, 2, 1), Real Size(m) = (1, 2, 1)
name = Plane : Original Size(m) = (10, 2.220446E-16, 10), Real Size(m) = (10, 2.220446E-16, 10)
name = Quad : Original Size(m) = (1, 1, 6.123234E-17), Real Size(m) = (1, 1, 6.123234E-17)

PlaneやQuadは厚みが「2.220446^-16」となっていますが、まぁ「0」でいいでしょう。

ちなみに、Emptyオブジェクト(Meshを持たないオブジェクト)では、下記の様なエラーとなります。

MissingComponentException: There is no 'MeshFilter' attached to the "Empty" game object, but a script is trying to access it.
You probably need to add a MeshFilter to the game object "Empty". Or your script needs to check if the component is attached before using it.

まとめ

Unityの3Dオブジェクトの元々のサイズは下記の様になります。

種類xyz
Cube1(m)1(m)1(m)
Sphere1(m)1(m)1(m)
Capsule1(m)2(m)1(m)
Cylinder1(m)2(m)1(m)
Plane10(m)0(m)10(m)
Quad1(m)1(m)0(m)

(Planeが基本10m ×10mなんですね。どおりで、Scaleに(10,1,10)を指定すると大きくなる訳です。)

IMPORTしたデータも、サイズ確認用スクリプトで確認ができます。

※変更不可能でもいいので、Inspectorビューにサイズ情報を表示して欲しいものです。


前の記事次の記事
No.03(照明の設定)No.05(AdMobの導入でハマった件)