using System; using System.Collections.Generic; using AOT; using Entitas; using UnityEngine; namespace CoreGame.Render { public struct MainAssetParam { public string path; public string parentNodeName; public float scaleParam; public ReuseGoData reuseGoData; public bool hideStateBar; } public class SubAssetData : ISptPool { public int ownerEid; public FName path; public BindPointType bindPointType; public ReuseGoData reuseGoData; public readonly List fillEntTypes = new(); public void Awake(int ownerEid, string path, BindPointType bindPointType, ReuseGoData reuseGoData) { Awake(ownerEid, UnrealNames.GetFName(path), bindPointType, reuseGoData); } public void Awake(int ownerEid, FName path, BindPointType bindPointType, ReuseGoData reuseGoData) { this.ownerEid = ownerEid; this.path = path; this.bindPointType = bindPointType; this.reuseGoData = reuseGoData; } public void Reset() { fillEntTypes.Clear(); } } [Combat] public class AssetComponent : IComponent, IReset { public MainAssetParam mainAssetParam; public List ignoreTypes; // 已经加载好的子对象 private readonly List m_SubAssetParams = new(); // 需要加载的子对象 internal readonly Queue needLoadSubAssets = new(); // 被关联的子实体,比如武器 internal readonly List linkAssetEidsRecorder = new(); // 不能单独驱动ReactiveSyste public void PushMainPartAsset(ref SubAssetData subAssetData) { needLoadSubAssets.Enqueue(subAssetData); } public void PushSubAsset(ref SubAssetData subAssetData) { m_SubAssetParams.Add(subAssetData); } public void HideMainAsset() { mainAssetParam.reuseGoData?.go.SetActiveWrap(false); } public void RecordLinkEnt(int eid) { if (linkAssetEidsRecorder.Contains(eid)) return; linkAssetEidsRecorder.Add(eid); } public void UnRecordLinkEnt(int eid) { linkAssetEidsRecorder.Remove(eid); } public void Reset() { for (var i = 0; i < m_SubAssetParams.Count; i++) { // 需要改成entity release, 这样也没问题 var subAssetParam = m_SubAssetParams[i]; GoPoolDic.GetPool(subAssetParam.path.GetDisplayString()).ReleaseGo(subAssetParam.reuseGoData); SptPool.Free(ref subAssetParam); } m_SubAssetParams.Clear(); ListPool.Push(ref ignoreTypes); GoPoolDic.GetPool(mainAssetParam.path).ReleaseGo(mainAssetParam.reuseGoData); } } }