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

Unity移动端输入适配请求:将PC键鼠输入脚本转为移动端输入

移动端适配PlayerInput脚本及UI设置指南

适配后的完整脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class PlayerInput : MonoBehaviour
{
    // 移动端虚拟摇杆引用
    public Joystick moveJoystick;
    // 功能按钮引用
    public Button jumpButton;
    public Button crouchButton;
    public Button interactButton;
    public Button reloadButton;
    public Button aimButton;
    public Button shootButton;
    public Button runButton;

    // 输入逻辑:优先移动端,无则用PC轴输入
    public Vector2 input
    {
        get
        {
            Vector2 i = Vector2.zero;
            if (moveJoystick != null)
            {
                i = moveJoystick.Direction;
            }
            else
            {
                i.x = Input.GetAxis("Horizontal");
                i.y = Input.GetAxis("Vertical");
            }
            i *= (i.x != 0.0f && i.y != 0.0f) ? .7071f : 1.0f;
            return i;
        }
    }

    public Vector2 down
    {
        get { return _down; }
    }

    public Vector2 raw
    {
        get
        {
            Vector2 i = Vector2.zero;
            if (moveJoystick != null)
            {
                i = moveJoystick.Direction;
                i.x = Mathf.Round(i.x);
                i.y = Mathf.Round(i.y);
            }
            else
            {
                i.x = Input.GetAxisRaw("Horizontal");
                i.y = Input.GetAxisRaw("Vertical");
            }
            i *= (i.x != 0.0f && i.y != 0.0f) ? .7071f : 1.0f;
            return i;
        }
    }

    public float elevate
    {
        get { return Input.GetAxis("Elevate"); }
    }

    private bool _run;
    public bool run
    {
        get { return _run || Input.GetKey(KeyCode.LeftShift); }
    }

    private bool _crouchDown;
    public bool crouch
    {
        get { return _crouchDown || Input.GetKeyDown(KeyCode.C); }
    }

    private bool _crouching;
    public bool crouching
    {
        get { return _crouching || Input.GetKey(KeyCode.C); }
    }

    public KeyCode interactKey
    { 
        get { return KeyCode.E; }
    }

    private bool _interact;
    public bool interact
    {
        get { return _interact || Input.GetKeyDown(interactKey); }
    }

    private bool _reload;
    public bool reload
    {
        get { return _reload || Input.GetKeyDown(KeyCode.R); }
    }

    private bool _aimDown;
    public bool aim
    {
        get { return _aimDown || Input.GetMouseButtonDown(1); }
    }

    private bool _aiming;
    public bool aiming
    {
        get { return _aiming || Input.GetMouseButton(1); }
    }

    private bool _shooting;
    public bool shooting
    {
        get { return _shooting || Input.GetMouseButton(0); }
    }

    public float mouseScroll
    { 
        get { return Input.GetAxisRaw("Mouse ScrollWheel"); }
    }


    private Vector2 previous;
    private Vector2 _down;

    private int jumpTimer;
    private bool jump;

    void Start()
    {
        jumpTimer = -1;
        BindButtonEvents();
    }

    void Update()
    {
        _down = Vector2.zero;
        if (raw.x != previous.x)
        {
            previous.x = raw.x;
            if (previous.x != 0)
                _down.x = previous.x;
        }
        if (raw.y != previous.y)
        {
            previous.y = raw.y;
            if (previous.y != 0)
                _down.y = previous.y;
        }

        // 重置单次触发状态
        _crouchDown = false;
        _interact = false;
        _reload = false;
        _aimDown = false;
    }

    public void FixedUpdate()
    {
        bool mobileJump = jumpButton != null && jumpButton.GetComponent<ButtonPressed>().isPressed;
        if (!Input.GetKey(KeyCode.Space) && !mobileJump)
        {
            jump = false;
            jumpTimer++;
        }
        else if (jumpTimer > 0)
            jump = true;
    }

    public bool Jump()
    {
        return jump;
    }

    public void ResetJump()
    {
        jumpTimer = -1;
    }

    // 绑定按钮交互事件
    private void BindButtonEvents()
    {
        if (jumpButton != null)
        {
            jumpButton.gameObject.AddComponent<ButtonPressed>();
        }

        if (crouchButton != null)
        {
            crouchButton.onClick.AddListener(() => _crouchDown = true);
            crouchButton.onPointerDown.AddListener((data) => _crouching = true);
            crouchButton.onPointerUp.AddListener((data) => _crouching = false);
        }

        if (interactButton != null)
        {
            interactButton.onClick.AddListener(() => _interact = true);
        }

        if (reloadButton != null)
        {
            reloadButton.onClick.AddListener(() => _reload = true);
        }

        if (aimButton != null)
        {
            aimButton.onPointerDown.AddListener((data) => 
            {
                _aimDown = true;
                _aiming = true;
            });
            aimButton.onPointerUp.AddListener((data) => _aiming = false);
        }

        if (shootButton != null)
        {
            shootButton.onPointerDown.AddListener((data) => _shooting = true);
            shootButton.onPointerUp.AddListener((data) => _shooting = false);
        }

        if (runButton != null)
        {
            runButton.onPointerDown.AddListener((data) => _run = true);
            runButton.onPointerUp.AddListener((data) => _run = false);
        }
    }
}

// 辅助脚本:检测按钮长按状态
public class ButtonPressed : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
    public bool isPressed { get; private set; }

    public void OnPointerDown(PointerEventData eventData)
    {
        isPressed = true;
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        isPressed = false;
    }
}

UI组件设置步骤

1. 虚拟摇杆配置

  • 在Canvas下创建空对象命名MoveJoystick,添加Joystick组件(可使用Unity Input System自带摇杆,或第三方插件如Standard Assets的CrossPlatformInput)
  • 给摇杆添加背景图和手柄图,调整大小后放置在屏幕左下角
  • 将摇杆对象拖入PlayerInput脚本的moveJoystick字段

2. 功能按钮配置

所有按钮均创建在Canvas下,调整位置到屏幕右侧或合适区域:

  • 跳跃按钮:创建Button组件命名JumpButton,拖入PlayerInput的jumpButton字段
  • 蹲伏按钮:创建Button组件命名CrouchButton,拖入crouchButton字段
  • 互动按钮:创建Button组件命名InteractButton,拖入interactButton字段
  • 换弹按钮:创建Button组件命名ReloadButton,拖入reloadButton字段
  • 瞄准按钮:创建Button组件命名AimButton,拖入aimButton字段
  • 射击按钮:创建Button组件命名ShootButton,拖入shootButton字段
  • 奔跑按钮:创建Button组件命名RunButton,拖入runButton字段

3. 基础UI适配

  • 确保场景存在EventSystem对象(右键UI -> EventSystem可自动创建)
  • 设置Canvas的Render Mode为Screen Space - Overlay,适配不同分辨率

操作对应表

PC端操作移动端操作
WASD/方向键移动拖动虚拟摇杆
左Shift奔跑按住奔跑按钮
C键蹲伏/持续蹲伏点击/按住蹲伏按钮
E键互动点击互动按钮
R键换弹点击换弹按钮
右键瞄准/持续瞄准点击/按住瞄准按钮
左键射击按住射击按钮
空格跳跃按住跳跃按钮

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:09:13