【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 @ 2022-07-28 22:29  cno700  阅读(104)  评论(0编辑  收藏  举报