public static void AttackPlanet(GameObject fromPlanet, GameObject toPlanet, EntityManager entityManager) { var entity = fromPlanet.GetComponent <GameObjectEntity>().Entity; var meshComponent = fromPlanet.GetComponentsInChildren <GameObjectEntity>().First(c => c.gameObject != fromPlanet.gameObject); var occupantData = entityManager.GetComponentData <PlanetData>(entity); var targetEntity = toPlanet.GetComponent <GameObjectEntity>().Entity; var launchData = new PlanetShipLaunchData { TargetEntity = targetEntity, TeamOwnership = occupantData.TeamOwnership, NumberToSpawn = occupantData.Occupants, SpawnLocation = fromPlanet.transform.position, SpawnRadius = meshComponent.transform.lossyScale.x * 0.5f }; occupantData.Occupants = 0; entityManager.SetComponentData(entity, occupantData); if (entityManager.HasComponent <PlanetShipLaunchData>(entity)) { entityManager.SetComponentData(entity, launchData); return; } entityManager.AddComponentData(entity, launchData); }
protected override void OnUpdate() { for (var planetIndex = 0; planetIndex < _planets.Length; planetIndex++) { var planetLaunchData = _planets.Data[planetIndex]; if (planetLaunchData.NumberToSpawn == 0) { continue; } var shipsToSpawn = planetLaunchData.NumberToSpawn; var dt = Time.deltaTime; var deltaSpawn = Math.Max(1, Convert.ToInt32(1000.0f * dt)); if (deltaSpawn < shipsToSpawn) { shipsToSpawn = deltaSpawn; } var targetPlanet = _entityManager.GetComponentData <PlanetData>(planetLaunchData.TargetEntity); _shipsToSpawn.Add(new ShipSpawnData { ShipCount = shipsToSpawn, PlanetShipLaunchData = planetLaunchData, TargetPlanetData = targetPlanet }); var launchData = new PlanetShipLaunchData { TargetEntity = planetLaunchData.TargetEntity, NumberToSpawn = planetLaunchData.NumberToSpawn - shipsToSpawn, TeamOwnership = planetLaunchData.TeamOwnership, SpawnLocation = planetLaunchData.SpawnLocation, SpawnRadius = planetLaunchData.SpawnRadius }; _planets.Data[planetIndex] = launchData; } for (int spawnIndex = 0; spawnIndex < _shipsToSpawn.Length; ++spawnIndex) { var spawnCount = _shipsToSpawn[spawnIndex].ShipCount; var planet = _shipsToSpawn[spawnIndex].PlanetShipLaunchData; var targetPlanet = _shipsToSpawn[spawnIndex].TargetPlanetData; var planetPos = planet.SpawnLocation; var planetDistance = Vector3.Distance(planetPos, targetPlanet.Position); var planetRadius = planet.SpawnRadius; var prefabShipEntity = _entityManager.Instantiate(_prefabManager.ShipPrefab); _entityManager.SetSharedComponentData(prefabShipEntity, _shipRenderer[planet.TeamOwnership]); var entities = new NativeArray <Entity>(spawnCount, Allocator.Temp); _entityManager.Instantiate(prefabShipEntity, entities); _entityManager.DestroyEntity(prefabShipEntity); for (int i = 0; i < spawnCount; i++) { float3 shipPos; do { var insideCircle = Random.insideUnitCircle.normalized; var onSphere = new float3(insideCircle.x, 0, insideCircle.y); shipPos = planetPos + (onSphere * (planetRadius + _prefabManager.ShipPrefab.transform.localScale.x)); } while (math.lengthsq(shipPos - planetPos) > planetDistance * planetDistance); var data = new ShipData { TargetEntity = planet.TargetEntity, TeamOwnership = planet.TeamOwnership }; _entityManager.AddComponentData(entities[i], data); var spawnPosition = new Position { Value = shipPos }; var spawnScale = new Scale { Value = new float3(1.0f, 1.0f, 1.0f) // Value = new float3(0.02f, 0.02f, 0.02f) }; _entityManager.SetComponentData(entities[i], spawnScale); _entityManager.SetComponentData(entities[i], spawnPosition); } entities.Dispose(); } _shipsToSpawn.Clear(); }