You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从预设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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 20:45:04