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); }
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); }
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));