【Unity】デバッグ用の「Gizmos(ギズモ)」を使いこなして開発効率をアップさせる方法

ゲーム開発

今回はUnityにおける開発効率化に関する話題で

デバッグ用のGizmos(ギズモ)を使って開発効率をアップさせる方法

をサンプルスクリプト付きでご紹介するという内容になっております。

Unityでゲームを作っていると

  • 敵キャラクターの巡回ポイントなどを設定するために空のゲームオブジェクトをシーン上に配置する
  • トリガーコライダーだけのゲームオブジェクトなど、3Dメッシュがなく不可視のゲームオブジェクトを設置する

といったことがよくあると思います。でも空のゲームオブジェクトはそもそも目に見えないし、コライダーだけアタッチされたゲームオブジェクトも選択しないとコライダーの大きさが表示されないのでどこに何があるのかを確認するのが面倒くさいですよね。

そこでこのような不可視のゲームオブジェクトを視覚化するために活用したいのがGizmos(ギズモ)です。これはデバッグ用に目印となる図形を描画できる機能で、うまく活用すればレベルデザインなどの開発効率をアップさせることができます。ここではこのGizmosの具体的な使い方について書いていきますね。

Gizmos(ギズモ)とは?

まずはじめに、Gizmosについてザックリとご説明しておきます。

Gizmosとはゲームオブジェクトに関連付けられたデバッグ用のグラフィックのことです。例えばUnityエディタでシーン上のカメラを見てみるとアイコンが表示されていますよね。これもGizmosの一種です。

カメラを表すアイコンもGizmosの一種

ただしGizmosは自分で好きなゲームオブジェクトに対して設定することもできます。例えば下記のように空のゲームオブジェクトの位置に任意の色の球体を表示させることが可能です。

球体のGizmosを表示した例

また、普通は空のゲームオブジェクトはシーンビューから選択することはできませんが、Gizmosを表示させている場合はそのGizmosをマウスでクリックすれば対象のゲームオブジェクトを選択することもできます。

このようにGizmosを使えば見えないゲームオブジェクトを視覚化できるほかマウスで簡単に選択できるようになるので、使いこなせるとデバッグやレベルデザインの際にとても便利です。

Gizmosの表示・非表示の切り替え方法

なおGizmosは簡単に表示・非表示を切り替えることができます。シーンビューのギズモアイコンをクリックすると表示のON/OFFを切り替えられます。

GizmosのON/OFFを切り替える方法

Gizmosの使い方

さてGizmosを使うには、C#スクリプトにGizmos用の処理を書いてそれを好きなゲームオブジェクトにアタッチする必要があります。やり方は、OnDrawGizmos関数またはOnDrawGizmosSelected関数内にGizmos用の処理を書くだけです。

OnDrawGizmos関数

常にGizmosを描画して対象のゲームオブジェクトを簡単に選択できるようにするための関数です。

C#
using UnityEngine;

public sealed class TestGizmos : MonoBehaviour
{

	void OnDrawGizmos()
	{
		// ここにGizmos用の処理
	}

}

OnDrawGizmosSelected関数

対象のゲームオブジェクトが選択状態のときにGizmosを表示するための関数です。例えば、ある空のゲームオブジェクトが選択されているときだけGizmosを表示したい場合に使います。

C#
using UnityEngine;

public sealed class TestGizmos : MonoBehaviour
{

	void OnDrawGizmosSelected()
	{
		// ここにGizmos用の処理
	}

}

Gizmosクラス

Gizmosクラスは、先ほどのOnDrawGizmosやOnDrawGizmosSelectedの中で使えるギズモ用の処理をいくつか持っているクラスです。よく使う代表的なプロパティや関数は次の通り。

  • color
  • DrawCube
  • DrawSphere

Gizmos.color

次に描画されるGizmosの色を指定するためのプロパティです。

Gizmos.DrawCube

指定した中心点とサイズをもとに立方体を表示します。

Gizmos.DrawCubeで立方体のギズモを描画した例
C#
using UnityEngine;

public sealed class TestGizmos : MonoBehaviour
{

	void OnDrawGizmos()
	{
		Gizmos.color = Color.red;
		Gizmos.DrawCube(transform.position, Vector3.one);
	}

}

Gizmos.DrawSphere

指定した中心点と半径をもとに球体を表示します。

Gizmos.DrawCubeで球体のギズモを描画した例
C#
using UnityEngine;

public sealed class TestGizmos : MonoBehaviour
{

	void OnDrawGizmos()
	{
		Gizmos.color = Color.red;
		Gizmos.DrawSphere(transform.position, 1f);
	}

}

Gizmosを活用したサンプルスクリプト

では最後にGizmosを使ったサンプルスクリプトを掲載しておきます。

注意:
下記のC#スクリプトは自由に使っていただいて構いませんが、作者を偽ったり勝手に転載したりするのは禁止とします。また、無保証ですので自己責任でご利用ください。

サンプル1:空のゲームオブジェクトを視覚化する

任意のゲームオブジェクトにアタッチすると球状のGizmosを表示するC#スクリプトです。このスクリプトではGizmosを選択すると色が変わるようになっているので選択状態にあることが一目瞭然です。

C#
using UnityEngine;

public sealed class GizmosSampleA : MonoBehaviour
{

	[SerializeField]
	Color color = Color.green;
	[SerializeField]
	Color selectedColor = Color.red;
	[SerializeField, Min(0.1f)]
	float radius = 1f;

	void OnDrawGizmos()
	{
		Gizmos.color = color;
		Gizmos.DrawSphere(transform.position, radius);
	}

	void OnDrawGizmosSelected()
	{
		Gizmos.color = selectedColor;
		Gizmos.DrawSphere(transform.position, radius);
	}

}

サンプル2:ボックス状のトリガーをわかりやすく視覚化する

下記のC#スクリプトでは、ボックス状のトリガーコライダーを常に視覚化します(Gizmosの位置やサイズは指定したコライダーに自動的に合うようになっています)。これによってどこにトリガーが設置されているかが分かりやすくなりレベルデザインやデバッグがかなり楽になります。

Gizmosを使ってコライダーをわかりやすくした場合の例
C#
using UnityEngine;

public sealed class GizmosSampleB : MonoBehaviour
{

	[SerializeField]
	BoxCollider boxCollider;
	[SerializeField]
	Color gizmoColor = Color.green;
	[SerializeField]
	Color selectedGizmoColor = Color.red;

	void OnDrawGizmos()
	{
		if (boxCollider == null)
		{
			return;
		}

		Gizmos.color = gizmoColor;
		DrawCube();
	}

	void OnDrawGizmosSelected()
	{
		if (boxCollider == null)
		{
			return;
		}

		Gizmos.color = selectedGizmoColor;
		DrawCube();
	}

	void DrawCube()
	{
		Gizmos.matrix = transform.localToWorldMatrix;
    Gizmos.DrawCube(boxCollider.center, boxCollider.size);
	}

}

なお注意点として、なにも工夫しないとボックスコライダーを拡大縮小・回転させたときにGizmosは変化せず実際のコライダーとサイズや回転が合わなくなってしまいます。

そこでここではGizmos.matrixというプロパティに回転情報を代入することでこの問題を回避しています(Gizmosは常にワールド座標を使用するので、対象のゲームオブジェクトのローカル座標をワールド座標に変換したものを代入すればOK)。

おわりに

以上、UnityのGizmosの使い方を具体的なサンプルを交えながらご紹介しました。すでに書いたようにGizmosを使いこなせるようになるとレベルデザインやデバッグの効率が格段にアップして便利なので、ぜひ皆さんもGizmosを使ってみてください。

この記事がUnityでのゲーム開発のお役に立てば幸いです。