如何从预设Vector3坐标列表随机选点实例化prefab及空引用报错解决
Unity C#随机点位生成预制体问题解答
空引用报错通俗解释
Object reference not set to an instance of an object
这个报错俗称空引用错误,意思是你调用的某个对象实际没有对应的实体内容,程序找不到你要操作的东西。在你这个场景里,大概率是你声明了公共的projectile预制体变量,但是没在Unity的Inspector面板里给这个变量赋值对应的预制体资源,运行时程序找不到要生成的对象,就抛出了这个错误。
原代码问题
你的初始代码没有实现「从三个固定点位随机选取」的需求,只是给y坐标设了随机范围,和你的预期功能不符。另外你类层级声明的Vector3[] position数组从未赋值,属于无用冗余代码。
调整后代码优化建议
你现在修改后的代码已经可以实现需求,但还有可以优化的点:三个固定点位不需要每帧都重新创建,挪到类层级初始化即可,避免每帧重复执行冗余逻辑,优化后代码如下:
public class MissileSpawnerScript : MonoBehaviour { // 要生成的预制体,需在Inspector面板赋值 public GameObject projectile; // 生成间隔,需在Inspector面板设置数值 public float timeBetweenShots; private float shotTime; // 三个固定生成点位,提前初始化好不需要每帧创建 Vector3[] spawnPositions = { new Vector3(11.21f, -2.17f, 0), new Vector3(11.21f, -0.54f, 0), new Vector3(11.21f, 1.14f, 0) }; void Update() { if (Time.time >= shotTime) { // 随机取数组里的一个点位 Vector3 randomPosition = spawnPositions[Random.Range(0, spawnPositions.Length)]; Instantiate(projectile, randomPosition, transform.rotation); shotTime = Time.time + timeBetweenShots; } } }
最终操作注意事项
- 把上述脚本挂载到场景中的生成对象上
- 在Inspector面板给
projectile字段拖入你要生成的导弹预制体 - 给
timeBetweenShots设置你需要的生成间隔数值(比如2就是每2秒生成一次) - 运行即可正常生成,不会再出现空引用报错
内容的提问来源于stack exchange,提问作者daforeman
相关产品推荐
相关产品推荐

