Version: 2020.1
Important Classes - Debug
Unity architecture

Important Classes - Gizmos & Handles

The Gizmos and Handles classes allows you to draw lines and shapes in the Scene view and Game view, as well as interactive handles and controls. These two classes together provide a way for you to extend what is shown in these views and build interactive tools to edit your project in any way you like. For example, rather than entering numbers in the inspector, you could create a draggable circle radius gizmo around a non-player character in a game, which represents the area within which they can hear or see the player.

This page provides a simple overview of the Gizmos and Handles classes. For full documentation and an exhaustive reference of every member of the Gizmos and Handles classes, see the script reference pages for Gizmos and Handles.

Gizmos

The Gizmos class allows you to draw lines, spheres, cubes, icons, textures and meshes into the Scene view to use as debugging, set-up aids, or tools while developing your project.

For example, to draw a 10 unit yellow wire cube around a GameObject, you would use this code:

using UnityEngine;
public class GizmosExample : MonoBehaviour
{
    void OnDrawGizmosSelected()
    {
        // Draw a yellow cube at the transform position
        Gizmos.color = Color.yellow;
        Gizmos.DrawWireCube(transform.position, new Vector3(10, 10, 10));
    }
}

And here is how that cube looks when placed on a Directional Light GameObject.

A light GameObject which with an extra script applied which draws a cube gizmo around its position
A light GameObject which with an extra script applied which draws a cube gizmo around its position

See the Gizmos script reference page for the full documentation on how to use Gizmos.

Handles

Handles are similar to Gizmos, but provide more functionality in terms of interactivity and manipulation. The 3D controls that Unity itself provides to manipulate items in the Scene view are a combination of Gizmos and Handles. There are a number of built-in Handle GUIs, such as the familiar tools to position, scale and rotate an object via the Transform component. However, you can define your own Handle GUIs to use with custom component editors. Such GUIs can be a very useful way to edit procedurally-generated Scene content, “invisible” items and groups of related objects, such as waypoints and location markers.

For example, here is how you could create an arc area with an arrowhead handle, allowing you to modify a “shield area” in the scene view:

using UnityEditor;
using UnityEngine;
using System.Collections;

//this class should exist somewhere in your project
public class WireArcExample : MonoBehaviour
{
    public float shieldArea;
}

// Create a 180 degrees wire arc with a ScaleValueHandle attached to the disc
// that lets you modify the "shieldArea" value in the WireArcExample
[CustomEditor(typeof(WireArcExample))]
public class DrawWireArc : Editor
{
    void OnSceneGUI()
    {
        Handles.color = Color.red;
        WireArcExample myObj = (WireArcExample)target;
        Handles.DrawWireArc(myObj.transform.position, myObj.transform.up, -myObj.transform.right, 180, myObj.shieldArea);
        myObj.shieldArea = (float)Handles.ScaleValueHandle(myObj.shieldArea, myObj.transform.position + myObj.transform.forward * myObj.shieldArea, myObj.transform.rotation, 1, Handles.ConeHandleCap, 1);
    }
}
An example of an Arc handle and an Scale handle
An example of an Arc handle and an Scale handle

See the Handles script reference page for the full documentation on how to use Handles.

Important Classes - Debug
Unity architecture