(1)WaveStatus
using UnityEngine;
using System;
[Serializable]
public class WaveStatus
{
public GameObject botPrefab;
public int count;
public float rate;
}
(2)WaveX
using UnityEngine;
using System;
using System.Collections.Generic;
[Serializable]
public class WaveX
{
public List<WaveStatus> waveStatuses = new List<WaveStatus>();
}
(3)WaveX
using UnityEngine;
using System.Collections.Generic;
[CreateAssetMenu(fileName = "WaveDatabase", menuName = "Scriptable Objects/WaveDatabase")]
public class WaveDatabase : ScriptableObject
{
public List<WaveX> waveList = new List<WaveX>();
}
(4)WaveSpawner
using UnityEngine;
using System.Collections;
public class WaveSpawnerXXX : MonoBehaviour
{
public WaveDatabase waveDatabase;
private int currentWaveIndex = 0;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
if (waveDatabase == null || waveDatabase.waveList == null || waveDatabase.waveList.Count == 0)
return;
// 現在の要素を実行
SpawnWave(currentWaveIndex);
// 次回用にインデックスを更新(末尾まで行ったら0に戻る)
currentWaveIndex = (currentWaveIndex + 1) % waveDatabase.waveList.Count;
}
}
// 指定Waveの全ステータスを「同時に開始」する(そのステータスの敵を同時に生成する)
public void SpawnWave(int waveIndex)
{
if (waveIndex < 0 || waveIndex >= waveDatabase.waveList.Count) return;
// ★コードを短くするためのテクニック
var wave = waveDatabase.waveList[waveIndex];
// コルーチンを同時実行する(複数の敵が指定されたルールに従って同時に生成される)
foreach (var status in wave.waveStatuses)
{
StartCoroutine(SpawnStatusRoutine(status));
}
}
// 1種類のBotを、count体をrate秒間隔で出す
private IEnumerator SpawnStatusRoutine(WaveStatus status)
{
for (int i = 0; i < status.count; i++)
{
Instantiate(status.botPrefab, transform.position, Quaternion.identity);
yield return new WaitForSeconds(status.rate);
}
}
}
(実行結果)
・スペースキーを押すごとに、そのステータスの敵が、指定されたルールに従って同時生成される。