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

Unity拖拽GameObject时lastPos变量异常同步问题及平滑减速需求

拖拽后平滑滑行的实现修正方案

核心问题在于你记录lastPos的时机错误,导致拖拽结束时无法得到有效位置差来计算滑行速度。以下是具体分析和修正方法:

问题根源

如果在拖拽过程中每帧移动物体后立刻更新lastPos,那么拖拽结束瞬间,lastPos已经和当前位置完全一致,计算出的速度为0,自然无法产生滑行效果。

修正思路

  1. 在拖拽的每帧开始时记录当前位置作为lastPos,再执行物体移动,这样能得到准确的单帧位置差(即拖拽速度)。
  2. 拖拽结束时,保存最后一次计算的拖拽速度,用这个速度作为滑行的初始速度,之后通过衰减速度实现平滑停止。

修正代码示例

using UnityEngine;

public class DragAndSlide : MonoBehaviour
{
    private Vector3 _lastDragPos;
    private Vector3 _slideVelocity;
    private bool _isDragging;
    [SerializeField] private float _dragSpeed = 1f;
    [SerializeField] private float _slideDamping = 0.9f; // 滑行衰减系数,越小停得越快
    [SerializeField] private float _minSlideSpeed = 0.01f; // 最小滑行速度,低于此值停止

    private void Start()
    {
        _lastDragPos = transform.position;
    }

    private void Update()
    {
        if (_isDragging)
        {
            // 1. 先记录拖拽前的位置
            _lastDragPos = transform.position;
            
            // 2. 执行拖拽移动逻辑(示例:鼠标世界坐标转换)
            Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            mouseWorldPos.z = transform.position.z; // 保持Z轴与物体一致
            transform.position = Vector3.Lerp(transform.position, mouseWorldPos, _dragSpeed);
            
            // 3. 计算当前拖拽的单帧速度
            _slideVelocity = transform.position - _lastDragPos;
        }
        else
        {
            // 滑行逻辑:用保存的速度移动,逐渐衰减
            if (_slideVelocity.magnitude > _minSlideSpeed)
            {
                transform.position += _slideVelocity;
                _slideVelocity *= _slideDamping;
            }
            else
            {
                _slideVelocity = Vector3.zero; // 速度过低时停止滑行
            }
        }

        // 拖拽状态切换
        if (Input.GetMouseButtonDown(0))
        {
            _isDragging = true;
            _slideVelocity = Vector3.zero; // 开始拖拽时重置滑行状态
            _lastDragPos = transform.position;
        }

        if (Input.GetMouseButtonUp(0))
        {
            _isDragging = false;
            // 无需额外计算,最后一次拖拽的速度已经保存在_slideVelocity中
        }
    }
}

关键注意点

  • 拖拽时的位置记录顺序:先存旧位置,再移动,最后算速度,确保位置差是真实的单帧移动距离。
  • 滑行阶段直接复用拖拽时计算的速度,避免依赖实时位置差(否则会因为物体停止移动导致速度骤降)。
  • 添加最小速度判断,防止物体因微小速度持续抖动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:25:16