一、菜单拓展
using UnityEngine;
using UnityEditor;
public class TestMenu : MonoBehaviour
{
//快捷键 %-control/command #-shift &-alt 上/下/左/右-UP/DOWN/LEFT/RIGHT
[MenuItem("XFKT/Test1 %#K", false, 1)]
static void Test1()
{
Debug.Log("test1");
}
[MenuItem("XFKT/Test2/Test22", false, 2)]
static void Test2()
{
Debug.Log("test2");
}
//是否可以点击
[MenuItem("XFKT/Test2", true, 2)]
static bool Test2Valide1()
{
return false;
}
[MenuItem("XFKT/Test3", false, 0)]
static void Test3()
{
Debug.Log("test3");
}
//优先级间隔比较大时,会形成分割线
[MenuItem("XFKT/Test4", false, 20)]
static void Test4()
{
Debug.Log("test4");
}
}

image.png
二、Scene视图自定义菜单
using UnityEditor;
using UnityEngine;
public class TestSceneMenu : MonoBehaviour
{
[InitializeOnLoadMethod]
static void InitializeOnLoad()
{
UnityEditor.SceneView.duringSceneGui += (sceneView) =>
{
Event e = Event.current;
if (e != null &&
e.button == 1 &&
e.type == EventType.MouseUp)
{
Rect rect = new Rect(e.mousePosition.x, e.mousePosition.y - 50, 100, 100);
GUIContent[] contents = new GUIContent[] { new GUIContent("Test1"), new GUIContent("XFKT/Test2") };
EditorUtility.DisplayCustomMenu(rect, contents, -1, (data, opt, select) => {
Debug.LogFormat("data: {0}, opt: {1}, select: {2}, value: {3}", data, opt, select, opt[select]);
}, null);
e.Use();
}
};
}
}

image.png
三、拓展Project视图
using UnityEngine;
using UnityEditor;
public class TestProjectMenu : MonoBehaviour
{
[MenuItem("Assets/Test1")]
static void Test1()
{
Debug.Log("proect test1");
}
//2栏的时候,需要点击第二栏
[InitializeOnLoadMethod]
static void InitializeOnLoad()
{
EditorApplication.projectWindowItemOnGUI += (guid, rect) =>
{
if (Selection.activeObject != null)
{
string active_guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(Selection.activeObject));
if (active_guid == guid &&
!string.IsNullOrEmpty(active_guid))
{
rect.x = rect.width - 100;
rect.width = 100;
if (GUI.Button(rect, "Delete"))
{
Debug.Log("project delete");
AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(Selection.activeObject));
}
}
}
};
}
}

image.png
四、拓展Project视图-事件监听
using UnityEditor;
using UnityEngine;
public class TestProjectEvent : UnityEditor.AssetModificationProcessor
{
//创建资源
public static void OnWillCreateAsset(string path)
{
Debug.LogFormat("创建资源:{0}", path);
}
//保存资源
public static string[] OnWillSaveAssets(string[] paths)
{
for (int i = 0; i < paths.Length; I++)
{
Debug.LogFormat("保存资源:{0}", paths[I]);
}
return paths;
}
//移动资源
public static AssetMoveResult OnWillMoveAsset(string oldPath, string newPath)
{
Debug.LogFormat("从{0}移动到{1}", oldPath, newPath);
return AssetMoveResult.DidNotMove;
}
//删除资源
public static AssetDeleteResult OnWillDeleteAsset(string path, RemoveAssetOptions options)
{
Debug.LogFormat("删除资源{0}, option:{1}", path, options);
return AssetDeleteResult.DidNotDelete;
}
//监听资源改变
[InitializeOnLoadMethod]
static void InitOnLoad()
{
EditorApplication.projectChanged += () => {
Debug.Log("asset change!");
};
}
}
五、拓展Hierarchy视图
using UnityEngine;
using UnityEditor;
public class TestHierarchy : MonoBehaviour
{
//添加自定义菜单
[MenuItem("GameObject/Test2")]
static void Test2()
{
Debug.Log("test2");
}
//添加删除功能
[InitializeOnLoadMethod]
static void InitializeOnLoad()
{
EditorApplication.hierarchyWindowItemOnGUI += (instanceId, rect) =>
{
if (Selection.activeObject != null &&
Selection.activeObject.GetInstanceID() == instanceId)
{
rect.x = rect.width - 50;
rect.width = 100;
if (GUI.Button(rect, "Delete"))
{
Debug.Log("hierarchy delete");
DestroyImmediate(Selection.activeObject);
}
}
};
}
}

image.png
六、拓展Inspector视图
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(Camera))]
public class TestInspector : Editor
{
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
if (GUILayout.Button("Test1"))
{
Debug.Log("camera test1");
Camera camera = this.target as Camera;
if (camera != null)
{
camera.depth++;
}
}
}
}

image.png
七、拓展Inspector Context菜单
using UnityEngine;
using UnityEditor;
public class TestInspectorContext : MonoBehaviour
{
[MenuItem("CONTEXT/Transform/SetPosition")]
static void SetPosition()
{
Debug.Log("SetPosition");
}
[MenuItem("CONTEXT/Transform/SetPosition1")]
static void SetPosition1(MenuCommand command)
{
Transform transform = command.context as Transform;
transform.position += Vector3.one;
}
}

image.png
参考教程:https://www.bilibili.com/video/BV1kh411Q79K/?p=7&spm_id_from=pageDriver&vd_source=6c44e5fc749096dec7c95fb327b8325a
网友评论