示例#1
0
        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();
        }