namespace ET { [FriendClass(typeof(UnitCache))] public class UnitCacheComponentAwakeSystem : AwakeSystem { public override void Awake(UnitCacheComponent self) { self.UnitCacheKeyList.Clear(); foreach (var type in Game.EventSystem.GetTypes().Values) { if (type != typeof (IUnitCache) && typeof (IUnitCache).IsAssignableFrom(type)) { self.UnitCacheKeyList.Add(type.Name); } } foreach (var key in self.UnitCacheKeyList) { UnitCache unitCache = self.AddChild(); unitCache.key = key; self.UnitCaches.Add(key, unitCache); } } } public class UnitCacheComponentDestroySystem: DestroySystem { public override void Destroy(UnitCacheComponent self) { foreach (var unitCache in self.UnitCaches.Values) { unitCache?.Dispose(); } self.UnitCaches.Clear(); } } [FriendClass(typeof(UnitCacheComponent))] [FriendClass(typeof(UnitCache))] public static class UnitCacheComponentSystem { public static async ETTask AddOrUpdate(this UnitCacheComponent self, long unitId, ListComponent entityList) { using (ListComponent list = ListComponent.Create()) { foreach (var entity in entityList) { string key = entity.GetType().Name; if (!self.UnitCaches.TryGetValue(key, out UnitCache unitCache)) { unitCache = self.AddChild(); unitCache.key = key; self.UnitCaches.Add(key, unitCache); } unitCache.AddOrUpdate(entity); list.Add(entity); } if (list.Count > 0) { await DBManagerComponent.Instance.GetZoneDB(self.DomainZone()).Save(unitId, list); } } } public static async ETTask Get(this UnitCacheComponent self, long unitId, string key) { if (!self.UnitCaches.TryGetValue(key, out UnitCache unitCache)) { unitCache = self.AddChild(); unitCache.key = key; self.UnitCaches.Add(key, unitCache); } return await unitCache.Get(unitId); } public static void Delete(this UnitCacheComponent self, long unitId) { foreach (var cache in self.UnitCaches.Values) { cache.Delete(unitId); } } } }