Compare commits

...

10 Commits

Author SHA1 Message Date
ALEXTANG
6cfd352482 关闭ResourceCacheMgr测试日志
关闭ResourceCacheMgr测试日志
2023-12-07 10:30:50 +08:00
ALEXTANG
40373c473d 修改通过Tag加载资源对象集合接口。(Operation需要自行管理生命周期释放)
修改通过Tag加载资源对象集合接口。(Operation需要自行管理生命周期释放)
2023-12-07 10:27:17 +08:00
ALEXTANG
d799f9fdf0 优化资源引用类与资源分组类。 2023-12-06 17:57:54 +08:00
ALEXTANG
15735c3d2d 修正循环列表GetItem,增加普通列表组件。 2023-12-06 14:41:31 +08:00
ALEXTANG
818a74f437 释放资源前判断资源合法性 2023-12-06 11:35:33 +08:00
ALEXTANG
f248757401 消除Editor引用隐患
消除Editor引用隐患
2023-12-01 17:41:43 +08:00
ALEXTANG
6ada0e7de7 移除测试日志 2023-12-01 17:18:13 +08:00
ALEXTANG
7ea472f97e 修正日志重定向下层日志跳转功能
修正日志重定向下层日志跳转功能
2023-12-01 10:45:57 +08:00
ALEXTANG
fb8528ff52 音频代理类增加暂停和取消暂停接口。
音频代理类增加暂停和取消暂停接口。
2023-11-30 16:17:35 +08:00
ALEXTANG
e3ac92ef46 修正音频模块回收池
修正音频模块回收池
2023-11-30 15:30:01 +08:00
15 changed files with 373 additions and 249 deletions

View File

@@ -9,10 +9,10 @@ namespace GameLogic
/// <summary> /// <summary>
/// UI列表Item /// UI列表Item
/// </summary> /// </summary>
/// <typeparam name="DataT"></typeparam> /// <typeparam name="TData"></typeparam>
public interface IListDataItem<in DataT> public interface IListDataItem<in TData>
{ {
void SetItemData(DataT d); void SetItemData(TData d);
} }
/// <summary> /// <summary>
@@ -180,8 +180,7 @@ namespace GameLogic
/// <param name="n"></param> /// <param name="n"></param>
public void SetDatas(List<DataT> dataList, int n = -1) public void SetDatas(List<DataT> dataList, int n = -1)
{ {
AdjustItemNum(Mathf.Max(0, n >= 0 ? n : (dataList == null ? 0 : (dataList.Count - dataStartOffset))), AdjustItemNum(Mathf.Max(0, n >= 0 ? n : (dataList == null ? 0 : (dataList.Count - dataStartOffset))), dataList);
dataList);
} }
/// <summary> /// <summary>
@@ -215,8 +214,7 @@ namespace GameLogic
return; return;
} }
var listDataItem = item as IListDataItem<DataT>; if (item is IListDataItem<DataT> listDataItem)
if (listDataItem != null)
{ {
listDataItem.SetItemData(GetData(i)); listDataItem.SetItemData(GetData(i));
} }
@@ -271,8 +269,7 @@ namespace GameLogic
var preIndex = selectIndex; var preIndex = selectIndex;
m_selectIndex = i; m_selectIndex = i;
var item = GetItem(preIndex) as IListSelectItem; if (GetItem(preIndex) is IListSelectItem item)
if (item != null)
{ {
item.SetSelected(false); item.SetSelected(false);
} }
@@ -282,13 +279,20 @@ namespace GameLogic
{ {
item.SetSelected(true); item.SetSelected(true);
} }
UpdateSnapTargetItem();
if (triggerEvt && funcOnSelectChange != null) if (triggerEvt && funcOnSelectChange != null)
{ {
funcOnSelectChange.Invoke(); funcOnSelectChange.Invoke();
} }
} }
/// <summary>
/// 刷新Snap
/// </summary>
protected virtual void UpdateSnapTargetItem()
{
}
/// <summary> /// <summary>
/// 获取当前选中的数据 /// 获取当前选中的数据
/// </summary> /// </summary>
@@ -312,13 +316,18 @@ namespace GameLogic
/// <summary> /// <summary>
/// 获取item /// 获取item
/// </summary> /// </summary>
/// <param name="index"></param> /// <param name="i"></param>
/// <returns></returns> /// <returns></returns>
public virtual ItemT GetItem(int index) public virtual ItemT GetItem(int i)
{ {
return null; return null;
} }
/// <summary>
/// 点击选择
/// </summary>
public bool SelectByClick = true;
/// <summary> /// <summary>
/// item被点击 /// item被点击
/// </summary> /// </summary>
@@ -331,7 +340,10 @@ namespace GameLogic
funcOnItemClick.Invoke(i); funcOnItemClick.Invoke(i);
} }
selectIndex = i; if (SelectByClick)
{
selectIndex = i;
}
} }
} }
} }

View File

@@ -0,0 +1,57 @@
using System;
using System.Collections.Generic;
using TEngine;
namespace GameLogic
{
/// <summary>
/// 普通UI列表。
/// </summary>
public class UIListWidget<TItem, TData> : UIListBase<TItem, TData> where TItem : UIWidget, new()
{
/// <summary>
/// item列表。
/// </summary>
protected List<TItem> m_items = new List<TItem>();
/// <summary>
/// item列表。
/// </summary>
public List<TItem> items => m_items;
/// <summary>
/// 设置显示数据。
/// </summary>
/// <param name="n"></param>
/// <param name="datas"></param>
/// <param name="funcItem"></param>
protected override void AdjustItemNum(int n, List<TData> datas = null, Action<TItem, int> funcItem = null)
{
base.AdjustItemNum(n, datas, funcItem);
AdjustIconNum(m_items, n, gameObject.transform, itemBase);
UpdateList(funcItem);
}
/// <summary>
/// 刷新列表。
/// </summary>
/// <param name="funcItem"></param>
protected void UpdateList(Action<TItem, int> funcItem = null)
{
for (var i = 0; i < m_items.Count; i++)
{
UpdateListItem(m_items[i], i, funcItem);
}
}
/// <summary>
/// 获取item
/// </summary>
/// <param name="i"></param>
/// <returns></returns>
public override TItem GetItem(int i)
{
return i >= 0 && i < m_items.Count ? m_items[i] : null;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 96f732d895e94fbc99c904d66ca844ca
timeCreated: 1701844130

View File

@@ -66,6 +66,7 @@ namespace GameLogic
LoopRectView.SetListItemCount(n); LoopRectView.SetListItemCount(n);
LoopRectView.RefreshAllShownItem(); LoopRectView.RefreshAllShownItem();
m_tpFuncItem = null; m_tpFuncItem = null;
UpdateAllItemSelect();
} }
/// <summary> /// <summary>
@@ -145,14 +146,23 @@ namespace GameLogic
return widget; return widget;
} }
/// <summary> /// <summary>
/// 获取item /// 获取item
/// </summary> /// </summary>
/// <param name="index"></param> /// <param name="index"></param>
/// <returns></returns> /// <returns></returns>
public override TItem GetItem(int index) public override TItem GetItem(int index)
{ {
return index >= 0 && index < m_itemCache.Count ? m_itemCache.GetValueByIndex(index) : null; for (var i = 0; i < m_itemCache.Count; i++)
{
var item = m_itemCache.GetValueByIndex(i);
if (item.GetItemIndex() == index)
{
return item;
}
}
return null;
} }
/// <summary> /// <summary>
@@ -178,5 +188,21 @@ namespace GameLogic
{ {
return m_itemCache.GetValueByIndex(index); return m_itemCache.GetValueByIndex(index);
} }
/// <summary>
/// 刷新所有item选中状态
/// </summary>
/// <returns></returns>
public void UpdateAllItemSelect()
{
var index = selectIndex;
for (var i = 0; i < m_itemCache.Count; i++)
{
if (m_itemCache.GetValueByIndex(i) is IListSelectItem item)
{
item.SetSelected(item.GetItemIndex() == index);
}
}
}
} }
} }

View File

@@ -65,8 +65,9 @@ namespace GameLogic
base.AdjustItemNum(n, datas, funcItem); base.AdjustItemNum(n, datas, funcItem);
m_tpFuncItem = funcItem; m_tpFuncItem = funcItem;
LoopRectView.SetListItemCount(n); LoopRectView.SetListItemCount(n);
// LoopRectView.RefreshAllShownItem(); LoopRectView.RefreshAllShownItem();
m_tpFuncItem = null; m_tpFuncItem = null;
UpdateAllItemSelect();
} }
/// <summary> /// <summary>
@@ -151,7 +152,16 @@ namespace GameLogic
/// <returns></returns> /// <returns></returns>
public override TItem GetItem(int index) public override TItem GetItem(int index)
{ {
return index >= 0 && index < m_itemCache.Count ? m_itemCache.GetValueByIndex(index) : null; for (var i = 0; i < m_itemCache.Count; i++)
{
var item = m_itemCache.GetValueByIndex(i);
if (item.GetItemIndex() == index)
{
return item;
}
}
return null;
} }
/// <summary> /// <summary>
@@ -186,5 +196,30 @@ namespace GameLogic
{ {
return m_itemCache.GetValueByIndex(index); return m_itemCache.GetValueByIndex(index);
} }
/// <summary>
/// 刷新所有item选中状态
/// </summary>
/// <returns></returns>
public void UpdateAllItemSelect()
{
var index = selectIndex;
for (var i = 0; i < m_itemCache.Count; i++)
{
if (m_itemCache.GetValueByIndex(i) is IListSelectItem item)
{
item.SetSelected(item.GetItemIndex() == index);
}
}
}
protected override void UpdateSnapTargetItem()
{
base.UpdateSnapTargetItem();
if (LoopRectView != null && LoopRectView.ItemSnapEnable)
{
LoopRectView.SetSnapTargetItemIndex(selectIndex);
}
}
} }
} }

View File

@@ -19,6 +19,21 @@ namespace TEngine.Editor
{ {
return false; return false;
} }
// 获取资源路径
string assetPath = AssetDatabase.GetAssetPath(instanceID);
// 判断资源类型
if (!assetPath.EndsWith(".cs"))
{
return false;
}
bool autoFirstMatch = assetPath.Contains("Logger.cs") ||
assetPath.Contains("DefaultLogHelper.cs") ||
assetPath.Contains("GameFrameworkLog.cs") ||
assetPath.Contains("AssetsLogger.cs") ||
assetPath.Contains("Log.cs");
var stackTrace = GetStackTrace(); var stackTrace = GetStackTrace();
if (!string.IsNullOrEmpty(stackTrace) && (stackTrace.Contains("[Debug]") || if (!string.IsNullOrEmpty(stackTrace) && (stackTrace.Contains("[Debug]") ||
stackTrace.Contains("[INFO]") || stackTrace.Contains("[INFO]") ||
@@ -28,6 +43,15 @@ namespace TEngine.Editor
stackTrace.Contains("[EXCEPTION]"))) stackTrace.Contains("[EXCEPTION]")))
{ {
if (!autoFirstMatch)
{
var fullPath = UnityEngine.Application.dataPath.Substring(0, UnityEngine.Application.dataPath.LastIndexOf("Assets", StringComparison.Ordinal));
fullPath = $"{fullPath}{assetPath}";
// 跳转到目标代码的特定行
InternalEditorUtility.OpenFileAtLineExternal(fullPath.Replace('/', '\\'), line);
return true;
}
// 使用正则表达式匹配at的哪个脚本的哪一行 // 使用正则表达式匹配at的哪个脚本的哪一行
var matches = Regex.Match(stackTrace, @"\(at (.+)\)", var matches = Regex.Match(stackTrace, @"\(at (.+)\)",
RegexOptions.IgnoreCase); RegexOptions.IgnoreCase);

View File

@@ -1,7 +1,9 @@
using System; using System;
using System.IO; using System.IO;
using System.Text; using System.Text;
#if UNITY_EDITOR
using UnityEditor; using UnityEditor;
#endif
using UnityEngine; using UnityEngine;
namespace TEngine namespace TEngine

View File

@@ -4,6 +4,46 @@ using YooAsset;
namespace TEngine namespace TEngine
{ {
public class AudioData : MemoryObject
{
public AssetOperationHandle AssetOperationHandle { private set; get; }
public bool InPool { private set; get; } = false;
public override void InitFromPool()
{
}
public override void RecycleToPool()
{
if (!InPool)
{
AssetOperationHandle.Dispose();
}
InPool = false;
AssetOperationHandle = null;
}
internal static AudioData Alloc(AssetOperationHandle assetOperationHandle, bool inPool)
{
AudioData ret = MemoryPool.Acquire<AudioData>();
ret.AssetOperationHandle = assetOperationHandle;
ret.InPool = inPool;
ret.InitFromPool();
return ret;
}
internal static void DeAlloc(AudioData audioData)
{
if (audioData != null)
{
MemoryPool.Release(audioData);
audioData.RecycleToPool();
}
}
}
/// <summary> /// <summary>
/// 音频代理辅助器。 /// 音频代理辅助器。
/// </summary> /// </summary>
@@ -11,7 +51,7 @@ namespace TEngine
{ {
private int _instanceId; private int _instanceId;
private AudioSource _source; private AudioSource _source;
private AssetOperationHandle _assetOperationHandle; private AudioData _audioData;
private AudioModuleImp _audioModuleImp; private AudioModuleImp _audioModuleImp;
private Transform _transform; private Transform _transform;
float _volume = 1.0f; float _volume = 1.0f;
@@ -32,6 +72,7 @@ namespace TEngine
{ {
public string Path; public string Path;
public bool BAsync; public bool BAsync;
public bool BInPool;
} }
/// <summary> /// <summary>
@@ -47,7 +88,7 @@ namespace TEngine
/// <summary> /// <summary>
/// 资源操作句柄。 /// 资源操作句柄。
/// </summary> /// </summary>
public AssetOperationHandle AssetOperationHandle => _assetOperationHandle; public AudioData AudioData => _audioData;
/// <summary> /// <summary>
/// 音频代理辅助器音频大小。 /// 音频代理辅助器音频大小。
@@ -196,7 +237,8 @@ namespace TEngine
_source = host.AddComponent<AudioSource>(); _source = host.AddComponent<AudioSource>();
_source.playOnAwake = false; _source.playOnAwake = false;
AudioMixerGroup[] audioMixerGroups = AudioMixerGroup[] audioMixerGroups =
audioCategory.AudioMixer.FindMatchingGroups(Utility.Text.Format("Master/{0}/{1}", audioCategory.AudioMixerGroup.name, $"{audioCategory.AudioMixerGroup.name} - {index}")); audioCategory.AudioMixer.FindMatchingGroups(Utility.Text.Format("Master/{0}/{1}", audioCategory.AudioMixerGroup.name,
$"{audioCategory.AudioMixerGroup.name} - {index}"));
_source.outputAudioMixerGroup = audioMixerGroups.Length > 0 ? audioMixerGroups[0] : audioCategory.AudioMixerGroup; _source.outputAudioMixerGroup = audioMixerGroups.Length > 0 ? audioMixerGroups[0] : audioCategory.AudioMixerGroup;
_source.rolloffMode = audioCategory.AudioGroupConfig.audioRolloffMode; _source.rolloffMode = audioCategory.AudioGroupConfig.audioRolloffMode;
_source.minDistance = audioCategory.AudioGroupConfig.minDistance; _source.minDistance = audioCategory.AudioGroupConfig.minDistance;
@@ -218,7 +260,7 @@ namespace TEngine
_duration = 0; _duration = 0;
if (!string.IsNullOrEmpty(path)) if (!string.IsNullOrEmpty(path))
{ {
if (_audioModuleImp.AudioClipPool.TryGetValue(path, out var operationHandle)) if (bInPool && _audioModuleImp.AudioClipPool.TryGetValue(path, out var operationHandle))
{ {
OnAssetLoadComplete(operationHandle); OnAssetLoadComplete(operationHandle);
return; return;
@@ -239,7 +281,7 @@ namespace TEngine
} }
else else
{ {
_pendingLoad = new LoadRequest { Path = path, BAsync = bAsync }; _pendingLoad = new LoadRequest { Path = path, BAsync = bAsync, BInPool = bInPool };
if (_audioAgentRuntimeState == AudioAgentRuntimeState.Playing) if (_audioAgentRuntimeState == AudioAgentRuntimeState.Playing)
{ {
@@ -249,7 +291,7 @@ namespace TEngine
} }
/// <summary> /// <summary>
/// 停音频代理辅助器。 /// 停止播放音频代理辅助器。
/// </summary> /// </summary>
/// <param name="fadeout">是否渐出。</param> /// <param name="fadeout">是否渐出。</param>
public void Stop(bool fadeout = false) public void Stop(bool fadeout = false)
@@ -269,6 +311,28 @@ namespace TEngine
} }
} }
/// <summary>
/// 暂停音频代理辅助器。
/// </summary>
public void Pause()
{
if (_source != null)
{
_source.Pause();
}
}
/// <summary>
/// 取消暂停音频代理辅助器。
/// </summary>
public void UnPause()
{
if (_source != null)
{
_source.UnPause();
}
}
/// <summary> /// <summary>
/// 资源加载完成。 /// 资源加载完成。
/// </summary> /// </summary>
@@ -277,16 +341,15 @@ namespace TEngine
{ {
if (handle != null) if (handle != null)
{ {
handle.Completed -= OnAssetLoadComplete;
if (_inPool) if (_inPool)
{ {
_audioModuleImp.AudioClipPool.TryAdd(handle.GetAssetInfo().AssetPath, handle); _audioModuleImp.AudioClipPool.TryAdd(handle.GetAssetInfo().Address, handle);
} }
} }
if (_pendingLoad != null) if (_pendingLoad != null)
{ {
if (handle != null) if (!_inPool && handle != null)
{ {
handle.Dispose(); handle.Dispose();
} }
@@ -294,19 +357,21 @@ namespace TEngine
_audioAgentRuntimeState = AudioAgentRuntimeState.End; _audioAgentRuntimeState = AudioAgentRuntimeState.End;
string path = _pendingLoad.Path; string path = _pendingLoad.Path;
bool bAsync = _pendingLoad.BAsync; bool bAsync = _pendingLoad.BAsync;
bool bInPool = _pendingLoad.BInPool;
_pendingLoad = null; _pendingLoad = null;
Load(path, bAsync); Load(path, bAsync, bInPool);
} }
else if (handle != null) else if (handle != null)
{ {
if (_assetOperationHandle != null) if (_audioData != null)
{ {
_assetOperationHandle.Dispose(); AudioData.DeAlloc(_audioData);
_audioData = null;
} }
_assetOperationHandle = handle; _audioData = AudioData.Alloc(handle, _inPool);
_source.clip = _assetOperationHandle.AssetObject as AudioClip; _source.clip = handle.AssetObject as AudioClip;
if (_source.clip != null) if (_source.clip != null)
{ {
_source.Play(); _source.Play();
@@ -350,8 +415,9 @@ namespace TEngine
{ {
string path = _pendingLoad.Path; string path = _pendingLoad.Path;
bool bAsync = _pendingLoad.BAsync; bool bAsync = _pendingLoad.BAsync;
bool bInPool = _pendingLoad.BInPool;
_pendingLoad = null; _pendingLoad = null;
Load(path, bAsync); Load(path, bAsync, bInPool);
} }
_source.volume = _volume; _source.volume = _volume;
@@ -371,9 +437,9 @@ namespace TEngine
Object.Destroy(_transform.gameObject); Object.Destroy(_transform.gameObject);
} }
if (_assetOperationHandle != null) if (_audioData != null)
{ {
_assetOperationHandle.Dispose(); AudioData.DeAlloc(_audioData);
} }
} }
} }

View File

@@ -127,7 +127,7 @@ namespace TEngine
for (int i = 0; i < AudioAgents.Count; i++) for (int i = 0; i < AudioAgents.Count; i++)
{ {
if (AudioAgents[i].AssetOperationHandle == null || AudioAgents[i].IsFree) if (AudioAgents[i].AudioData?.AssetOperationHandle == null || AudioAgents[i].IsFree)
{ {
freeChannel = i; freeChannel = i;
break; break;

View File

@@ -22,7 +22,8 @@ namespace TEngine
public AssetOperationHandle Handle => _handle; public AssetOperationHandle Handle => _handle;
/// <summary> /// <summary>
/// 标签。 /// 自定义资源标签。
/// <remarks>不同于AssetTag。</remarks>
/// </summary> /// </summary>
public string Tag { private set; get; } public string Tag { private set; get; }
@@ -31,7 +32,7 @@ namespace TEngine
/// </summary> /// </summary>
public void Clear() public void Clear()
{ {
if (_handle != null) if (_handle is { IsValid: true })
{ {
_handle.Dispose(); _handle.Dispose();
} }
@@ -79,6 +80,7 @@ namespace TEngine
{ {
private readonly Dictionary<string,AssetHandleData> _assetHandleDataMap = new Dictionary<string,AssetHandleData>(); private readonly Dictionary<string,AssetHandleData> _assetHandleDataMap = new Dictionary<string,AssetHandleData>();
#region
/// <summary> /// <summary>
/// 引用资源数据到资源组内。 /// 引用资源数据到资源组内。
/// </summary> /// </summary>
@@ -105,32 +107,38 @@ namespace TEngine
_assetHandleDataMap[address] = handleData; _assetHandleDataMap[address] = handleData;
return true; return true;
} }
#endregion
#region
private readonly List<AssetHandleData> _tempResult = new List<AssetHandleData>();
/// <summary> /// <summary>
/// 从资源组内释放资源数据。 /// 从资源组内释放资源数据。
/// </summary> /// </summary>
/// <param name="assetTag">资源标签。</param> /// <param name="tag">自定义资源标签。</param>
/// <returns>是否释放成功。</returns> /// <returns>是否释放成功。</returns>
public bool ReleaseByTag(string assetTag) public bool ReleaseByTag(string tag)
{ {
AssetHandleData founded = null; _tempResult.Clear();
foreach (var assetHandleData in _assetHandleDataMap.Values) foreach (var assetHandleData in _assetHandleDataMap.Values)
{ {
if (assetHandleData.Tag == assetTag) if (assetHandleData.Tag == tag)
{ {
founded = assetHandleData; _tempResult.Add(assetHandleData);
break;
} }
} }
if (founded != null) if (_tempResult.Count > 0)
{ {
_assetHandleDataMap.Remove(founded.Handle.GetAssetInfo().Address); foreach (var founded in _tempResult)
AssetHandleData.Release(founded); {
_assetHandleDataMap.Remove(founded.Handle.GetAssetInfo().Address);
AssetHandleData.Release(founded);
}
return true; return true;
} }
Log.Warning($"Release AssetHandleData Tag:{assetTag} Failed"); Log.Warning($"Release AssetHandleData Tag:{tag} Failed");
return false; return false;
} }
@@ -178,20 +186,9 @@ namespace TEngine
Log.Warning($"Release AssetHandleData Handle:{handle} Failed"); Log.Warning($"Release AssetHandleData Handle:{handle} Failed");
return false; return false;
} }
#endregion
public void Clear() #region
{
var etr = _assetHandleDataMap.GetEnumerator();
while (etr.MoveNext())
{
AssetHandleData assetHandleData = etr.Current.Value;
AssetHandleData.Release(assetHandleData);
}
etr.Dispose();
_assetHandleDataMap.Clear();
}
/// <summary> /// <summary>
/// 从内存池中获取资源分组数据。 /// 从内存池中获取资源分组数据。
/// </summary> /// </summary>
@@ -217,24 +214,40 @@ namespace TEngine
MemoryPool.Release(assetGroup); MemoryPool.Release(assetGroup);
} }
public void Clear()
{
var etr = _assetHandleDataMap.GetEnumerator();
while (etr.MoveNext())
{
AssetHandleData assetHandleData = etr.Current.Value;
AssetHandleData.Release(assetHandleData);
}
etr.Dispose();
_assetHandleDataMap.Clear();
}
#endregion
/// <summary> /// <summary>
/// 同步加载资源。 /// 同步加载资源。
/// </summary> /// </summary>
/// <param name="assetName">要加载资源的名称。</param> /// <param name="location">资源的定位地址。</param>
/// <param name="parent">父节点位置。</param> /// <param name="parent">父节点位置。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns> /// <returns>资源实例。</returns>
public T LoadAsset<T>(string assetName, Transform parent = null) where T : Object public T LoadAsset<T>(string location, bool needInstance = true,string packageName = "",Transform parent = null) where T : Object
{ {
if (string.IsNullOrEmpty(assetName)) if (string.IsNullOrEmpty(location))
{ {
Log.Error("Asset name is invalid."); Log.Error("Asset name is invalid.");
return default; return default;
} }
if (_assetHandleDataMap.TryGetValue(assetName,out var assetHandleData)) if (_assetHandleDataMap.TryGetValue(location,out var assetHandleData))
{ {
if (typeof(T) == typeof(GameObject)) if (typeof(T) == typeof(GameObject) && needInstance)
{ {
GameObject ret = assetHandleData.Handle.InstantiateSync(parent); GameObject ret = assetHandleData.Handle.InstantiateSync(parent);
return ret as T; return ret as T;
@@ -245,11 +258,20 @@ namespace TEngine
} }
} }
AssetOperationHandle handle = YooAssets.LoadAssetSync<T>(assetName); AssetOperationHandle handle;
if (string.IsNullOrEmpty(packageName))
{
handle = YooAssets.LoadAssetSync<T>(location);
}
else
{
var package = YooAssets.GetPackage(packageName);
handle = package.LoadAssetSync<T>(location);
}
Reference(handle); Reference(handle);
if (typeof(T) == typeof(GameObject)) if (typeof(T) == typeof(GameObject) && needInstance)
{ {
GameObject ret = handle.InstantiateSync(parent); GameObject ret = handle.InstantiateSync(parent);
return ret as T; return ret as T;
@@ -261,113 +283,27 @@ namespace TEngine
} }
/// <summary> /// <summary>
/// 步加载资源。 /// 步加载资源。
/// </summary> /// </summary>
/// <param name="assetName">要加载资源的名称。</param> /// <param name="location">资源的定位地址。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <param name="assetOperationHandle">资源操作句柄。</param>
/// <returns>资源实例。</returns>
public T LoadAsset<T>(string assetName,out AssetOperationHandle assetOperationHandle) where T : Object
{
assetOperationHandle = null;
if (string.IsNullOrEmpty(assetName))
{
Log.Error("Asset name is invalid.");
return default;
}
if (_assetHandleDataMap.TryGetValue(assetName,out var assetHandleData))
{
if (typeof(T) == typeof(GameObject))
{
GameObject ret = assetHandleData.Handle.InstantiateSync();
return ret as T;
}
else
{
return assetHandleData.Handle.AssetObject as T;
}
}
assetOperationHandle = YooAssets.LoadAssetSync<T>(assetName);
Reference(assetOperationHandle);
if (typeof(T) == typeof(GameObject))
{
GameObject ret = assetOperationHandle.InstantiateSync();
return ret as T;
}
else
{
return assetOperationHandle.AssetObject as T;
}
}
/// <summary>
/// 同步加载资源。
/// </summary>
/// <param name="assetName">要加载资源的名称。</param>
/// <param name="parent">父节点位置。</param>
/// <param name="assetOperationHandle">资源操作句柄。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
public T LoadAsset<T>(string assetName, Transform parent,out AssetOperationHandle assetOperationHandle) where T : Object
{
assetOperationHandle = null;
if (string.IsNullOrEmpty(assetName))
{
Log.Error("Asset name is invalid.");
return default;
}
if (_assetHandleDataMap.TryGetValue(assetName,out var assetHandleData))
{
if (typeof(T) == typeof(GameObject))
{
GameObject ret = assetHandleData.Handle.InstantiateSync(parent);
return ret as T;
}
else
{
return assetHandleData.Handle.AssetObject as T;
}
}
assetOperationHandle = YooAssets.LoadAssetSync<T>(assetName);
Reference(assetOperationHandle);
if (typeof(T) == typeof(GameObject))
{
GameObject ret = assetOperationHandle.InstantiateSync(parent);
return ret as T;
}
else
{
return assetOperationHandle.AssetObject as T;
}
}
/// <summary>
/// 异步加载资源实例。
/// </summary>
/// <param name="assetName">要加载的实例名称。</param>
/// <param name="cancellationToken">取消操作Token。</param> /// <param name="cancellationToken">取消操作Token。</param>
/// <returns>资源实实例。</returns> /// <param name="needInstance">是否需要实例。</param>
// ReSharper disable once UnusedParameter.Global /// <param name="packageName">指定资源包的名称。不传使用默认资源包。</param>
// ReSharper disable once RedundantAssignment /// <param name="parent">资源实例父节点。</param>
public async UniTask<T> LoadAssetAsync<T>(string assetName, CancellationToken cancellationToken = default) where T : Object /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>异步资源实例。</returns>
public async UniTask<T> LoadAssetAsync<T>(string location, CancellationToken cancellationToken = default,
bool needInstance = true, string packageName = "", Transform parent = null) where T : Object
{ {
if (string.IsNullOrEmpty(assetName)) if (string.IsNullOrEmpty(location))
{ {
Log.Error("Asset name is invalid."); Log.Error("Asset name is invalid.");
return default; return default;
} }
if (_assetHandleDataMap.TryGetValue(assetName,out var assetHandleData)) if (_assetHandleDataMap.TryGetValue(location,out var assetHandleData))
{ {
if (typeof(T) == typeof(GameObject)) if (typeof(T) == typeof(GameObject) && needInstance)
{ {
GameObject ret = assetHandleData.Handle.InstantiateSync(); GameObject ret = assetHandleData.Handle.InstantiateSync();
return ret as T; return ret as T;
@@ -378,7 +314,16 @@ namespace TEngine
} }
} }
AssetOperationHandle handle = YooAssets.LoadAssetAsync<T>(assetName); AssetOperationHandle handle;
if (string.IsNullOrEmpty(packageName))
{
handle = YooAssets.LoadAssetSync<T>(location);
}
else
{
var package = YooAssets.GetPackage(packageName);
handle = package.LoadAssetSync<T>(location);
}
Reference(handle); Reference(handle);
@@ -391,9 +336,9 @@ namespace TEngine
return null; return null;
} }
if (typeof(T) == typeof(GameObject)) if (typeof(T) == typeof(GameObject) && needInstance)
{ {
GameObject ret = handle.InstantiateSync(); GameObject ret = handle.InstantiateSync(parent);
return ret as T; return ret as T;
} }
else else
@@ -401,16 +346,5 @@ namespace TEngine
return handle.AssetObject as T; return handle.AssetObject as T;
} }
} }
/// <summary>
/// 异步加载游戏物体。
/// </summary>
/// <param name="assetName">要加载的游戏物体名称。</param>
/// <param name="cancellationToken">取消操作Token。</param>
/// <returns>异步游戏物体实例。</returns>
public async UniTask<GameObject> LoadGameObjectAsync(string assetName, CancellationToken cancellationToken = default)
{
return await LoadAssetAsync<GameObject>(assetName,cancellationToken);
}
} }
} }

View File

@@ -59,7 +59,7 @@ namespace TEngine
public void Bind(AssetOperationHandle operation, string assetLocation, AssetReference parent = null, public void Bind(AssetOperationHandle operation, string assetLocation, AssetReference parent = null,
string packageName = "") string packageName = "")
{ {
if (_operationHandle != null) if (_operationHandle is { IsValid: true })
{ {
Log.Warning($"rebind AssetReference gameObject.name:{gameObject.name} assetLocation:{assetLocation}"); Log.Warning($"rebind AssetReference gameObject.name:{gameObject.name} assetLocation:{assetLocation}");
_operationHandle.Dispose(); _operationHandle.Dispose();
@@ -153,82 +153,49 @@ namespace TEngine
/// <summary> /// <summary>
/// 同步加载资源。 /// 同步加载资源。
/// </summary> /// </summary>
/// <param name="assetName">要加载资源的名称。</param> /// <param name="location">资源的定位地址。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns>
public T LoadAsset<T>(string assetName) where T : Object
{
DirtyInitAssetGroup();
return _assetGroup.LoadAsset<T>(assetName);
}
/// <summary>
/// 同步加载资源。
/// </summary>
/// <param name="assetName">要加载资源的名称。</param>
/// <param name="parent">父节点位置。</param> /// <param name="parent">父节点位置。</param>
/// <param name="needInstance">是否需要实例化。</param>
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">要加载资源的类型。</typeparam> /// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>资源实例。</returns> /// <returns>资源实例。</returns>
public T LoadAsset<T>(string assetName, Transform parent) where T : Object public T LoadAsset<T>(string location, bool needInstance = true,string packageName = "",Transform parent = null) where T : Object
{ {
DirtyInitAssetGroup(); DirtyInitAssetGroup();
return _assetGroup.LoadAsset<T>(assetName, parent); return _assetGroup.LoadAsset<T>(location, needInstance, packageName, parent);
} }
/// <summary> /// <summary>
/// 步加载资源。 /// 步加载资源。
/// </summary> /// </summary>
/// <param name="assetName">要加载资源的名称。</param> /// <param name="location">资源的定位地址。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <param name="assetOperationHandle">资源操作句柄。</param>
/// <returns>资源实例。</returns>
// ReSharper disable once ParameterHidesMember
public T LoadAsset<T>(string assetName, out AssetOperationHandle assetOperationHandle) where T : Object
{
DirtyInitAssetGroup();
return _assetGroup.LoadAsset<T>(assetName, out assetOperationHandle);
}
/// <summary>
/// 同步加载资源。
/// </summary>
/// <param name="assetName">要加载资源的名称。</param>
/// <param name="parent">父节点位置。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <param name="assetOperationHandle">资源操作句柄。</param>
/// <returns>资源实例。</returns>
// ReSharper disable once ParameterHidesMember
public T LoadAsset<T>(string assetName, Transform parent, out AssetOperationHandle assetOperationHandle)
where T : Object
{
DirtyInitAssetGroup();
return _assetGroup.LoadAsset<T>(assetName, parent, out assetOperationHandle);
}
/// <summary>
/// 异步加载资源实例。
/// </summary>
/// <param name="assetName">要加载的实例名称。</param>
/// <param name="cancellationToken">取消操作Token。</param> /// <param name="cancellationToken">取消操作Token。</param>
/// <returns>资源实实例。</returns> /// <param name="needInstance">是否需要实例。</param>
public async UniTask<T> LoadAssetAsync<T>(string assetName, CancellationToken cancellationToken = default) /// <param name="packageName">指定资源包的名称。不传使用默认资源包。</param>
where T : Object /// <param name="parent">资源实例父节点。</param>
/// <typeparam name="T">要加载资源的类型。</typeparam>
/// <returns>异步资源实例。</returns>
public async UniTask<T> LoadAssetAsync<T>(string location, CancellationToken cancellationToken = default,
bool needInstance = true, string packageName = "", Transform parent = null) where T : Object
{ {
DirtyInitAssetGroup(); DirtyInitAssetGroup();
return await _assetGroup.LoadAssetAsync<T>(assetName, cancellationToken); return await _assetGroup.LoadAssetAsync<T>(location, cancellationToken, needInstance, packageName, parent);
} }
/// <summary> /// <summary>
/// 异步加载游戏物体。 /// 异步加载游戏物体。
/// </summary> /// </summary>
/// <param name="assetName">要加载的游戏物体名称。</param> /// <param name="location">资源的定位地址。</param>
/// <param name="cancellationToken">取消操作Token。</param> /// <param name="cancellationToken">取消操作Token。</param>
/// <returns>异步游戏物体实例。</returns> /// <param name="needInstance">是否需要实例。</param>
public async UniTask<GameObject> LoadGameObjectAsync(string assetName, /// <param name="packageName">指定资源包的名称。不传使用默认资源包。</param>
CancellationToken cancellationToken = default) /// <param name="parent">资源实例父节点。</param>
/// <returns>异步资源实例。</returns>
public async UniTask<GameObject> LoadGameObjectAsync(string location, CancellationToken cancellationToken = default,
bool needInstance = true, string packageName = "", Transform parent = null)
{ {
DirtyInitAssetGroup(); DirtyInitAssetGroup();
return await _assetGroup.LoadGameObjectAsync(assetName, cancellationToken); return await LoadAssetAsync<GameObject>(location, cancellationToken, needInstance, packageName, parent);
} }
/// <summary> /// <summary>

View File

@@ -280,7 +280,7 @@ namespace TEngine
/// <param name="packageName">指定资源包的名称。不传使用默认资源包</param> /// <param name="packageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">资源类型。</typeparam> /// <typeparam name="T">资源类型。</typeparam>
/// <returns>资源对象集合。</returns> /// <returns>资源对象集合。</returns>
UniTask<List<T>> LoadAssetsByTagAsync<T>(string assetTag, string packageName = "") where T : UnityEngine.Object; UniTask<LoadAssetsByTagOperation<T>> LoadAssetsByTagAsync<T>(string assetTag, string packageName = "") where T : UnityEngine.Object;
/// <summary> /// <summary>
/// 异步加载资源。 /// 异步加载资源。

View File

@@ -14,7 +14,7 @@ namespace TEngine
private readonly Dictionary<string, ResCacheData> _cachePool = new Dictionary<string, ResCacheData>(); private readonly Dictionary<string, ResCacheData> _cachePool = new Dictionary<string, ResCacheData>();
private readonly Dictionary<string, ResCacheData> _persistCachePool = new Dictionary<string, ResCacheData>(); private readonly Dictionary<string, ResCacheData> _persistCachePool = new Dictionary<string, ResCacheData>();
private bool _enableLog = true; private bool _enableLog = false;
private readonly List<ResourceCacheConfig> _needCacheResList = new List<ResourceCacheConfig>(); private readonly List<ResourceCacheConfig> _needCacheResList = new List<ResourceCacheConfig>();
private readonly List<string> _needPersistResList = new List<string>(); private readonly List<string> _needPersistResList = new List<string>();
private GameTimerTick _tickCheckExpire; private GameTimerTick _tickCheckExpire;

View File

@@ -824,15 +824,13 @@ namespace TEngine
return package.LoadSubAssetsSync(assetInfo); return package.LoadSubAssetsSync(assetInfo);
} }
public async UniTask<List<T>> LoadAssetsByTagAsync<T>(string assetTag, string packageName = "") public async UniTask<LoadAssetsByTagOperation<T>> LoadAssetsByTagAsync<T>(string assetTag,string packageName = "")
where T : UnityEngine.Object where T : UnityEngine.Object
{ {
LoadAssetsByTagOperation<T> operation = new LoadAssetsByTagOperation<T>(assetTag, packageName); LoadAssetsByTagOperation<T> operation = new LoadAssetsByTagOperation<T>(assetTag, packageName);
YooAssets.StartOperation(operation); YooAssets.StartOperation(operation);
await operation.ToUniTask(); await operation.ToUniTask();
List<T> assetObjects = operation.AssetObjects; return operation;
operation.ReleaseHandle();
return assetObjects;
} }
public async UniTask<T> LoadAssetAsync<T>(string location, CancellationToken cancellationToken = default, public async UniTask<T> LoadAssetAsync<T>(string location, CancellationToken cancellationToken = default,

View File

@@ -671,7 +671,7 @@ namespace TEngine
/// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param> /// <param name="customPackageName">指定资源包的名称。不传使用默认资源包</param>
/// <typeparam name="T">资源类型。</typeparam> /// <typeparam name="T">资源类型。</typeparam>
/// <returns>资源对象集合。</returns> /// <returns>资源对象集合。</returns>
public async UniTask<List<T>> LoadAssetsByTagAsync<T>(string assetTag, string customPackageName = "") public async UniTask<LoadAssetsByTagOperation<T>> LoadAssetsByTagAsync<T>(string assetTag, string customPackageName = "")
where T : UnityEngine.Object where T : UnityEngine.Object
{ {
return await m_ResourceManager.LoadAssetsByTagAsync<T>(assetTag, packageName: customPackageName); return await m_ResourceManager.LoadAssetsByTagAsync<T>(assetTag, packageName: customPackageName);