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

从菜单加载场景时Unity移动对象瞬移问题求助

问题分析与解决方案

问题根源

从菜单加载关卡时移动平台瞬移,直接启动关卡正常,核心问题出在**Move脚本的Start方法中对tolerance的错误计算**:

tolerance = speed * Time.deltaTime;

场景从菜单加载时,第一帧的Time.deltaTime会因为场景加载耗时被异常放大(远高于正常帧的deltaTime),导致tolerance被计算成一个极大值。此时平台初始位置与第一个目标点的距离几乎肯定小于这个超大的tolerance,代码会直接将平台位置设置为目标点;若automatic为true,延迟时间到期后会立刻切换到下一个目标,看起来就像瞬移。而直接启动关卡时,初始帧的deltaTime处于正常范围,tolerance值合理,因此不会触发这个错误逻辑。

另外,原代码中直接用transform.position != currentTarget判断是否到达目标也存在浮点数精度问题,可能导致逻辑异常。

修复方案

1. 修正tolerance的初始化

移除Start中用Time.deltaTime计算tolerance的代码,改为手动设置固定值或在Inspector面板调整:

void Start ()
{
    if(points.Length > 0) 
    {
        currentTarget = points[0];
    }
    // 移除错误计算,改为使用Inspector设置的默认值或固定值
    // tolerance = speed * Time.deltaTime;
}

在脚本顶部给tolerance设置合理默认值:

public float tolerance = 0.1f; // 根据你的移动速度调整,比如0.05~0.2之间

2. 替换位置相等判断

用基于距离的比较替代直接的浮点数相等判断,避免精度问题:

void Update ()
{
    // 使用Vector3.Distance判断是否到达目标区域
    if (Vector3.Distance(transform.position, currentTarget) > tolerance)
    {
        MovePlatform();
    } 
    else
    {
        transform.position = currentTarget;
        UpdateTarget();
    }
}

3. 优化目标切换逻辑

在nextPlatform方法中重置延迟计时,确保切换目标后延迟时间从当前时刻开始计算:

public void nextPlatform() 
{
    pointNumber++;

    if(pointNumber >= points.Length)
    {
        pointNumber = 0;
    }
    currentTarget = points[pointNumber];
    delayStart = Time.time; // 添加这行,重置延迟计时
}

完整修复后的Move脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Move : MonoBehaviour
{
    public Vector3[] points;
    public int pointNumber = 0;
    private Vector3 currentTarget;

    public float tolerance = 0.1f; // 可在Inspector调整的默认值
    public float speed;
    public float delayTime;

    private float delayStart;

    public bool automatic;

    void Start ()
    {
        if(points.Length > 0) 
        {
            currentTarget = points[0];
        }
    }

    void Update ()
    {
        if (Vector3.Distance(transform.position, currentTarget) > tolerance)
        {
            MovePlatform();
        } 
        else
        {
            transform.position = currentTarget;
            UpdateTarget();
        }
    }

    void MovePlatform() 
    {
        Vector3 heading = currentTarget - transform.position;
        transform.position += heading.normalized * speed * Time.deltaTime;
    }

    void UpdateTarget ()
    {
        if(automatic)
        {
            if(Time.time - delayStart > delayTime)
            {
                nextPlatform();
            }
        }
    }

    public void nextPlatform() 
    {
        pointNumber++;

        if(pointNumber >= points.Length)
        {
            pointNumber = 0;
        }
        currentTarget = points[pointNumber];
        delayStart = Time.time;
    }

    private void OnTriggerEnter (Collider other) 
    {
        other.transform.parent = transform;
    }

    private void OnTriggerExit (Collider other) 
    {
        other.transform.parent = null;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:18:04