144 lines
5.3 KiB
C#
144 lines
5.3 KiB
C#
using System;
|
||
using System.Collections;
|
||
using UnityEngine;
|
||
using UnityEngine.Events;
|
||
using System.Collections.Generic;
|
||
using Module.Log;
|
||
|
||
/// <summary>
|
||
/// 基础加载任务类型,用于加载Ui或者其他Bundle名字不额外携带AssetName的类型
|
||
/// </summary>
|
||
public class BaseLoadTask<TItem, TLoadData, TLoadTask> where TItem : Component where TLoadData : BaseLoadData<TItem, TLoadData> where TLoadTask : BaseLoadTask<TItem, TLoadData, TLoadTask>
|
||
{
|
||
public string BundleName { get; private set; }
|
||
public string PrefabName { get; private set; }
|
||
public bool Archive { get; private set; }
|
||
public readonly List<TLoadData> taskListeners = new List<TLoadData>();
|
||
public GameObject Prefab { get; private set; }
|
||
private event UnityAction<TLoadTask> OnLoadComplete;
|
||
|
||
// 注:实际Init逻辑上和构造在一起,但是构造只能限制为无参,因此只能分开
|
||
public void Init(TLoadData taskStarter, string bundleName, string prefabName, bool archive, UnityAction<TLoadTask> 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);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 释放加载流程
|
||
/// </summary>
|
||
// 注:加载仍然会执行,但是加载任务引用对象可以正常析构
|
||
public void ReleaseLoad()
|
||
{
|
||
taskListeners.Clear();
|
||
Prefab = null;
|
||
CancelLoad(BundleName, PrefabName);
|
||
OnLoadComplete = null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 检查加载任务是否重复,如果重复就添加到加载回调中
|
||
/// </summary>
|
||
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<TLoadData> 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<TItem>();
|
||
// if (Prefab.HasComponent<TItem>())
|
||
// {
|
||
// GameManager.gameManager.OnUpdate -= OnUpdateTick;
|
||
// OnLoadComplete((TLoadTask) this);
|
||
// }
|
||
//
|
||
// return result;
|
||
// }
|
||
}
|
||
|
||
public class BaseLoadData<TItem, TLoadData> where TItem : Component where TLoadData : BaseLoadData<TItem, TLoadData>
|
||
{
|
||
public readonly Transform root;
|
||
public readonly UnityAction<TItem, TLoadData> callback;
|
||
public BaseLoadData(Transform root, UnityAction<TItem, TLoadData> callback)
|
||
{
|
||
this.root = root;
|
||
this.callback = callback;
|
||
}
|
||
}
|
||
//
|
||
///// <summary>
|
||
///// 仿制原来的GameObject加载流程 - bundleName = bundleName + assetName
|
||
///// </summary>
|
||
//public class GameObjectLoadTask<TItem, TLoadData, TLoadTask> : BaseLoadTask<TItem, TLoadData, TLoadTask> where TItem : Component where TLoadData : BaseLoadData<TItem, TLoadData> where TLoadTask : BaseLoadTask<TItem, TLoadData, TLoadTask>
|
||
//{
|
||
// 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);
|
||
// }
|
||
//} |