using System; using System.Collections; using UnityEngine; using UnityEngine.Events; using System.Collections.Generic; using Module.Log; /// /// 基础加载任务类型,用于加载Ui或者其他Bundle名字不额外携带AssetName的类型 /// public class BaseLoadTask where TItem : Component where TLoadData : BaseLoadData where TLoadTask : BaseLoadTask { public string BundleName { get; private set; } public string PrefabName { get; private set; } public bool Archive { get; private set; } public readonly List taskListeners = new List(); public GameObject Prefab { get; private set; } private event UnityAction OnLoadComplete; // 注:实际Init逻辑上和构造在一起,但是构造只能限制为无参,因此只能分开 public void Init(TLoadData taskStarter, string bundleName, string prefabName, bool archive, UnityAction onLoadComplete) { if (taskStarter != null) taskListeners.Add(taskStarter); OnLoadComplete = onLoadComplete; BundleName = bundleName; PrefabName = prefabName; Archive = archive; Load(BundleName, PrefabName); } public void Load(string pBundleName, string pPrefabName) { CommonUtility.LoadAssetInstance(pBundleName, pPrefabName, OnLoadTaskComplete, Archive); } public void CancelLoad(string pBundleName, string pPrefabName) { LoadAssetBundle.Instance.UnloadAsset(pBundleName, pPrefabName); } public bool Match(string pBundleName, string pPrefabName) { return string.Equals(BundleName, pBundleName, StringComparison.InvariantCultureIgnoreCase) && string.Equals(PrefabName, pPrefabName, StringComparison.InvariantCulture); } /// /// 释放加载流程 /// // 注:加载仍然会执行,但是加载任务引用对象可以正常析构 public void ReleaseLoad() { taskListeners.Clear(); Prefab = null; CancelLoad(BundleName, PrefabName); OnLoadComplete = null; } /// /// 检查加载任务是否重复,如果重复就添加到加载回调中 /// public bool TryAddListener(TLoadData taskListener, string bundleName, string prefabName) { var valid = Match(bundleName, prefabName); if (valid && !taskListeners.Contains(taskListener)) taskListeners.Add(taskListener); return valid; } public void RemoveListener(Predicate predicate) { for (var i = taskListeners.Count - 1; i >= 0; i--) if (predicate(taskListeners[i])) taskListeners.RemoveAt(i); } protected void OnLoadTaskComplete(string modelName, GameObject resObj, Hashtable hashParam) { if (resObj == null) LogModule.ErrorLog(string.Format("无法加载Prefab: bundle = {0}, name = {1}", BundleName, PrefabName)); else { Prefab = resObj; if (OnLoadComplete != null) OnLoadComplete.Invoke((TLoadTask) this); // 加载流程完成,等待所需组件被初始化 //Prefab = Object.Instantiate(resObj); // 普通Prefab的处理方式 - 丢在根路径,不主动删除 //Object.DontDestroyOnLoad(Prefab); //Prefab.gameObject.SetActive(false); } } // // 每一帧获得一次Tick,检查是否能够获得 // private void OnUpdateTick() // { // if (Prefab == null || OnLoadComplete == null) // GameManager.gameManager.OnUpdate -= OnUpdateTick; // else // FinishTaskIfComponentLoad(); // } // // private bool FinishTaskIfComponentLoad() // { // var result = Prefab.HasComponent(); // if (Prefab.HasComponent()) // { // GameManager.gameManager.OnUpdate -= OnUpdateTick; // OnLoadComplete((TLoadTask) this); // } // // return result; // } } public class BaseLoadData where TItem : Component where TLoadData : BaseLoadData { public readonly Transform root; public readonly UnityAction callback; public BaseLoadData(Transform root, UnityAction callback) { this.root = root; this.callback = callback; } } // ///// ///// 仿制原来的GameObject加载流程 - bundleName = bundleName + assetName ///// //public class GameObjectLoadTask : BaseLoadTask where TItem : Component where TLoadData : BaseLoadData where TLoadTask : BaseLoadTask //{ // public bool archive; // // public override void Load(string pBundleName, string pPrefabName) // { // // 使用通用的加载GameObject接口,加载完成后释放 // CommonUtility.LoadGameObjectInstance(pBundleName, pPrefabName, OnLoadTaskComplete, archive); // } // // public override void CancelLoad(string pBundleName, string pPrefabName) // { // LoadAssetBundle.Instance.UnloadAssetWithPathFix(pBundleName, pPrefabName); // } //}