using System; namespace ET { public static class UnitCacheHelper { /// /// 保存或更新玩家缓存 /// /// /// public static async ETTask AddOrUpdateUnitCache(this T self) where T : Entity, IUnitCache { Other2UnitCache_AddOrUpdateUnit message = new Other2UnitCache_AddOrUpdateUnit() { UnitId = self.Id }; message.EntityTypes.Add(typeof(T).FullName); message.EntityBytes.Add(MongoHelper.ToBson(self)); await MessageHelper.CallActor(StartSceneConfigCategory.Instance.GetUnitCacheConfig(self.Id).InstanceId, message); } public static async ETTask GetUnitCache(Scene scene, long unitId) { long instanceId = StartSceneConfigCategory.Instance.GetUnitCacheConfig(unitId).InstanceId; Other2UnitCache_GetUnit message = new Other2UnitCache_GetUnit() { UnitId = unitId }; UnitCache2Other_GetUnit queryUnit = (UnitCache2Other_GetUnit) await MessageHelper.CallActor(instanceId, message); if (queryUnit.Error != ErrorCode.ERR_Success || queryUnit.EntityList.Count <= 0) { return null; } int index = queryUnit.ComponentNameList.IndexOf(nameof (Unit)); Unit unit = queryUnit.EntityList[index] as Unit; if (unit == null) { return null; } scene.AddChild(unit); foreach (var entity in queryUnit.EntityList) { if (entity == null || entity is Unit) { continue; } unit.AddComponent(entity); } return unit; } /// /// 获取玩家组件缓存 /// /// /// /// public static async ETTask GetUnitComponentCache(long unitId) where T : Entity, IUnitCache { Other2UnitCache_GetUnit message = new Other2UnitCache_GetUnit() { UnitId = unitId }; message.ComponentNameList.Add(typeof(T).Name); long instanceId = StartSceneConfigCategory.Instance.GetUnitCacheConfig(unitId).InstanceId; UnitCache2Other_GetUnit queryUnit = (UnitCache2Other_GetUnit) await MessageHelper.CallActor(instanceId, message); if (queryUnit.Error == ErrorCode.ERR_Success && queryUnit.EntityList.Count > 0) { return queryUnit.EntityList[0] as T; } return null; } /// /// 删除玩家缓存 /// /// public static async ETTask DeleteUnitCache(long unitId) { Other2UnitCache_DeleteUnit message = new Other2UnitCache_DeleteUnit() { UnitId = unitId }; long instanceId = StartSceneConfigCategory.Instance.GetUnitCacheConfig(unitId).InstanceId; await MessageHelper.CallActor(instanceId, message); } public static void AddOrUpdateUnitAllCache(Unit unit) { Other2UnitCache_AddOrUpdateUnit message = new Other2UnitCache_AddOrUpdateUnit() { UnitId = unit.Id }; message.EntityTypes.Add(unit.GetType().FullName); message.EntityBytes.Add(MongoHelper.ToBson(unit)); foreach ((Type key, Entity entity) in unit.Components) { if (!typeof (IUnitCache).IsAssignableFrom(key)) { continue; } message.EntityTypes.Add(key.FullName); message.EntityBytes.Add(MongoHelper.ToBson(entity)); } MessageHelper.CallActor(StartSceneConfigCategory.Instance.GetUnitCacheConfig(unit.Id).InstanceId, message).Coroutine(); } } }