示例#1
0
        protected override JobHandle OnUpdate(JobHandle inputDeps)
        {
            if (m_Prefab == Entity.Null)
            {
                var prefabs       = GetSingleton <GhostPrefabCollectionComponent>();
                var serverPrefabs = EntityManager.GetBuffer <GhostPrefabBuffer>(prefabs.serverPrefabs);
                m_Prefab = serverPrefabs[AsteroidsGhostSerializerCollection.FindGhostType <ShipSnapshotData>()].Value;
                m_Radius = EntityManager.GetComponentData <CollisionSphereComponent>(m_Prefab).radius;
            }

            JobHandle levelHandle;
            var       spawnJob = new SpawnJob
            {
                commandBuffer           = barrier.CreateCommandBuffer(),
                playerStateFromEntity   = GetComponentDataFromEntity <PlayerStateComponentData>(),
                commandTargetFromEntity = GetComponentDataFromEntity <CommandTargetComponent>(),
                networkIdFromEntity     = GetComponentDataFromEntity <NetworkIdComponent>(),
                shipPrefab = m_Prefab,
                shipRadius = m_Radius,
                level      = m_LevelGroup.ToComponentDataArray <LevelComponent>(Allocator.TempJob, out levelHandle),
                rand       = new Unity.Mathematics.Random((uint)Stopwatch.GetTimestamp())
            };
            var handle = spawnJob.ScheduleSingle(this, JobHandle.CombineDependencies(inputDeps, levelHandle));

            barrier.AddJobHandleForProducer(handle);
            return(handle);
        }
示例#2
0
        protected override JobHandle OnUpdate(JobHandle inputDeps)
        {
            if (m_connectionGroup.IsEmptyIgnoreFilter)
            {
                // No connected players, just destroy all asteroids to save CPU
                inputDeps.Complete();
                World.EntityManager.DestroyEntity(asteroidGroup);
                return(default(JobHandle));
            }

            if (m_Prefab == Entity.Null)
            {
                var prefabs       = GetSingleton <GhostPrefabCollectionComponent>();
                var serverPrefabs = EntityManager.GetBuffer <GhostPrefabBuffer>(prefabs.serverPrefabs);
                m_Prefab = serverPrefabs[AsteroidsGhostSerializerCollection.FindGhostType <AsteroidSnapshotData>()].Value;
                m_Radius = EntityManager.GetComponentData <CollisionSphereComponent>(m_Prefab).radius;
            }
            var settings     = GetSingleton <ServerSettings>();
            var maxAsteroids = settings.numAsteroids;

            JobHandle levelHandle;
            var       spawnJob = new SpawnJob
            {
                commandBuffer    = barrier.CreateCommandBuffer(),
                count            = asteroidGroup.CalculateEntityCountWithoutFiltering(),
                targetCount      = maxAsteroids,
                asteroidPrefab   = m_Prefab,
                asteroidRadius   = m_Radius,
                asteroidVelocity = settings.asteroidVelocity,
                level            = m_LevelGroup.ToComponentDataArray <LevelComponent>(Allocator.TempJob, out levelHandle),
                rand             = new Unity.Mathematics.Random((uint)Stopwatch.GetTimestamp())
            };
            var handle = spawnJob.Schedule(JobHandle.CombineDependencies(inputDeps, levelHandle));

            barrier.AddJobHandleForProducer(handle);
            return(handle);
        }
示例#3
0
        protected override void OnUpdate()
        {
            if (m_Prefab == Entity.Null)
            {
                var prefabs       = GetSingleton <GhostPrefabCollectionComponent>();
                var serverPrefabs = EntityManager.GetBuffer <GhostPrefabBuffer>(prefabs.serverPrefabs);
                m_Prefab = serverPrefabs[AsteroidsGhostSerializerCollection.FindGhostType <ShipSnapshotData>()].Value;
                m_Radius = EntityManager.GetComponentData <CollisionSphereComponent>(m_Prefab).radius;
            }

            JobHandle levelHandle;
            var       commandBuffer           = m_Barrier.CreateCommandBuffer();
            var       playerStateFromEntity   = GetComponentDataFromEntity <PlayerStateComponentData>();
            var       commandTargetFromEntity = GetComponentDataFromEntity <CommandTargetComponent>();
            var       networkIdFromEntity     = GetComponentDataFromEntity <NetworkIdComponent>();
            var       shipPrefab = m_Prefab;
            var       shipRadius = m_Radius;
            var       level      = m_LevelGroup.ToComponentDataArrayAsync <LevelComponent>(Allocator.TempJob, out levelHandle);
            var       rand       = new Unity.Mathematics.Random((uint)Stopwatch.GetTimestamp());

            var spawnJob = Entities.WithReadOnly(level).WithDeallocateOnJobCompletion(level).
                           ForEach((Entity entity, in PlayerSpawnRequest request,
                                    in ReceiveRpcCommandRequestComponent requestSource) =>
            {
                // Destroy the request
                commandBuffer.DestroyEntity(entity);
                if (!playerStateFromEntity.Exists(requestSource.SourceConnection) ||
                    !commandTargetFromEntity.Exists(requestSource.SourceConnection) ||
                    commandTargetFromEntity[requestSource.SourceConnection].targetEntity != Entity.Null ||
                    playerStateFromEntity[requestSource.SourceConnection].IsSpawning != 0)
                {
                    return;
                }
                var ship    = commandBuffer.Instantiate(shipPrefab);
                var padding = 2 * shipRadius;
                var pos     = new Translation
                {
                    Value = new float3(rand.NextFloat(padding, level[0].width - padding),
                                       rand.NextFloat(padding, level[0].height - padding), 0)
                };
                //var pos = new PositionComponentData(GameSettings.mapWidth / 2, GameSettings.mapHeight / 2);
                var rot = new Rotation {
                    Value = quaternion.RotateZ(math.radians(90f))
                };

                commandBuffer.SetComponent(ship, pos);
                commandBuffer.SetComponent(ship, rot);
                commandBuffer.SetComponent(ship,
                                           new PlayerIdComponentData
                {
                    PlayerId     = networkIdFromEntity[requestSource.SourceConnection].Value,
                    PlayerEntity = requestSource.SourceConnection
                });

                commandBuffer.AddComponent(ship, new ShipSpawnInProgressTag());

                // Mark the player as currently spawning
                playerStateFromEntity[requestSource.SourceConnection] = new PlayerStateComponentData {
                    IsSpawning = 1
                };
            }).Schedule(JobHandle.CombineDependencies(Dependency, levelHandle));