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位置的差值,以设定速度逐帧移动,而非直接跳转。
修改步骤及代码示例
- 定义可调整的移动速度变量,方便在Inspector面板调试;
- 用
Vector2.MoveTowards替代Lerp,该方法会以指定速度向目标移动,避免瞬移; - 保留触摸区域判断,只响应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
相关产品推荐
相关产品推荐

