Unity中点击退出暂停菜单后对象自动上下往复移动如何修复?
问题原因
- 输入API使用错误:
CrossPlatformInputManager.GetButton用于检测按钮长按状态,若你需要响应单次点击,应该使用GetButtonDown,否则按钮按下期间逻辑会持续执行,容易出现状态异常。 - 移动逻辑和输入耦合:当前你把菜单移动的逻辑写在了按钮按下的判断分支里,合理逻辑应该是点击一次按钮就触发菜单向对应方向移动,直到碰到边界自动停止,不需要一直按住按钮。
- 冗余判断逻辑错误:
nors == true && !nors == false完全等价于nors == true,重复写判断条件没有意义,还容易引入逻辑隐患。 - 边界碰撞后没有停止移动:你在触发器中仅修改了
nors的值,没有重置移动状态,菜单会继续往边界外移动,穿出触发器后又会触发反向的移动逻辑,最终形成往复循环。 - 状态变量闲置:你定义了
UpDown变量用来标记移动方向,但是后续逻辑完全没有用到该状态,变量设置没有生效。
修复方案
- 将输入检测改为单次点击检测,点击时仅切换菜单的移动状态,不要把移动逻辑和输入判断绑定。
- 把移动逻辑抽到Update外层,统一根据
UpDown的状态执行移动,和输入操作解耦。 - 调整触发器逻辑,碰撞到对应边界时直接将
UpDown设为0(停止移动),同时更新nors的状态,避免继续移动。 - 删掉冗余的判断条件,简化逻辑减少出错概率。
修复后代码
Update 方法
void Update() { // 单次点击暂停按钮,触发菜单向下展开 if (CrossPlatformInputManager.GetButtonDown("pausebutton")) { if (nors == true) { UpDown = 1; ani = true; darkin.SetBool("play", true); darkengame.SetActive(true); } } // 单次点击退出按钮,触发菜单向上收起 if (CrossPlatformInputManager.GetButtonDown("exit")) { if (nors == false) { UpDown = 2; ani = false; darkin.SetBool("play", false); } } // 独立移动逻辑,和输入分离 if (UpDown == 1) { transform.Translate(Vector3.down * speed * Time.deltaTime); } else if (UpDown == 2) { transform.Translate(Vector3.up * speed * Time.deltaTime); } }
触发器方法
private void OnTriggerEnter2D(Collider2D other) { if (other.gameObject.CompareTag("stophome")) { // 碰到上边界,停止移动,标记为已收起状态 UpDown = 0; nors = false; } if (other.gameObject.CompareTag("stophome2")) { // 碰到下边界,停止移动,标记为已展开状态 UpDown = 0; nors = true; darkengame.SetActive(false); } }
注意事项
- 初始化时请将
UpDown设为0,nors的初始值根据菜单初始状态设置:初始收起设为false,初始展开设为true。 - 确认两个边界触发器的位置正确,
stophome放在菜单收起的顶部位置,stophome2放在菜单展开的底部位置,避免菜单穿出触发器。 - 检查CrossPlatformInputManager的虚拟按钮配置,确保
pausebutton和exit不会一直处于按下状态。
内容的提问来源于stack exchange,提问作者Habib Ismail
相关产品推荐
相关产品推荐

