Unity强引用资源未释放的监控

来源于宣雨松的书

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;
	}
}

在这里插入图片描述

发布了67 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Icecoldless/article/details/103719717