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