39 lines
1.3 KiB
C#
39 lines
1.3 KiB
C#
using UnityEngine;
|
||
using BaseGames.Core.Events;
|
||
using BaseGames.Core.Assets;
|
||
using BaseGames.Core.Pool;
|
||
|
||
namespace BaseGames.Core
|
||
{
|
||
/// <summary>
|
||
/// 资产释放跟踪器。
|
||
/// 事件驱动:监听 EVT_SceneLoadRequest,在新场景加载前清理旧场景的对象池缓存。
|
||
/// </summary>
|
||
public class AssetReleaseTracker : MonoBehaviour
|
||
{
|
||
[Header("Event Channels")]
|
||
[SerializeField] private SceneLoadRequestEventChannelSO _onSceneLoadRequest;
|
||
|
||
private string _lastLoadedScene;
|
||
private readonly CompositeDisposable _subs = new();
|
||
|
||
private void OnEnable() => _onSceneLoadRequest?.Subscribe(OnSceneLoadRequested).AddTo(_subs);
|
||
private void OnDisable() => _subs.Clear();
|
||
|
||
private void OnSceneLoadRequested(SceneLoadRequest req)
|
||
{
|
||
if (string.IsNullOrEmpty(_lastLoadedScene)) { _lastLoadedScene = req.SceneName; return; }
|
||
|
||
// 清除旧场景的敌人对象池缓存(按需扩展)
|
||
var pool = ServiceLocator.GetOrDefault<IObjectPoolService>();
|
||
if (pool != null)
|
||
{
|
||
pool.ClearPool(AddressKeys.PrefabEnemyGrunt);
|
||
pool.ClearPool(AddressKeys.PrefabEnemySkullArch);
|
||
}
|
||
|
||
_lastLoadedScene = req.SceneName;
|
||
}
|
||
}
|
||
}
|