来源于宣雨松的书
using UnityEngine;
using UnityEditor;
using System.Reflection;
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
public class Script_03_32 :Editor
{
[MenuItem("Tools/Report/脚本Static引用")]
static void StaticRef ()
{
//静态引用
LoadAssembly ("Assembly-CSharp");
}
static void LoadAssembly(string name)
{
Assembly assembly = null;
try {
assembly = Assembly.Load(name); //从哪个程序集开始搜索
}
catch (Exception ex) {
Debug.LogWarning (ex.Message);
}
finally{
if (assembly != null) {
foreach (Type type in assembly.GetTypes()) { //遍历这个程序集里面的某个类
try {
HashSet<string> assetPaths = new HashSet<string>();
FieldInfo[] listFieldInfo = type.GetFields (BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); //查看每个类的成员
foreach (FieldInfo fieldInfo in listFieldInfo) {
if (!fieldInfo.FieldType.IsValueType)//检查引用类型是否有强引用
{
SearchProperties (fieldInfo.GetValue (null)/*把字段转成引用类型*/,assetPaths);
}//值类型肯定会被释放掉
}
if (assetPaths.Count > 0) {
StringBuilder sb = new StringBuilder ();
sb.AppendFormat ("{0}.cs\n", type.ToString ());
foreach (string path in assetPaths) {
sb.AppendFormat ("\t{0}\n", path);
}
Debug.Log (sb.ToString ());
}//有一个类文件不对就要打印出来
} catch(Exception ex){
Debug.LogWarning (ex.Message);
}
}
}
}
}
static HashSet<string> SearchProperties(object obj,HashSet<string> assetPaths) //检查哪些属性被强引用
{ //背景:编辑器脚本,退出游戏后,还有引用肯定不正常
if (obj != null) {
if (obj is UnityEngine.Object) {//Unity Object,检查依赖它的
UnityEngine.Object[]depen = EditorUtility.CollectDependencies (new UnityEngine.Object[]{ obj as UnityEngine.Object });
foreach (var item in depen) {
string assetPath = AssetDatabase.GetAssetPath (item);
if (!string.IsNullOrEmpty (assetPath)) {
if (!assetPaths.Contains (assetPath)) {
assetPaths.Add (assetPath);
}
}
}
} else if (obj is IEnumerable) { //迭代器:一个object集合
foreach (object child in (obj as IEnumerable)) {
SearchProperties (child,assetPaths);
}
}else if (obj is System.Object) { //System Object
if (!obj.GetType ().IsValueType) { //System Obj的值类型也肯定会被释放,相反非unity的object,类、无法通过Editor查看Project Asset内有哪些资源引用了他,肯定不会引用,所以需要检查他的字段是否有unity obj类型
FieldInfo[] fieldInfos = obj.GetType ().GetFields ();
foreach (FieldInfo fieldInfo in fieldInfos) {
object o = fieldInfo.GetValue (obj);
if (o != obj) {
SearchProperties (fieldInfo.GetValue (obj),assetPaths);
}
}
}
}
}
return assetPaths;
}
}