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

Unity 2D移动端乒乓游戏:如何实现拖拽控制Paddle带速度上下移动?

解决Unity 2D移动端乒乓游戏Paddle瞬移问题

问题根源

  • 你代码里的Mathf.Lerp(myPosition.y, touchPosition.y,10)参数错误:Mathf.Lerp的第三个参数t是0到1之间的插值比例,当t≥1时会直接返回目标值,这就导致Paddle瞬间跳到手指位置。
  • 直接修改rb.position的逻辑没有加入速度限制,无法控制Paddle的移动速率。

解决方案:基于速度的平滑移动

核心思路是计算Paddle到手指Y位置的差值,以设定速度逐帧移动,而非直接跳转。

修改步骤及代码示例

  1. 定义可调整的移动速度变量,方便在Inspector面板调试;
  2. 用Vector2.MoveTowards替代Lerp,该方法会以指定速度向目标移动,避免瞬移;
  3. 保留触摸区域判断,只响应Paddle附近的触摸操作。
public Rigidbody2D rb;
public float moveSpeed = 5f; // 可在Inspector面板调整的移动速度
private readonly float _minY = -3.7f;
private readonly float _maxY = 3.7f;

void Update()
{
    foreach (Touch touch in Input.touches)
    {
        Vector3 touchWorldPos = Camera.main.ScreenToWorldPoint(touch.position);
        Vector2 currentPos = rb.position;

        // 仅处理当前Paddle附近的触摸
        if (Mathf.Abs(touchWorldPos.x - currentPos.x) <= 2)
        {
            // 先将目标Y值限制在游戏区域内
            float targetY = Mathf.Clamp(touchWorldPos.y, _minY, _maxY);
            // 以设定速度向目标位置移动,Time.deltaTime保证帧率无关性
            Vector2 newPos = Vector2.MoveTowards(currentPos, new Vector2(currentPos.x, targetY), moveSpeed * Time.deltaTime);
            // 使用MovePosition更新刚体位置,兼容物理引擎逻辑
            rb.MovePosition(newPos);
        }
    }
}

额外提示

  • Time.deltaTime的作用是让移动速度不受设备帧率影响,保证不同设备上的移动体验一致;
  • 若使用Rigidbody2D,优先用rb.MovePosition而非直接修改rb.position,这样物理引擎能正确处理碰撞、摩擦等逻辑;
  • 可以把_minY和_maxY设为公共变量,方便快速调整游戏边界大小。

内容的提问来源于stack exchange,提问作者Alperen Enes Kale

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:20:34