166 lines
7.8 KiB
C#
166 lines
7.8 KiB
C#
|
using UnityEngine;
|
||
|
using UnityEngine.Scripting.APIUpdating;
|
||
|
using UnityEngine.Tilemaps;
|
||
|
|
||
|
namespace UnityEditor.Tilemaps
|
||
|
{
|
||
|
/// <summary>Base class for Grid Brush Editor.</summary>
|
||
|
[MovedFrom(true, "UnityEditor", "UnityEditor")]
|
||
|
[CustomEditor(typeof(GridBrushBase))]
|
||
|
public class GridBrushEditorBase : Editor
|
||
|
{
|
||
|
private static class Styles
|
||
|
{
|
||
|
public static readonly Color activeColor = new Color(1f, .5f, 0f);
|
||
|
public static readonly Color executingColor = new Color(1f, .75f, 0.25f);
|
||
|
}
|
||
|
|
||
|
/// <summary>Checks if the Brush allows the changing of Z Position.</summary>
|
||
|
/// <returns>Whether the Brush can change Z Position.</returns>
|
||
|
public virtual bool canChangeZPosition
|
||
|
{
|
||
|
get { return true; }
|
||
|
set {}
|
||
|
}
|
||
|
|
||
|
/// <summary>Callback for painting the GUI for the GridBrush in the Scene view.</summary>
|
||
|
/// <param name="gridLayout">Grid that the brush is being used on.</param>
|
||
|
/// <param name="brushTarget">Target of the GridBrushBase::ref::Tool operation. By default the currently selected GameObject.</param>
|
||
|
/// <param name="position">Current selected location of the brush.</param>
|
||
|
/// <param name="tool">Current GridBrushBase::ref::Tool selected.</param>
|
||
|
/// <param name="executing">Whether is brush is being used.</param>
|
||
|
/// <remarks>Implement this for any special behaviours when the GridBrush is used on the Scene View.</remarks>
|
||
|
public virtual void OnPaintSceneGUI(GridLayout gridLayout, GameObject brushTarget, BoundsInt position, GridBrushBase.Tool tool, bool executing)
|
||
|
{
|
||
|
OnPaintSceneGUIInternal(gridLayout, brushTarget, position, tool, executing);
|
||
|
}
|
||
|
|
||
|
/// <summary>Callback for painting the inspector GUI for the GridBrush in the tilemap palette.</summary>
|
||
|
/// <remarks>Implement this to have a custom editor in the tilemap palette for the GridBrush.</remarks>
|
||
|
public virtual void OnPaintInspectorGUI()
|
||
|
{
|
||
|
OnInspectorGUI();
|
||
|
}
|
||
|
|
||
|
/// <summary>Callback for drawing the Inspector GUI when there is an active GridSelection made in a GridLayout.</summary>
|
||
|
/// <remarks>Override this to show custom Inspector GUI for the current selection.</remarks>
|
||
|
public virtual void OnSelectionInspectorGUI() {}
|
||
|
|
||
|
/// <summary>Callback for painting custom gizmos when there is an active GridSelection made in a GridLayout.</summary>
|
||
|
/// <param name="gridLayout">Grid that the brush is being used on.</param>
|
||
|
/// <param name="brushTarget">Target of the GridBrushBase::ref::Tool operation. By default the currently selected GameObject.</param>
|
||
|
/// <remarks>Override this to show custom gizmos for the current selection.</remarks>
|
||
|
public virtual void OnSelectionSceneGUI(GridLayout gridLayout, GameObject brushTarget) {}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Callback for painting custom gizmos for the GridBrush for the brush target
|
||
|
/// </summary>
|
||
|
/// <param name="gridLayout">Grid that the brush is being used on.</param>
|
||
|
/// <param name="brushTarget">Target of the GridBrushBase::ref::Tool operation. By default the currently selected GameObject.</param>
|
||
|
/// <remarks>Override this to show custom gizmos for the brush target.</remarks>
|
||
|
public virtual void OnSceneGUI(GridLayout gridLayout, GameObject brushTarget) {}
|
||
|
|
||
|
/// <summary>Callback when the mouse cursor leaves a paintable region.</summary>
|
||
|
/// <remarks>Implement this for any custom behaviour when the mouse cursor leaves a paintable region.</remarks>
|
||
|
public virtual void OnMouseLeave() {}
|
||
|
|
||
|
/// <summary>Callback when the mouse cursor enters a paintable region.</summary>
|
||
|
/// <remarks>Implement this for any custom behaviour when the mouse cursor enters a paintable region.</remarks>
|
||
|
public virtual void OnMouseEnter() {}
|
||
|
|
||
|
/// <summary>Callback when a GridBrushBase.Tool is activated.</summary>
|
||
|
/// <param name="tool">Tool that is activated.</param>
|
||
|
/// <remarks>Implement this for any special behaviours when a Tool is activated.</remarks>
|
||
|
public virtual void OnToolActivated(GridBrushBase.Tool tool) {}
|
||
|
|
||
|
/// <summary>Callback when a GridBrushBase.Tool is deactivated.</summary>
|
||
|
/// <param name="tool">Tool that is deactivated.</param>
|
||
|
/// <remarks>Implement this for any special behaviours when a Tool is deactivated.</remarks>
|
||
|
public virtual void OnToolDeactivated(GridBrushBase.Tool tool) {}
|
||
|
|
||
|
/// <summary>Callback for registering an Undo action before the GridBrushBase does the current GridBrushBase::ref::Tool action.</summary>
|
||
|
/// <param name="brushTarget">Target of the GridBrushBase::ref::Tool operation. By default the currently selected GameObject.</param>
|
||
|
/// <param name="tool">Current GridBrushBase::ref::Tool selected.</param>
|
||
|
/// <remarks>Implement this for any special Undo behaviours when a brush is used.</remarks>
|
||
|
public virtual void RegisterUndo(GameObject brushTarget, GridBrushBase.Tool tool) {}
|
||
|
|
||
|
/// <summary>Returns all valid targets that the brush can edit.</summary>
|
||
|
public virtual GameObject[] validTargets { get { return null; } }
|
||
|
|
||
|
internal void OnEditStart(GridLayout gridLayout, GameObject brushTarget)
|
||
|
{
|
||
|
SetBufferSyncTile(brushTarget, true);
|
||
|
}
|
||
|
|
||
|
internal void OnEditEnd(GridLayout gridLayout, GameObject brushTarget)
|
||
|
{
|
||
|
SetBufferSyncTile(brushTarget, false);
|
||
|
}
|
||
|
|
||
|
private void SetBufferSyncTile(GameObject brushTarget, bool active)
|
||
|
{
|
||
|
if (brushTarget == null || !Tilemap.HasSyncTileCallback())
|
||
|
return;
|
||
|
|
||
|
var tilemaps = brushTarget.GetComponentsInChildren<Tilemap>();
|
||
|
foreach (var tilemap in tilemaps)
|
||
|
{
|
||
|
tilemap.bufferSyncTile = active;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal static void OnSceneGUIInternal(GridLayout gridLayout, GameObject brushTarget, BoundsInt position, GridBrushBase.Tool tool, bool executing)
|
||
|
{
|
||
|
if (Event.current.type != EventType.Repaint)
|
||
|
return;
|
||
|
|
||
|
if (tool == GridBrushBase.Tool.Select ||
|
||
|
tool == GridBrushBase.Tool.Move)
|
||
|
{
|
||
|
if (GridSelection.active && !executing)
|
||
|
{
|
||
|
Color color = Styles.activeColor;
|
||
|
GridEditorUtility.DrawGridMarquee(gridLayout, position, color);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal static void OnPaintSceneGUIInternal(GridLayout gridLayout, GameObject brushTarget, BoundsInt position, GridBrushBase.Tool tool, bool executing)
|
||
|
{
|
||
|
if (Event.current.type != EventType.Repaint)
|
||
|
return;
|
||
|
|
||
|
Color color = Color.white;
|
||
|
if (tool == GridBrushBase.Tool.Pick && executing)
|
||
|
color = Color.cyan;
|
||
|
if (tool == GridBrushBase.Tool.Paint && executing)
|
||
|
color = Color.yellow;
|
||
|
|
||
|
if (tool == GridBrushBase.Tool.Select ||
|
||
|
tool == GridBrushBase.Tool.Move)
|
||
|
{
|
||
|
if (executing)
|
||
|
color = Styles.executingColor;
|
||
|
else if (GridSelection.active)
|
||
|
color = Styles.activeColor;
|
||
|
}
|
||
|
|
||
|
if (brushTarget != null)
|
||
|
{
|
||
|
var targetLayout = brushTarget.GetComponent<GridLayout>();
|
||
|
if (targetLayout != null)
|
||
|
gridLayout = targetLayout;
|
||
|
}
|
||
|
|
||
|
if (position.zMin != 0)
|
||
|
{
|
||
|
var zeroBounds = position;
|
||
|
zeroBounds.z = 0;
|
||
|
GridEditorUtility.DrawGridMarquee(gridLayout, zeroBounds, color);
|
||
|
color = Color.blue;
|
||
|
}
|
||
|
GridEditorUtility.DrawGridMarquee(gridLayout, position, color);
|
||
|
}
|
||
|
}
|
||
|
}
|