【Unity编辑器】拓展Project视图
目录
1、拓展右键菜单
2、创建一个菜单
3、拓展布局
4、监听事件
首先创建一个Editor文件夹,此文件夹可以作为多个目录的子文件夹存在,这样开发者就可以按照功能来划分,将不同功能的编辑代码放在不同的Editor目录下。
如果属于编辑模式下的代码,需要放在Editor文件夹下;如果属于运行代码,放在非Editor的文件夹即可
1、拓展右键菜单
在Editor文件夹下创建一个代码
using UnityEngine;
using UnityEditor;
public class Script_03_01 : MonoBehaviour
{
[MenuItem("Assets/My Tools/Tools 1" , false , 2)] //自定义菜单的参数需要在MenuItem方法中写入显示的菜单路径。如果菜单条比较多,可以在第三个参数处输入表示排序的整数,数值越小,它的排序越靠前
static void MyTools1()
{
Debug.Log(Selection.activeObject.name); //打印选中的游戏对象
}
[MenuItem("Assets/My Tools/Tools 2" , false , 1)]
static void MyTools2()
{
Debug.Log(Selection.activeObject.name);
}
}
2、创建一个菜单
在Editor下创建一个编辑代码
using UnityEngine;
using UnityEditor;
public class Script拓展Project : MonoBehaviour
{
[MenuItem("Assets/Create/My Create/Cube" , false , 2)]
static void CreateCube()
{
GameObject.CreatePrimitive(PrimitiveType.Cube); //创建方形
}
[MenuItem("Assets/Create/My Create/Sphere" , false ,1)]
static void CreateSphere()
{
GameObject.CreatePrimitive(PrimitiveType.Sphere); //创建球形
}
}
拓展菜单的关键就是找到正确的菜单路径,通过“/”符号将它们拼合而成GameObject.CreatePrimitive()方法用于创建Unity的基础模型体
3、拓展布局
添加一个click按钮,点击后程序会自动在Console窗口中打印选中的资源名
using UnityEditor;
using UnityEngine;
public class S_拓展布局 : MonoBehaviour
{
[InitializeOnLoadMethod]
static void InitializeOnLoadMethod()
{
EditorApplication.projectWindowItemOnGUI = delegate (string guid, Rect selectionRect) //(project窗口中每个可见列表项的OnGUI事件的委托)
{
//在project视图中选择一个资源
if (Selection.activeObject && guid == AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(Selection.activeObject)))
{
//设置拓展按钮区域
float width = 10f;
selectionRect.x += (selectionRect.width - width);
selectionRect.y += 2f;
selectionRect.width = width;
GUI.color = Color.red;
//点击事件
if (GUI.Button(selectionRect, "click"))
{
Debug.LogFormat("click : {0}", Selection.activeObject.name);
}
GUI.color = Color.white;
}
};
}
}
点击后的效果
在方法前面添加[InitializeOnLoadMethod]表示此方法会在C#代码每次编译完后首先调用。
监听EditorApplication.projectWindowItemOnGUI委托,即可使用GUI方法来绘制自定义的UI元素
4、监听事件
Project资源比较多,如果不好好规划,资源就会很凌乱。这时就要借助程序来管理资源,可以通过监听资源的创建、删除、移动和保存等事件来实现。
例如:将某个文件移动到错误的目录下,此时就可以监听资源移动事件,程序判断资源的原始位置以及将要移动的位置是否合法,从而决定是否能阻止本次移动
首先需要继承UnityEditor.AssetModificationProcessor,接着重写监听资源创建、删除、保存和移动的方法
using UnityEditor;
using UnityEngine;
public class S_监听事件 : UnityEditor.AssetModificationProcessor
{
[InitializeOnLoadMethod]
static void InitializeOnLoadMethod()
{
//全局监听Project视图下的资源是否发送变化(添加、删除和移动)
EditorApplication.projectWindowChanged = delegate ()
{
Debug.Log("change");
};
}
//监听“双击鼠标左键,打开资源”事件
public static bool IsOpenForEdit(string assetPath , out string message)
{
message = null;
Debug.LogFormat("assetPath : {0}", assetPath);
//true表示该资源可以打开,false表示不允许在Unity中打开该资源
return true;
}
//监听“资源即将被创建”事件
public static void OnWillCreateAsset(string path)
{
Debug.LogFormat("path:{0}" , path);
}
//监听“资源即将被保存”事件
public static string[] OnWillSaveAssets(string[] paths)
{
if(paths != null)
{
Debug.LogFormat("path:{0}" , string .Join(",", paths));
}
return paths;
}
//监听“资源即将被移动”事件
public static AssetMoveResult OnWillMoveAsset(string oldpath , string newPath)
{
Debug.LogFormat("from:{0} to: {1}" , oldpath, newPath);
//AssetMoveResult.DidMove表示该资源可以移动
return AssetMoveResult.DidMove;
}
//监听“资源即将被删除”事件
public static AssetDeleteResult OnWillDeleteAsset(string assetpath, RemoveAssetOptions options)
{
Debug.LogFormat("delete:{0}", assetpath);
//AssetDeleteResult.DidDelete表示该资源可以被删除
return AssetDeleteResult.DidDelete;
}
}