编辑器拓展:
一、MenuItem:
1.用法:
[MenuItem("Assets/xxxx",false,1)]
2.参数
第一个参数为菜单导航路径,可以在路径最后加上自定义的快捷键。
第二个参数为false表示菜单本身,为true表示作为对应菜单的激活条件,例如:
[MenuItem("Assets/xxxx", false, 1)]
static void appPath()//这个为按钮本身要做的事情
{
Debug.Log("xxxx");
}
[MenuItem("Assets/xxxx", true, 1)]
static bool checkOpen()//这个为判断这个按钮是否激活点击,返回false就无法点击
{
return true;
}
第三个参数为排序数,数值越小越靠前。
二、拓展Project视图
1.右键菜单栏:
MenuItem的路径以Assets开头即可。
2.拓展布局:
选中Project视图中的某一项,为其增添一些元素,监听EditorApplication.projectWindowItemOnGUI委托即可。
例如,在选中的项后面画一个button:
[InitializeOnLoadMethod]
static void Initial()
{
EditorApplication.projectWindowItemOnGUI = delegate (string guid, Rect selectionRect)
{
if (Selection.activeObject && guid == AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(Selection.activeObject)))
//不能用 guid == Selection.assetGUIDs[0]
{
float width = 50f;
selectionRect.x += (selectionRect.width - 50f);
selectionRect.y += 2f;
selectionRect.width = width;
GUI.color = Color.red;
if (GUI.Button(selectionRect, "CLICK"))
{
}
GUI.color = Color.white;
}
};
}
3.监听事件
AssetModificationProcessor类
用于Project视图资源变动相关的事件监听
其中有5个事件可写:
IsOpenForEdit(string,string):当 Unity 检查资源以确定是否应禁用编辑器时,则会调用此方法。
OnWillCreateAsset(string):Unity 在即将创建未导入的资源(例如,.meta 文件)时调用此方法。
OnWillDeleteAsset(string,RemoveAssetOptions):当 Unity 即将从磁盘中删除资源时,则会调用此方法。
OnWillMoveAsset(string,string):Unity 即将在磁盘上移动资源时会调用此方法。
OnWillSaveAssets(string[]):Unity 即将向磁盘写入序列化资源或场景文件时会调用此方法。
使用
public class CustomAssetModificationProcessor : UnityEditor.AssetModificationProcessor
{
static void OnWillCreateAsset(string assetName)
{
Debug.Log("OnWillCreateAsset is being called with the following asset: " + assetName + ".");
}
}
继承自AssetModificationProcessor类,写对应的静态函数即可,注意参数。
三、拓展Hierarchy视图
1.右键菜单栏:
MenuItem的路径以GameObject开头即可。
2.拓展布局:
监听改为EditorApplication.hierarchyWindowItemOnGUI委托即可。
3.重写菜单栏
即在EditorApplication.hierarchyWindowItemOnGUI委托中,判断鼠标右键点击的物体,并修改EditorUtility.DisplayPopupMenu的路径为新的一个路径即可。
代码如下
[InitializeOnLoadMethod]
static void Initial2()
{
EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyGUI;
}
static void OnHierarchyGUI(int instanceID, Rect selectionRect)
{
if (Event.current != null && selectionRect.Contains(Event.current.mousePosition)
&& Event.current.button == 1