using UnityEngine; using System.Collections; using System.Collections.Generic; public class AssetObject : MonoBehaviour { //有名字代表应该被回收 public string name; public string bundleName { get; private set; } public int bundleVersion { get; private set; } public delegate void DelayDelegate(GameObject obj, float time); public bool trailRendererCheck = false; public static Dictionary<string, int> assetRef = new Dictionary<string, int>(); List<TrailRenderer> cachedTrailRenderer = null; public delegate void RemoveDelegate(string name, GameObject go); public static RemoveDelegate removeDelegate = null; List<TrailRenderer> getTrailRenderers() { if (cachedTrailRenderer == null) { TrailRenderer[] trailRenderers = gameObject.GetComponentsInChildren<TrailRenderer>(true); cachedTrailRenderer = new List<TrailRenderer>(trailRenderers); } return cachedTrailRenderer; } //void Awake() //{ //} //// Use this for initialization //void Start () //{ //} public void AddRef(string name, int version) { int i; if(assetRef.TryGetValue(name, out i)) { assetRef[name] = i + 1; } else { assetRef[name] = 1; } bundleName = name; bundleVersion = version; } private void RemoveRef() { int i; CommonUnity3D.XMUnity.LoadUtil.XMUnityAssetBundleManager mgr = CommonUnity3D.XMUnity.LoadUtil.XMUnityAssetBundleManager.GetInstance(); if(mgr == null) { return; } var mfab = mgr.GetXMUnityAssetBundle(bundleName); if (mfab == null || mfab.Version != this.bundleVersion) { Debug.LogWarning("[策划测试请无视]RemoveRef version not match: " + name); return; } if (assetRef.TryGetValue(bundleName, out i)) { int new_count = i - 1; assetRef[bundleName] = new_count; if(new_count == 0) { mgr.UnloadAssetBundle(bundleName, true); } } else { Debug.LogWarning("[策划测试请无视]RemoveRef error: " + name); } } void OnEnable() { if (trailRendererCheck) { List<TrailRenderer> trs = getTrailRenderers(); for (int i = 0; i < trs.Count; i++) { trs[i].Clear(); } } } IEnumerator StartTimer(DelayDelegate handle, float time) { yield return new WaitForSeconds(time); if (handle != null) { handle(this.gameObject, time); } } public void SetDelay(float time, DelayDelegate handle) { StartCoroutine(StartTimer(handle, time)); } public void Destroy() { Destroy(gameObject); } public void Unload() { if (string.IsNullOrEmpty(name)) { UnityEngine.Debug.Log("[策划测试请无视]Unload AssetObject Error: name null"); } else { if(removeDelegate != null) { removeDelegate(name, gameObject); } else { UnityEngine.Debug.Log("[策划测试请无视]Unload AssetObject Error: removeDelegate null"); } } } void OnDestroy() { if (string.IsNullOrEmpty(bundleName)) { UnityEngine.Debug.LogError("[策划测试请无视]RemoveRef AssetObject Error: " + name); } else { RemoveRef(); } } public static void ClearRefs() { assetRef.Clear(); } //public static void ClearRef() //{ // assetRef.Clear(); //} //// Update is called once per frame //void Update () { //} }