【Unity学习过程踩坑记录】实现根据敌人波次刷新地图索引时出现空指针错误
问题描述:
Spawner里设置了敌人的波数,包括每波敌人数量、敌人刷新间隔。MapGenerator里设置了地图的数量。跟着视频尝试实现刷新下一波敌人时切换下一张地图,运行后报空指针错误:
解决:
错误肯定是由新增代码导致,与第234行代码无关。
首先分析源码。我们的“目的”是切换下一张地图,地图索引mapIndex在MapGenerator脚本中;“条件”是解决这一波敌人,生成下一波敌人,该方法在Spawner脚本中由NextWave()实现。所以我们要在Spawner脚本中设置一个event System.Action,并在其中存储int参数表示当前波次:
public event System.Action<int> OnNewWave; // 生成下一波敌人时(条件)切换新的地图(目标)
当使用NextWave方法时,会触发该事件:
void NextWave()
{
if (currentWaveNumber < waves.Length)
{
//print("Wave: " + currentWaveNumber);
currentWave = waves[currentWaveNumber];
enemiesRemainingToSpawn = currentWave.enemyCount;
enemiesReaminingAlive = enemiesRemainingToSpawn;
if (OnNewWave != null)
{
OnNewWave(currentWaveNumber);
}
currentWaveNumber++;
}
}
同时我们在MapGenertor脚本里定义切换地图的方法NextMap,将变量mapIndex改为触发时传来的参数:
// 地图索引等于敌人的波数
void NextMap(int waveNumber)
{
mapIndex = waveNumber;
GenerateMap();
}
并在Start()里将该方法注册到OnNewWave事件中:
void Start()
{
//GenerateMap();
FindObjectOfType<Spawner>().OnNewWave += NextMap; // 将切换地图索引方法注册到“生成下一波敌人”事件中
}
至此完成。当Spawner使用NextWave()方法时会触发OnNewWave事件,并将参数currentWaveNumber传给注册进去的NextMap方法,进而改变地图索引mapIndex。
经过调试发现,在执行NextWave方法时并没有进入if (OnNewWave != null)分支,即此时并没有将NextMap注册进事件,所以判断为空。显然,这里系统先调用了Spawner的Start,然后再调用MapGenerator的Start,所以判断为空。那么解决办法也很简单,可以将NextMap的注册写在Start之前,如Awake和OnEnable里。也可以直接在Unity里设置脚本执行顺序,菜单栏选择Edit -> Project Settings...,选择Script Execution Order,添加MapGenerator并拖至Default Time的上面。
附:Unity脚本生命周期流程图