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

Unity 2D移动端平台游戏:如何实现触摸即跳而非松开触发跳跃

解决2D移动端游戏触摸瞬间触发跳跃的问题

核心修改:替换按钮触发事件类型

你当前的问题是因为UI按钮默认绑定的OnClick事件是在触摸松开时触发,只需把绑定的事件改成**OnPointerDown**即可实现触摸按下瞬间触发跳跃:

  • 在Unity编辑器中选中你的隐形跳跃按钮,打开Inspector面板的Button组件
  • 移除原有的OnClick事件绑定,点击+号添加新事件
  • 在事件列表的下拉菜单中选择Event Trigger -> Pointer Down
  • 将你的Jump函数绑定到这个Pointer Down事件上

可选优化:防止重复触发跳跃

如果担心玩家长按屏幕导致连续触发跳跃(比如二段跳逻辑下误操作),可以给Jump函数添加简单的冷却判断:

private bool canJump = true;
public float jumpTriggerCooldown = 0.15f; // 可调整的冷却时间

public void Jump(){
    if (currentJumpRights > 0 && canJump){
        canJump = false;
        gameObject.GetComponent<Rigidbody2D>().AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
        soundManager.PlaySound("jumpSound");
        currentJumpRights--;
        // 冷却时间后恢复可跳跃状态
        Invoke(nameof(ResetJumpPermission), jumpTriggerCooldown);
    }
}

private void ResetJumpPermission(){
    canJump = true;
}

备选方案:直接检测触摸输入(无需UI按钮)

如果不想依赖UI按钮的事件系统,可以在角色脚本的Update中直接检测触摸开始的瞬间,同时避开暂停按钮区域:

// 假设你有一个暂停按钮的引用
public GameObject pauseButton;

void Update(){
    if (Input.touchCount == 0) return;

    Touch touch = Input.GetTouch(0);
    // 仅在触摸开始的第一帧触发
    if (touch.phase == TouchPhase.Began){
        // 判断触摸位置是否不在暂停按钮范围内
        if (!IsTouchingUIElement(pauseButton.GetComponent<RectTransform>(), touch.position)){
            Jump();
        }
    }
}

// 判断触摸位置是否在指定UI元素内
private bool IsTouchingUIElement(RectTransform uiElement, Vector2 screenPosition){
    Vector2 localPoint;
    RectTransformUtility.ScreenPointToLocalPointInRectangle(
        uiElement, screenPosition, Camera.main, out localPoint
    );
    return uiElement.rect.Contains(localPoint);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:36:29