知名插件:
Runtime Editor 添加链接描述
Odin - Inspector and Serializer
有大佬可以留言分享下学习经验。本人只根据官方的进行了总结。之后有内容也会补充!
Menu相关部分
以下为本人总结的Menu相关部分,包括:标题栏、windows、GameObject、Assets目录右键、菜单的分层、脚本右键、获取选中的物体、快捷键。
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
public class Tools
{
//添加标题
/*
[MenuItem("Tools/test")]
public static void Test()
{
Debug.Log("abc");
}
[MenuItem("Tools/test1")]
public static void Test2()
{
Debug.Log("abc1");
}
[MenuItem("Tools/test2")]
public static void Test3()
{
Debug.Log("abc2");
}
//子级
[MenuItem("Tools/test2/test")]
public static void Test4()
{
Debug.Log("test2/test");
}*/
//window下
[MenuItem("Window/WinTest")]
public static void WinTest()
{
Debug.Log("Winabc2");
}
//GameObject下 ,可以在Hierachy右键显示
[MenuItem("GameObject/Testobj",false,11)]
public static void HierachyTest()
{
Debug.Log("Hierachyabc");
}
[MenuItem("GameObject/Testobj",true,11)]
public static bool HierachyTest1()
{
return Selection.count > 0;
}
//分层
/*[MenuItem("Tools/test",false,1)]
public static void Test()
{
Debug.Log("abc");
}
[MenuItem("Tools/test1",false,0)]
public static void Test2()
{
Debug.Log("abc1");
}
[MenuItem("Tools/test2",false,12)]
public static void Test3()
{
Debug.Log("abc2");
}*/
//Assets目录右键
[MenuItem("Assets/Test",false,11)]
public static void AssetsTest()
{
Debug.Log("Assetsabc");
}
//脚本右键
[MenuItem("CONTEXT/TestSpcrite/rs",false,5)]
public static void InspectorTest()
{
Debug.Log("Assetsabc");
}
[MenuItem("CONTEXT/Rigidbody/test")]
public static void InspectorTestSetValue(MenuCommand command)
{
var rig = command.context as Rigidbody;
Debug.Log($"rig_mass{rig.mass},rig_Gravity{rig.useGravity}");
rig.mass = 5;
rig.useGravity = false;
Debug.Log($"rig_mass{rig.mass},rig_Gravity{rig.useGravity}");
}
//选择物体
[MenuItem("Test/Select",false,5)]
public static void InspectorSelect()
{
Debug.Log("Count"+Selection.count);
Debug.Log("ObjectsLength"+Selection.objects.Length);
}
//可撤销删除 快捷键 % (ctrl on Windows, cmd on macOS), # (shift), & (alt)
[MenuItem("Test/Delete %DEL",false,6)]
public static void InspectorDelete()
{
foreach (var obj in Selection.objects)
{
Undo.DestroyObjectImmediate(obj);
}
Debug.Log("删除选中的物体,并可以撤销");
}
//第二个参数,方法是否启用, "Test/Select"名字相同,有bool 返回值,true状态;先判断true方法,在判断false
//选择物体
[MenuItem("Test/Select",true)]
public static bool InspectorCanSelect()
{
return Selection.count > 0;
}
}
windows弹窗
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
public class EditorWindowExample : EditorWindow
{
[MenuItem("Window/Show")]
public static void ShowWin()
{
var win = GetWindow<EditorWindowExample>();
win.Show();
}
public string str = "";
#region Dropdown
#region EnumMaskField
public enum Example
{
Option_One = 1, //bits: 0000 0001
Option_Two = 2, //bits: 0000 0010
Option_Three = 3 //bits: 0000 0100
}
Example staticFlagMask = 0;
#endregion
#region EnumPopup
public enum OPTIONS
{
CUBE = 0,
SPHERE = 1,
PLANE = 2
}
public OPTIONS op;
#endregion
#region IntPopup
int selectedSize = 1;
string[] names = new string[] { "Normal", "Double", "Quadruple" };
int[] sizes = new int[] { 1, 2, 4 };
#endregion
#region Popup
public string[] options = new string[] { "Cube", "Sphere", "Plane" };
public int index = 0;
#endregion
#region EnumMaskPopup
public enum Options
{
CUBE = 0,
SPHERE = 1,
PLANE = 2
}
public Options m_options;
#endregion
#endregion
private GameObject m_objectValue;
private int m_intValue; //定义修改内容;
private string m_textValue;
private float m_floatValue;
private Vector2 m_vec2;
private Vector3 m_vec3;
private Vector4 m_vec4;
private Bounds m_bounds;
private BoundsInt m_boundsInt;
private int m_layer;
private string m_tag;
private Color m_color;
private GUIContent colorTitle = new GUIContent("颜色选择");
private AnimationCurve m_curve = AnimationCurve.Linear(0, 0, 1, 1);
private void OnGUI()
{
GUILayout.Label("输入");
str = GUILayout.TextField(str);
if (GUILayout.Button("创建"))
{
var gameObject = new GameObject(str);
Undo.RegisterCreatedObjectUndo(gameObject, "obj");
}
#region Dropdown
var dropdownText = "Dropdown";
GUIContent content = new GUIContent(dropdownText); //定义一下显示内容
if (EditorGUILayout.DropdownButton(content, FocusType.Passive))
{
var options = new string[] { "A", "B", "C", "D" };
GenericMenu menu = new GenericMenu();
for (int i = 0; i < options.Length; i++)
{
var a = i;
//bool,即菜单中项目旁边的勾号;每个选项默认是否选中
//func,点击之后的方法
/*menu.AddItem(new GUIContent(options[i]), false, () =>
{
Debug.Log($"选中下拉列表{options[a]}");
});*/
menu.AddItem(new GUIContent(options[i]), dropdownText.Equals(options[i]),
() => { Debug.Log($"选中下拉列表{options[a]}"); });
menu.ShowAsContext(); //显示菜单
}
Debug.Log("据说是按下就触发,而不是抬起");
}
#region EnumMaskField
//可以多选
staticFlagMask = (Example)EditorGUILayout.EnumFlagsField("EnumFlagsField:", staticFlagMask);
#endregion
#region EnumPopup
op = (OPTIONS)EditorGUILayout.EnumPopup("EnumPopup:", op);
#endregion
#region IntPopup
selectedSize = EditorGUILayout.IntPopup("IntPopup: ", selectedSize, names, sizes);
#endregion
#region Popup
index = EditorGUILayout.Popup("Popup:", index, options);
#endregion
#region EnumMaskPopup
m_options = (Options)EditorGUILayout.EnumFlagsField("EnumFlagsField:", m_options);
#endregion
#endregion
#region 对象域
m_objectValue = EditorGUILayout.ObjectField(m_objectValue, typeof(GameObject), true) as GameObject;
#endregion
#region 整数域
m_intValue = EditorGUILayout.IntField("整型输入框", m_intValue); //Title + Value
#endregion
#region 浮点、字符串、向量等各种域
m_floatValue = EditorGUILayout.FloatField("Float 输入:", m_floatValue);
m_textValue = EditorGUILayout.TextField("Text输入:", m_textValue);
m_vec2 = EditorGUILayout.Vector2Field("Vec2输入: ", m_vec2);
m_vec3 = EditorGUILayout.Vector3Field("Vec3输入: ", m_vec3);
m_vec4 = EditorGUILayout.Vector4Field("Vec4输入: ", m_vec4);
m_bounds = EditorGUILayout.BoundsField("Bounds输入: ", m_bounds);
m_boundsInt = EditorGUILayout.BoundsIntField("Bounds输入: ", m_boundsInt);
#endregion
#region 标签/层级选择域
m_layer = EditorGUILayout.LayerField("层级选择", m_layer);
m_tag = EditorGUILayout.TagField("标签选择", m_tag);
#endregion
#region 颜色域
m_color = EditorGUILayout.ColorField(colorTitle, m_color, true, true, true);
#endregion
#region 动画曲线域
m_curve = EditorGUILayout.CurveField("动画曲线:", m_curve);
#endregion
}
}
Inspector
与下面的InspectorRightExample基类脚本对应。可以给脚本添加按钮等GUI方法。
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(InspectorRightExample))]
public class EditorInspectorExample : Editor
{
private InspectorRightExample _inspectorRightExample;
private void OnEnable()
{
_inspectorRightExample = target as InspectorRightExample;
}
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
GUILayout.Label("Inspector Right Example");
GUILayout.Space(10);
if (GUILayout.Button("这是一个按钮")) //自定义按钮
{
Debug.Log("Hello world");
}
}
}
脚本
除此脚本外,其余放在editor目录下面。
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(InspectorRightExample))]
public class EditorInspectorExample : Editor
{
private InspectorRightExample _inspectorRightExample;
private void OnEnable()
{
_inspectorRightExample = target as InspectorRightExample;
}
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
GUILayout.Label("Inspector Right Example");
GUILayout.Space(10);
if (GUILayout.Button("这是一个按钮")) //自定义按钮
{
Debug.Log("Hello world");
}
}
}