【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脚本生命周期流程图

posted @   cno700  阅读(112)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示