Registers an EditorTool as either a Global tool or a Component tool for a specific target type.
A Global tool works on any selection. A Global tool is also always available from the top toolbar. A Component tool, like a CustomEditor, is only available for selections that match a target type.
using System; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEditor; using UnityEditor.EditorTools; using UnityEngine.Rendering;
// By passing `typeof(MeshFilter)` as the second argument, we register VertexTool as a CustomEditor tool to be presented // when the current selection contains a MeshFilter component. [EditorTool("Show Vertices", typeof(MeshFilter))] class VertexTool : EditorTool { struct TransformAndPositions { public Transform transform; public Vector3[] positions; }
IEnumerable<TransformAndPositions> m_Vertices; GUIContent m_ToolbarIcon;
public override GUIContent toolbarIcon { get { if (m_ToolbarIcon == null) m_ToolbarIcon = new GUIContent( AssetDatabase.LoadAssetAtPath<Texture2D>("Assets/Examples/Icons/VertexTool.png"), "Vertex Visualization Tool"); return m_ToolbarIcon; } }
void OnEnable() { EditorTools.activeToolChanged += ActiveToolDidChange; }
void OnDisable() { EditorTools.activeToolChanged -= ActiveToolDidChange; }
void ActiveToolDidChange() { if (!EditorTools.IsActiveTool(this)) return;
m_Vertices = targets.Select(x => { return new TransformAndPositions() { transform = ((MeshFilter)x).transform, positions = ((MeshFilter)x).sharedMesh.vertices }; }).ToArray(); }
public override void OnToolGUI(EditorWindow window) { var evt = Event.current;
if (evt.type == EventType.Repaint) { var zTest = Handles.zTest; Handles.zTest = CompareFunction.LessEqual;
foreach (var entry in m_Vertices) { foreach (var vertex in entry.positions) { var world = entry.transform.TransformPoint(vertex); Handles.DotHandleCap(0, world, Quaternion.identity, HandleUtility.GetHandleSize(world) * .05f, evt.type); } }
Handles.zTest = zTest; } } }
EditorToolAttribute | Registers an EditorTool as either a Global tool or a CustomEditor tool. |
displayName | The name that displays in menus. |
targetContext | If provided, the EditorTool will only be made available when the ToolManager.activeContextType is equal to targetContext. |
targetType | Set to the type that this EditorTool or EditorToolContext can edit. Set to null if the tool is not specific to a Component and should be available at any time. |