Unity定时实例化Prefab触发空引用错误如何解决
问题诊断
你遇到的object reference not set to an instance of an object空引用错误,根源是clockTime字段的赋值逻辑完全写反了:
- 你声明了
clockTime类型的字段后没有给它赋任何初始值,字段默认值为null Start()方法里写的clockTime.FindObjectOfType<clockTime>();是在空引用上调用方法,游戏运行进入Start生命周期的第一时间就会抛出空引用,根本不会执行到后续的Instantiate逻辑- 就算修了Start的赋值,现有Update逻辑也会导致
time2 == 10的时间段内每帧生成一个敌人,出现大量重复预制体
修复方案
按以下步骤修改代码即可解决问题:
- 修正Start方法的赋值逻辑,把场景中查找到的
clockTime组件实例赋值给对应字段,增加空校验方便排查挂载问题:
void Start() { // 原错误写法:clockTime.FindObjectOfType<clockTime>(); clockTime = FindObjectOfType<clockTime>(); if (clockTime == null) { Debug.LogError("场景中未找到挂载clockTime脚本的对象,请检查场景配置"); } }
- 增加单次生成标记,避免重复生成预制体,同时在Update里增加空引用兜底判断:
先在类的字段声明区加一个生成标记:
再修改Update逻辑:private bool _hasSpawnedAtTime10 = false;
void Update() { if (clockTime == null || _hasSpawnedAtTime10) { return; } if (clockTime.time2 == 10) { Instantiate(enemy, new Vector3(3.66f, -1, 0.66f), Quaternion.Euler(0, -190, 0)); _hasSpawnedAtTime10 = true; } }
- 校验项:你之前测试按键触发生成正常,说明
enemy预制体的Inspector引用已经正确配置,不需要额外调整;只需要确认场景里确实有对象挂载了clockTime脚本,且time2变量的计时逻辑正常运行即可。
内容的提问来源于stack exchange,提问作者Leonardo Biagi
相关产品推荐
相关产品推荐

