Unity移动端动量平台游戏:实现按钮按住持续移动的方法
解决方案:实现UI按钮按住持续移动
问题分析
当前脚本里按钮点击只会触发一次MoveLeft/MoveRight,只能单次给角色加力;同时碰撞检测函数存在大小写错误,会导致onGround状态无法正确更新。要实现按住持续移动,需要通过标记按钮按压状态,在物理帧中持续施加力。
修改步骤与完整代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { private float moveSpeed; private float jumpSpeed; public bool onGround = true; // 新增:标记按钮按压状态 private bool isLeftPressed = false; private bool isRightPressed = false; private Rigidbody2D playerRb; void Start() { moveSpeed = 100; jumpSpeed = 3; playerRb = GetComponent<Rigidbody2D>(); } // 刚体操作建议用FixedUpdate,物理帧执行更稳定 void FixedUpdate() { // 检查按压状态+地面状态,持续施加移动力 if (onGround) { if (isLeftPressed) { playerRb.AddForce(new Vector2(-moveSpeed, 0), ForceMode2D.Force); } if (isRightPressed) { playerRb.AddForce(new Vector2(moveSpeed, 0), ForceMode2D.Force); } } } // 修正:2D碰撞需用OnCollisionEnter2D,函数名首字母必须大写 void OnCollisionEnter2D(Collision2D collision) { if (collision.gameObject.tag == "Level") { onGround = true; } } // 新增:离开地面时重置状态,符合空中无法移动的设定 void OnCollisionExit2D(Collision2D collision) { if (collision.gameObject.tag == "Level") { onGround = false; isLeftPressed = false; isRightPressed = false; } } // 按钮按下时触发:设置按压标记 public void StartMoveLeft() { isLeftPressed = true; } // 按钮松开时触发:取消按压标记 public void StopMoveLeft() { isLeftPressed = false; } public void StartMoveRight() { isRightPressed = true; } public void StopMoveRight() { isRightPressed = false; } }
按钮事件绑定(Unity编辑器操作)
选中你的左右按钮,在Inspector面板的Button组件中绑定事件:
- 左按钮:
- 添加第一个事件,绑定
PlayerController -> StartMoveLeft(),触发方式保持Pointer Down - 添加第二个事件,绑定
PlayerController -> StopMoveLeft(),触发方式改为Pointer Up
- 添加第一个事件,绑定
- 右按钮同理,绑定
StartMoveRight()(Pointer Down触发)和StopMoveRight()(Pointer Up触发)
关键改动说明
- 按压状态标记:用
isLeftPressed/isRightPressed记录按钮状态,替代单次触发的加力逻辑 - 物理帧处理:将移动力的施加放在
FixedUpdate中,保证物理操作的稳定性 - 碰撞检测修正:修正函数名和参数类型,确保地面状态能正确更新
- 空中状态重置:离开地面时清空按压标记,严格遵循“空中无法改变方向”的设定
内容的提问来源于stack exchange,提问作者Pluto
相关产品推荐
相关产品推荐

