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
相关产品推荐
相关产品推荐

