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

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触发)

关键改动说明

  1. 按压状态标记:用isLeftPressed/isRightPressed记录按钮状态,替代单次触发的加力逻辑
  2. 物理帧处理:将移动力的施加放在FixedUpdate中,保证物理操作的稳定性
  3. 碰撞检测修正:修正函数名和参数类型,确保地面状态能正确更新
  4. 空中状态重置:离开地面时清空按压标记,严格遵循“空中无法改变方向”的设定

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:30:49