/// <summary> /// Spawns object(s). /// </summary> void MultiSpawn() { // Get base range float min = Mathf.Abs(maxAngleOfEntryOffset - minAngleOfEntryOffset) / 2f; float max = -min; // Get angular distance between object spawns float separation = Mathf.Abs(maxAngleOfEntryOffset - minAngleOfEntryOffset) + angularSeparation; // Get starting angle float baseAngle = angleOfEntry; switch (angleOfEntryType) { // AngleOfEntryType.FixedAngle not needed case AngleOfEntryType.WaveDirection: baseAngle = SpaceObjectDirection.GetAngle(); break; case AngleOfEntryType.RandomAngle: baseAngle = SeededRandom.Range(0f, Mathf.PI * 2f); break; } baseAngle += (Mathf.Abs(minAngleOfEntryOffset) + max) * SeededRandom.Sign(); float angle = baseAngle + SeededRandom.Range(min, max); // We have our start position Vector3 start = Screen.GetRadiusEdge(angle); if (angleOfEntryType == AngleOfEntryType.FixedPosition) { start = fixedPosition; } else if (angleOfEntryType == AngleOfEntryType.RandomPosition) { start = Screen.RandomPositionInView(4f); } // Decide on target Vector3 target = DecideTarget(start); float baseTargetAngle = GetTargetAngle(start, target); float targetAngle = SeededRandom.Range(minTargetOffset, maxTargetOffset) * SeededRandom.Sign() + baseTargetAngle; // Always spawn 1 Spawn(start, targetAngle); // Loop through all spawns for (int i = 1; i < SeededRandom.Range(minMultiSpawns, maxMultiSpawns + 1); i++) { // Get positional modifier int modifier = (i + 1) / 2; if (i % 2 == 0) { modifier *= -1; } // Base angle for current spawn angle = (separation * modifier) + baseAngle + SeededRandom.Range(min, max); start = Screen.GetRadiusEdge(angle); // Do we need to pick another base angle? if (!parallel) { target = DecideTarget(start); baseTargetAngle = GetTargetAngle(start, target); } targetAngle = SeededRandom.Range(minTargetOffset, maxTargetOffset) * SeededRandom.Sign() + baseTargetAngle; Spawn(start, targetAngle); } }