Unity开发求助:移动平台从A点到B点失效,报NullReferenceException
Unity移动平台无法移动及NullReference错误修复
问题根源
- target未初始化:
Start()方法中没有给target赋值,第一次执行Update()时target为null,访问target.position直接触发空引用异常。 - 浮点数精度问题:直接用
==比较Vector3(比如transform.position == pointA.position),由于浮点数精度误差,几乎永远不会触发条件,导致target始终无法被赋值。 - pointA/pointB可能未赋值:如果Inspector面板中没有将对应的Transform对象拖入
pointA、pointB字段,也会引发空引用。
修复方案
- 初始化target:在
Start()中给target设置初始目标,比如默认指向pointB。 - 替换精度安全的判断方式:用
Vector3.Distance判断当前位置与目标点的距离是否小于极小值(如0.01f),替代直接相等判断。 - 检查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
相关产品推荐
相关产品推荐

