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

Unity开发求助:移动平台从A点到B点失效,报NullReferenceException

Unity移动平台无法移动及NullReference错误修复

问题根源

  1. target未初始化:Start()方法中没有给target赋值,第一次执行Update()时target为null,访问target.position直接触发空引用异常。
  2. 浮点数精度问题:直接用==比较Vector3(比如transform.position == pointA.position),由于浮点数精度误差,几乎永远不会触发条件,导致target始终无法被赋值。
  3. pointA/pointB可能未赋值:如果Inspector面板中没有将对应的Transform对象拖入pointA、pointB字段,也会引发空引用。

修复方案

  1. 初始化target:在Start()中给target设置初始目标,比如默认指向pointB。
  2. 替换精度安全的判断方式:用Vector3.Distance判断当前位置与目标点的距离是否小于极小值(如0.01f),替代直接相等判断。
  3. 检查Inspector赋值:确认MovingPlatform脚本所在对象的Inspector面板中,pointA和pointB已正确关联对应的Transform节点。

修复后的完整代码

public class MovingPlatform : MonoBehaviour
{
    [SerializeField]
    private Transform pointA, pointB;

    private float speed = 1.0f;
    private Transform target;
    // 用于精度判断的阈值,可根据需求调整
    private float positionThreshold = 0.01f;

    void Start()
    {
        // 初始化target为pointB,确保第一次Update有目标
        target = pointB;
        // 额外校验:如果pointA或pointB未赋值,在控制台报错提示
        if (pointA == null || pointB == null)
        {
            Debug.LogError("请在Inspector中为pointA和pointB赋值Transform对象!");
        }
    }

    void Update()
    {
        // 用距离判断是否到达目标点,避免浮点数精度问题
        if (Vector3.Distance(transform.position, pointA.position) < positionThreshold)
        {
            target = pointB;
        }
        else if (Vector3.Distance(transform.position, pointB.position) < positionThreshold)
        {
            target = pointA;
        }
        
        // 确保target不为空时再执行移动
        if (target != null)
        {
            transform.position = Vector3.MoveTowards(transform.position, target.position, speed * Time.deltaTime);
        }
    }
}

内容的提问来源于stack exchange,提问作者Tasos_Noutsis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:50:29