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