我正在 Unity 中制作塔防游戏。它需要某些小怪在波浪中生成。
在我看过的所有指南中,每个暴徒的生成之间都有相同的延迟,但应该可以毫无延迟地将它们分组生成。
为此,我制作了一个波浪管理器。
public class WavesManager : MonoBehaviour
{
public LevelData levelData;
public List<Wave> waves;
private int currentWaveIndex = -1;
private void Awake()
{
waves = levelData.waves;
}
public void StartNextWave()
{
currentWaveIndex++;
if (currentWaveIndex == waves.Count) return;
waves[currentWaveIndex].Spawn(levelData.pieces);
}
}
这是波浪本身的类
[Serializable]
public class Wave : MonoBehaviour
{
public List<Squad> squads = new();
public void Spawn(List<Piece> pieces)
{
StartCoroutine(nameof(SpawnSquads), pieces);
}
private IEnumerator SpawnSquads(List<Piece> pieces)
{
foreach (var squad in squads)
{
squad.Spawn(pieces);
yield return new WaitForSeconds(squad.otherSquadDelay);
}
}
}
还有阵容
[Serializable]
public class Squad : MonoBehaviour
{
public string enemyTitle;
public int amount;
public int innerDelay;
public int otherSquadDelay;
public void Spawn(List<Piece> pieces)
{
StartCoroutine(nameof(SpawnEnemies), pieces);
}
private IEnumerator SpawnEnemies(IEnumerable<Piece> pieces)
{
var piece = pieces.Select(x => x)
.First(x => x.title == enemyTitle);
for (var i = 0; i < amount; i++)
{
piece.Spawn();
yield return new WaitForSeconds(innerDelay);
}
}
}
问题是由于继承自 MonoBehaviour,我无法提前确定如何设置谁以及如何在小队中生成,并且无法将其删除,因为协程不起作用。
这是另一个脚本,我在其中预先输入了波浪和小队的数据。
[CreateAssetMenu(fileName = "LevelData", menuName = "ScriptableObjects/LevelData")]
public class LevelData : ScriptableObject
{
public List<Piece> pieces;
public List<Wave> waves;
}
我提出以下实施方案。
类
Wave
,Squad
让我们只存储信息。他们不会是 MonoBehaviour。为什么 LevelData 需要 Pieces 列表,我不太明白,所以我删除了它,它对我没有用。如果您需要它,请添加它。
我创建了一个类
EnemiesSpawner
,它存储指向不同敌人的预制件的链接,并且可以产生这些相同的敌人:该类
WavesManager
将根据名称控制波浪产生的过程:一些评论:
我不建议将敌人的名称存储在字符串中。首先,很容易打错字,其次,通常是不好的做法。我建议您选择 enum 枚举,甚至立即在检查器中指定敌人预制件,也就是说,不要使用变量,而是
string enemyTitle
制作GameObject EnemyPrefab
并生成它。所以我们甚至不需要 GetPieceByTitle 函数。我没有在您的代码中看到波之间的延迟,因此我将其设置为 2 秒。我认为它可能因级别而异,因此您可以
otherWaveDealy
在Wave
. 然后在课堂上,该WaveManager
行yield return new WaitForSeconds(3);
应替换为yield return new WaitForSeconds(wave.otherWaveDelay);
我将小队变量设为私有,因为它不关心公开,以便可以从第三方类更改。我为波数添加了一个 CountSquad 吸气剂和一个特定的 i-th 波吸气剂
GetSquad(index)
。结果证明了一种更可靠的机制:您可以接收来自其他类的波,但不能更改它们。