protected override void OnUpdate() { var entity = GetSingletonEntity <SpawnItemArray>(); var requests = EntityManager.GetBuffer <SpawnItemRequest>(entity); // FSLog.Info($"Spwan item :{requests.Length}"); if (requests.Length == 0) { return; } var array = requests.ToNativeArray(Allocator.Temp); requests.Clear(); foreach (var t in array) { var spawnItem = t; if (spawnItem.DeferFrame > 0) { spawnItem.DeferFrame = spawnItem.DeferFrame - 1; requests.Add(spawnItem); continue; } FSLog.Info($"Spawn item:{spawnItem.Type}"); var e = ItemCreateUtilities.CreateItem(EntityManager, spawnItem.Type, spawnItem.OffPos, spawnItem.Owner); if (e == Entity.Null) { continue; } if (spawnItem.Owner == Entity.Null) { continue; } ItemAttachUtilities.ItemAttachToOwner(EntityManager, e, spawnItem.Owner, Entity.Null); } array.Dispose(); }
public override Entity Create(EntityManager entityManager, BundledResourceManager resourceManager, GameWorld world, ushort type) { //已经有预测的item,直接返回 var e = AttachPredictItem(entityManager, type); if (e != Entity.Null) { return(e); } //没有预测的item,创建新的item e = ItemCreateUtilities.CreateItem(entityManager, (EntityType)type, new float3 { x = 0.0f, y = -30f, z = 0.0f }, Entity.Null); entityManager.AddComponentData(e, new NewServerEntity() { Tick = 1 }); entityManager.AddComponentData(e, new UIObject()); return(e); }
protected override void OnUpdate() { var entity = GetSingletonEntity <SpawnItemArray>(); var requests = EntityManager.GetBuffer <SpawnItemRequest>(entity); // FSLog.Info($"Spwan item :{requests.Length}"); if (requests.Length == 0) { return; } var array = requests.ToNativeArray(Allocator.Temp); requests.Clear(); var query = EntityManager.CreateEntityQuery(ComponentType.ReadOnly <PredictedItem>()); var predictedItemEntities = query.ToEntityArray(Allocator.TempJob); foreach (var t in array) { var spawnItem = t; if (spawnItem.DeferFrame > 0) { spawnItem.DeferFrame = spawnItem.DeferFrame - 1; requests.Add(spawnItem); continue; } //排除掉重返的request var isRepeatRequest = false; foreach (var predictedItemEntity in predictedItemEntities) { var predictedItem = EntityManager.GetComponentData <PredictedItem>(predictedItemEntity); var ownerState = EntityManager.GetComponentData <OwnerPredictedState>(predictedItemEntity); if (predictedItem.StartTick == spawnItem.StartTick && ownerState.Owner == spawnItem.Owner) { isRepeatRequest = true; ItemAttachUtilities.ItemAttachToOwner(EntityManager, predictedItemEntity, spawnItem.Owner, Entity.Null); break; } } if (isRepeatRequest) { continue; } FSLog.Info($"Spawn item:{spawnItem.Type}"); var e = ItemCreateUtilities.CreateItem(EntityManager, spawnItem.Type, spawnItem.OffPos, spawnItem.Owner); if (e == Entity.Null) { continue; } EntityManager.AddComponentData(e, new PredictedItem() { StartTick = spawnItem.StartTick }); EntityManager.AddComponentData(e, new UIObject()); if (spawnItem.Owner == Entity.Null) { continue; } ItemAttachUtilities.ItemAttachToOwner(EntityManager, e, spawnItem.Owner, Entity.Null); } predictedItemEntities.Dispose(); array.Dispose(); }