【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脚本生命周期流程图
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!