Raspberlyのブログ

Raspberlyのブログ

Unityネタをメインとした技術系ブログです。にゃんこ大戦争や日常なども。そろそろブログタイトル決めたい

【Unity】空のGameObjectを可視化する【Gizmos】

今回はUnityネタをやっていきます。
Gizmosを使って空のGameObjectを可視化する方法についてまとめます。

 

やりたいこと

Prefabを配置する時、位置参照用に空のGameObjectを配置して使うが多いと思います。
しかし空のGameObjectなので選択しない限りはSceneビュー上で見ることができません
そこで、今回はGizmosを使って空のGameObjectを可視化してみます。

 

 

Gizmosの表示

Gizmosの表示はOnDrawGizmos()を使用します。
適当なScript内にOnDrawGizimos()を書いて、それをGameObjectにアタッチします。

using UnityEngine;

public class DrawGizmos : MonoBehaviour
{
    private void OnDrawGizmos()
    {
        // ここに表示したいものを書く
    }
}

 

Gizmosの有効化

Gizmosを表示するためにはGizmosの表示を有効にしておきます。
右上のボタンが押されていることを確認しましょう。

 

 

Objectの表示

最も単純なObjectの表示

SphereやCubeを表示

Gizmos.Draw○○()で表示します。第二引数はScaleの値です。

        private void OnDrawGizmos()
        {
            Gizmos.DrawSphere(transform.position, 0.2f);
        }

Sphereが表示されました。

 

Cubeの場合はGizmos.DrawCube()を使います。

        private void OnDrawGizmos()
        {
            Gizmos.DrawCube(transform.position, new Vector3(0.2f, 0.2f, 0.2f));
        }

 

 

ワイヤーフレームで表示

Gizmos.DrawWire○○()ワイヤーフレームにできます

        private void OnDrawGizmos()
        {
            Gizmos.DrawWireSphere(transform.position, 0.3f);
        }

 

 

色を変える

Gizmos.colorを書き換えると色が変わります

        private void OnDrawGizmos()
        {
            Gizmos.color = Color.green;
            Gizmos.DrawSphere(transform.position, 0.2f);
        }

 

 

 

Textの表示

UnityEditor.Handles.Label()*1*2を使って文字を表示します。

#if UNITY_EDITOR
        private void OnDrawGizmos()
        {
            UnityEditor.Handles.Label(transform.position, "point");
        }
#endif

変数を渡して何かの値を表示するという使い方もできますね。

 

位置の調整

Gizmos.DrawSphere()などと併用するとTextが埋まるので位置を変えるといいです

        private void OnDrawGizmos()
        {
            var position = transform.position;
            Gizmos.color = Color.green;
            Gizmos.DrawSphere(position, 0.2f);
            
            UnityEditor.Handles.Label(position + new Vector3(0, 0.4f, 0), "point");
        }

 

 

スタイルの調整(フォントサイズ、色、整列)

GUIStyleを使ってスタイルを変えることもできます

        private void OnDrawGizmos()
        {
            var position = transform.position;
            Gizmos.color = Color.green;
            Gizmos.DrawSphere(position, 0.2f);
            
            var style = new GUIStyle();
            style.fontSize = 20;
            style.normal.textColor = Color.white;
            style.alignment = TextAnchor.MiddleCenter;
            UnityEditor.Handles.Label(position + new Vector3(0, 0.5f, 0), "point", style);
        }

 

 

 

カメラからの距離によって表示を変える

たくさんGizmoがある状態でカメラを引いた時ごちゃごちゃして見えにくいです。

そのためカメラの距離によって見え方を変えてみます。

 

カメラが近い時だけ表示する

SceneビューのCameraを取得し、距離が離れたら表示しないようにします。

        private void OnDrawGizmos()
        {
            var position = transform.position;
            var sceneCamera = UnityEditor.SceneView.currentDrawingSceneView.camera;
            var cameraDistance = Vector3.Distance( sceneCamera.transform.position , position);
            if(cameraDistance > 50) return;
            
            Gizmos.color = Color.green;
            Gizmos.DrawSphere(position, 0.2f);
            
            var style = new GUIStyle();
            style.fontSize = 20;
            style.normal.textColor = Color.white;
            style.alignment = TextAnchor.MiddleCenter;
            UnityEditor.Handles.Label(position + new Vector3(0, 0.5f, 0), "point", style);
        }

 

 

 

 

まとめ

今回は空のGameObjectを可視化してみました。
Sceneビュー上で確認できるので位置合わせなどでとても便利ですね。

 

他にもLineを引いてつなげたり、任意の画像を表示したりもできます。
公式リファレンスから確認してみましょう。

docs.unity3d.com

 

以上です。

 

 

参考資料

www.urablog.xyz

sleepygamersmemo.blogspot.com

 

game.daraha.me

 

www.urablog.xyz

 

tsubakit1.hateblo.jp

 

nakamura001.hatenablog.com

 

 

youtu.be

 

*1:#if UNITY_EDITORで囲んでおくといいでしょう

*2:UnityEditorはusingしておいてもいいです