/// <summary> /// 用于解绑回调 /// </summary> public void RemoveCallback(string assetName, PrefabLoadCallback callFun) { if (callFun == null) { return; } PrefabObject prefabObj = null; if (loadedList.ContainsKey(assetName)) { prefabObj = loadedList[assetName]; } if (prefabObj != null) { int index = prefabObj.CallbackList.IndexOf(callFun); if (index >= 0) { prefabObj.RefCount--; prefabObj.CallbackList.RemoveAt(index); prefabObj.CallParentList.RemoveAt(index); if (index < prefabObj.LockCallbackCount) // 说明是加载回调过程中解绑回调,需要降低lock个数 { prefabObj.LockCallbackCount--; } } if (prefabObj.RefCount < 0) { string errormsg = string.Format("PrefabLoadMgr Destroy refCount error ! assetName:{0}", prefabObj.AssetName); Debug.LogError(errormsg); return; } if (prefabObj.RefCount == 0) { loadedList.Remove(prefabObj.AssetName); assetLoadMgr.Unload(prefabObj.Asset); prefabObj.Asset = null; } } }
/// <summary> /// 异步实例化资源 /// </summary> /// <param name="assetName"></param> public void LoadAsync(string assetName, PrefabLoadCallback callFun, Transform parent) { PrefabObject prefabObj = null; if (loadedList.ContainsKey(assetName)) { prefabObj = loadedList[assetName]; prefabObj.CallbackList.Add(callFun); prefabObj.CallParentList.Add(parent); prefabObj.RefCount++; if (prefabObj.Asset != null) { loadedAsyncList.Add(prefabObj); } return; } prefabObj = new PrefabObject() { AssetName = assetName, RefCount = 1 }; prefabObj.CallbackList.Add(callFun); prefabObj.CallParentList.Add(parent); loadedList.Add(assetName, prefabObj); assetLoadMgr.LoadAsync(assetName, (string name, Object obj) => { prefabObj.Asset = obj; prefabObj.LockCallbackCount = prefabObj.CallbackList.Count; DoInstanceAssetCallback(prefabObj); } ); }