The DrawGizmo attribute allows you to setup your gizmo drawing code some place other then with your MonoBehavior class. The code below shows an example of the DrawGizmo attribute used on a method within a Editor class.
/// <summary>
/// Provides a editor for the <see cref="TileMap"/> component
/// </summary>
[CustomEditor(typeof(TileMap))]
public class TileMapEditor : Editor
{
/// The RenderMapGizmo method will be called if the map is selected.
[DrawGizmo(GizmoType.Selected | GizmoType.Active)]
static void RenderMapGizmo(TileMap map, GizmoType gizmoType)
{
// store map width, height and position
var mapWidth = map.Columns * map.CellWidth;
var mapHeight = map.Rows * map.CellHeight;
var position = map.transform.position;
var activelayerHeight = map.ActiveLayer * map.Depth;
if (map.drawGridLines)
{
// draw layer border
Gizmos.color = Color.white;
Gizmos.DrawLine(
position + new Vector3(0, activelayerHeight, 0), position + new Vector3(mapWidth, activelayerHeight, 0));
Gizmos.DrawLine(
position + new Vector3(0, activelayerHeight, 0), position + new Vector3(0, activelayerHeight, mapHeight));
Gizmos.DrawLine(
position + new Vector3(mapWidth, activelayerHeight, 0),
position + new Vector3(mapWidth, activelayerHeight, mapHeight));
Gizmos.DrawLine(
position + new Vector3(0, activelayerHeight, mapHeight),
position + new Vector3(mapWidth, activelayerHeight, mapHeight));
// more draw logic here
}
}
The alternative is that you can have a method in your MonoBehavior called OnDrawGizmosSelected …
/// <summary>
/// Provides a component for tile mapping.
/// </summary>
public class TileMap : MonoBehaviour
{
/// <summary>
/// When the game object is selected this will draw the gizmos
/// </summary>
/// <remarks>Only called when in the Unity editor.</remarks>
private void OnDrawGizmosSelected()
{
// gizmo draw code goes here
}
}
… But since gizmo drawing logic is typically for use within the unity editor the DrawGizmo attribute allows you to place the draw logic in a more appropriate location.