今回は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を引いてつなげたり、任意の画像を表示したりもできます。
公式リファレンスから確認してみましょう。
以上です。
参考資料