目录
前言:
准备
知识点
完整代码
效果
前言:
我们在游戏开发过程中,有时会需要查找一个资源的所有引用的地方,比如查找一个小prefab在那些大prefabs中使用,或者某个建筑物在那些场景中使用,这时就需要一个查找工具供我们快速高效的找到这些引用关系。
准备
using System;
using System.Runtime.InteropServices;//调用外部库,需要引用命名空间
/// <summary>
/// 为了调用外部库脚本
/// </summary>
public class EditorMessage
{
[DllImport("User32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
public static extern int MessageBox(IntPtr handle, String message, String title, int type);//具体方法
}
一个提示窗口
知识点
1.Selection.assetGUIDs 所有选中物体的GUID 2.AssetDatabase.GUIDToAssetPath 利用GUID得到路径 3.EditorSettings.serializationMode = SerializationMode.ForceText 此选项可将所有资源转换为文本模式,并且 Unity 对新资源使用文本模式。这是默认选项 拓展: ????????Mixed? :二进制模式下的资源保持二进制模式,文本模式下的资源保持文本模式。默认情况下,Unity 对新资源使用二进制模式。 ????????Force Binary : 此选项可将所有资源转换为二进制模式,并且 Unity 对新资源使用二进制模式。
4.Directory.GetFiles("Assets", "*.*", SearchOption.AllDirectories).Where(s => s.EndsWith(".prefab") || s.EndsWith(".unity")) 筛选Assets路径下所有的prefab和场景
5.EditorApplication.update 在编辑器模式下每帧执行
6.Regex.IsMatch 正则匹配
7.EditorUtility.DisplayProgressBar("Loading", "打印中......", slider) 进度条
完整代码
public class FindObjectReference {
[MenuItem("Assets/FindAllReference", priority = 12)]
public static void FindObjectAllReference() {
string[] selectUid = Selection.assetGUIDs;
if(selectUid.Length > 1) {
EditorMessage.MessageBox(IntPtr.Zero, "目前只支持单次查找一个物体的所有引用", "确认", 0);
return;
}
string path = AssetDatabase.GUIDToAssetPath(selectUid[0]);
if(Directory.Exists(path)) {
EditorMessage.MessageBox(IntPtr.Zero, "目前不支持文件夹引用的查找", "确认", 0);
return;
} else if(File.Exists(path)) {
if(EditorSettings.serializationMode != SerializationMode.ForceText)
EditorSettings.serializationMode = SerializationMode.ForceText;
string[] allPath = Directory.GetFiles("Assets", "*.*", SearchOption.AllDirectories).Where(s => s.EndsWith(".prefab") || s.EndsWith(".unity")).ToArray();
int start = 0;
int max = allPath.Length;
EditorApplication.update = () => {
string content = File.ReadAllText(allPath[start]);
if(Regex.IsMatch(content, selectUid[0])) {
Debug.Log(allPath[start]);
}
start++;
float slider = (float)start / max;
//参数1 为标题,参数2为提示,参数3为 进度百分比 0~1 之间
EditorUtility.DisplayProgressBar("Loading", "打印中......", slider);
if(start >= max) {
EditorMessage.MessageBox(IntPtr.Zero, "打印完成", "确认", 0);
EditorUtility.ClearProgressBar();
EditorApplication.update = null;
}
};
}
}
}
效果
?
?
|