Exemplo n.º 1
0
        /// <summary>
        /// Blow up the asteroid. This will possibly create debris,
        /// meaning that if the asteroid is big enough it will spawn a few smaller asteroids in its place.
        /// The original asteroid will disappear regardless of the number of created debris.
        /// </summary>
        private void Destruct()
        {
            int minDebrisCount = Mathf.RoundToInt(minDebrisCountToRadiusRatio * radius);
            int maxDebrisCount = Mathf.RoundToInt(maxDebrisCountToRadiusRatio * radius);
            int debrisCount    = Random.Range(minDebrisCount, maxDebrisCount);

            if (debrisCount > 1)
            {
                float debrisRadius = radius / Mathf.Sqrt(debrisCount);

                float debrisSeparationAngle    = 2f * Mathf.PI * Random.value;
                float debrisSeparationVelocity = Random.Range(minDebrisSeparationVelocity, maxDebrisSeparationVelocity);

                for (int i = 0; i < debrisCount; i++)
                {
                    debrisSeparationAngle += 2f * Mathf.PI / debrisCount;
                    Vector2 debrisDirection = Quaternion.Euler(0f, 0f, Mathf.Rad2Deg * debrisSeparationAngle) * Vector2.right;

                    GameObject debrisGO = Instantiate
                                          (
                        gameObject,
                        transform.position + (Vector3)(debrisSeparationDistanceMultiplier * debrisRadius * debrisDirection),
                        Quaternion.identity
                                          );
                    Asteroid debris = debrisGO.GetComponent <Asteroid>();
                    debris.Init(debrisRadius);

                    Rigidbody2D debrisRigidbody = debrisGO.GetComponent <Rigidbody2D>();
                    debrisRigidbody.velocity        = rigidbody2D.velocity + debrisSeparationVelocity * debrisDirection;
                    debrisRigidbody.angularVelocity = rigidbody2D.angularVelocity;
                }
            }

            Vanish();
        }
Exemplo n.º 2
0
        /// <summary>
        /// Spawn a new random-sized asteroid and push it in the direction of a random spot in the play area.
        /// </summary>
        private void SpawnNewAsteroid()
        {
            Vector3    position       = GetRandomPositionOnRectPerimeter(spawnRect);
            Vector3    targetPosition = GetRandomPositionInRect(movementTargetRect);
            GameObject asteroidGO     = Instantiate
                                        (
                asteroidPrefab,
                position,
                Quaternion.identity
                                        );
            Asteroid asteroid = asteroidGO.GetComponent <Asteroid>();

            asteroid.Init();
            asteroid.Push(targetPosition - position);
        }