Ejemplo n.º 1
0
        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();
        }
Ejemplo n.º 2
0
        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();
        }