diff options
Diffstat (limited to 'Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/ExampleScenes/Scenes/OldExamples/Example18_RTS/RTSWaveSpawner.cs')
-rw-r--r-- | Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/ExampleScenes/Scenes/OldExamples/Example18_RTS/RTSWaveSpawner.cs | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/ExampleScenes/Scenes/OldExamples/Example18_RTS/RTSWaveSpawner.cs b/Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/ExampleScenes/Scenes/OldExamples/Example18_RTS/RTSWaveSpawner.cs new file mode 100644 index 0000000..a9b80ef --- /dev/null +++ b/Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/ExampleScenes/Scenes/OldExamples/Example18_RTS/RTSWaveSpawner.cs @@ -0,0 +1,75 @@ +using UnityEngine; +using UnityEngine.UI; +using System.Collections; +using System.Linq; + +namespace Pathfinding.Examples.RTS { + [HelpURL("https://arongranberg.com/astar/documentation/stable/rtswavespawner.html")] + public class RTSWaveSpawner : MonoBehaviour { + public Wave[] waves; + + public Transform target; + public Text waveCounter; + public int team = 2; + + [System.Serializable] + public class Wave { + public GameObject prefab; + public Transform spawnPoint; + public float delay; + public int count; + public int health; + } + + // Use this for initialization + IEnumerator Start () { + float lastWave = 0; + float multiplier = 1; + + for (int it = 0;; it++) { + for (int i = 0; i < waves.Length; i++) { + while (true) { + float remaining = waves[i].delay - (Time.time - lastWave); + if (remaining <= 0) break; + waveCounter.text = Mathf.RoundToInt(remaining).ToString(); + yield return null; + } + waveCounter.text = "!"; + + int from = i; + while (i + 1 < waves.Length && waves[i+1].delay == 0) i++; + + var toSpawn = waves.Skip(from).Take(i - from + 1).ToArray(); + var names = toSpawn.Select(w => w.spawnPoint.gameObject.name).Distinct().OrderBy(s => s).ToArray(); + var message = "Incoming enemies from "; + for (int j = 0; j < names.Length; j++) { + if (j > 0) message += j == names.Length - 1 ? " and " : ", "; + message += names[j]; + } + Debug.Log(message); + + foreach (var wave in toSpawn) { + for (int j = 0; j < wave.count; j++) { + var rnd = Random.insideUnitSphere * 10; + rnd.y = 0; + var go = GameObject.Instantiate(wave.prefab, wave.spawnPoint.position + rnd, wave.spawnPoint.rotation) as GameObject; + var unit = go.GetComponent<RTSUnit>(); + unit.team = team; + unit.maxHealth = unit.health = wave.health * multiplier; + unit.SetDestination(target.position, MovementMode.AttackMove); + } + } + + yield return new WaitForSeconds(10); + lastWave = Time.time; + } + + multiplier *= 2; + } + } + + // Update is called once per frame + void Update () { + } + } +} |