Unity编辑器拓展--Project拓展
前言
我们都知道在Unity的工程中,Project里放的都是我们项目的资源。当我们鼠标点击右键的时候会弹出一个菜单:
如果我们想对这些内容进行拓展里拓展应该怎么拓展呢?
这里我做了一些总结。
Project视图
我们新建一个脚本用来控制Project的拓展:
其实我们细心的点发现这个Project的视图其实和我们顶部的Assets菜单栏弹出的内容是一致的,所以我们对Project内容的拓展就是对Assets菜单栏进行拓展。结合前面第一节我们知道只需要将根目录改一下就可以了。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class TestProject : MonoBehaviour
{
[MenuItem("Assets/Test1")]
static void Test1()
{
}
}
这里具体我们不多做介绍,可以看第一节
我们如果需要点击时出现自定义的button时也可以实现:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class TestProject : MonoBehaviour
{
[MenuItem("Assets/Test1")]
static void Test1()
{
//EditorApplication.projectWindowItemOnGUI是打开选项时就会调用
EditorApplication.projectWindowItemOnGUI += (guid, rect) =>
{
///捕获列表参数说明
///1.文件的唯一标识码 2.
///用GUI绘制一个按钮
GUI.Button(new Rect(100, 100, 100, 100),"Test1");
};
}
//下面是加载的时候就会调用,两者根据需求来做
[InitializeOnLoadMethod]
static void InitializeOnload()
{
EditorApplication.projectWindowItemOnGUI += (guid, rect) =>
{
///捕获列表参数说明
///1.文件的唯一标识码 2.
///用GUI绘制一个按钮
GUI.Button(new Rect(100, 100, 100, 100), "Test1");
};
}
}
效果如下:
如果我们想点击脚本后出现一个删除按钮,然后删除相应的预制体:
那么这么一个功能应该怎么做呢?具体如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class TestProject : MonoBehaviour
{
[MenuItem("Assets/Test1")]
static void Test1()
{
}
//下面是加载的时候就会调用,两者根据需求来做
[InitializeOnLoadMethod]
static void InitializeOnload()
{
EditorApplication.projectWindowItemOnGUI += (guid, rect) =>
{
if(Selection.activeObject != null)
{
//获取当前选择的对象guid
string m_guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(Selection.activeObject));
if (m_guid == guid)
{
rect.x = rect.width - 100;
rect.width = 100;
if (GUI.Button(rect, "Test1"))
{
//删除
AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(Selection.activeObject));
Debug.Log("删除当前对象" + AssetDatabase.GetAssetPath(Selection.activeObject));
}
}
}
/捕获列表参数说明
/1.文件的唯一标识码 2.
/用GUI绘制一个按钮
//GUI.Button(new Rect(100, 100, 100, 100), "Test1");
};
}
}
Project事件监听
新建一个脚本TestProjectEvent来控制事件的监听
这里我们不再继承Unity中的MonoBehaviour类,而是改为继承UnityEditor.AssetModificationProcessor这样子的一个类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestProjectEvent : UnityEditor.AssetModificationProcessor
{
}
- 监听文件创建
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestProjectEvent : UnityEditor.AssetModificationProcessor
{
//创建资源之前调用的
public static void OnWillCreateAsset(string path)
{
//path是我们将要创建资源的一个路径
Debug.LogFormat("创建资源{0}",path);
}
}
我们来拖动一张图片来试一下效果:
2. 监听文件保存
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestProjectEvent : UnityEditor.AssetModificationProcessor
{
[InitializeOnLoadMethod]
static void InitOnLoad()
{
//资源发生改变调用
EditorApplication.projectChanged += () =>
{
Debug.Log("资源发生了改变");
};
}
}