Unity 2D游戏适配Android触屏虚拟摇杆输入的C#脚本修改求助
脚本修改方案
前置准备
- 提前在场景中用UGUI实现虚拟摇杆UI组件,确保摇杆脚本可对外输出归一化的水平、垂直输入值(取值范围为-1~1),通用摇杆组件一般会封装好
Horizontal、Verticalfloat属性或者inputVector2属性供外部调用。 - 你当前贴出的是输入参数的声明代码,这部分本身不需要修改,只需要新增摇杆相关逻辑即可。
具体修改步骤
- 在现有输入参数声明下方新增虚拟摇杆引用变量,将变量名替换为你实际使用的摇杆类名即可:
public InputButton Pause = new InputButton(KeyCode.Escape, XboxControllerButtons.Menu); public InputButton Interact = new InputButton(KeyCode.E, XboxControllerButtons.Y); public InputButton MeleeAttack = new InputButton(KeyCode.K, XboxControllerButtons.X); public InputButton RangedAttack = new InputButton(KeyCode.O, XboxControllerButtons.B); public InputButton Jump = new InputButton(KeyCode.Space, XboxControllerButtons.A); public InputAxis Horizontal = new InputAxis(KeyCode.D, KeyCode.A, XboxControllerAxes.LeftstickHorizontal); public InputAxis Vertical = new InputAxis(KeyCode.W, KeyCode.S, XboxControllerAxes.LeftstickVertical); // 新增:虚拟摇杆引用 public Joystick moveJoystick; [HideInInspector] public DataSettings dataSettings;
- 找到脚本中读取Horizontal、Vertical输入值的逻辑位置,修改为优先读取摇杆输入,摇杆无操作时再走原键盘、手柄输入逻辑:
// 原移动输入读取代码 // float horizontalInput = Horizontal.GetValue(); // float verticalInput = Vertical.GetValue(); // 修改后的输入读取代码 float horizontalInput, verticalInput; // 死区设置,避免摇杆轻微漂移触发误操作 const float inputDeadZone = 0.02f; if (moveJoystick != null) { horizontalInput = Mathf.Abs(moveJoystick.Horizontal) > inputDeadZone ? moveJoystick.Horizontal : 0; verticalInput = Mathf.Abs(moveJoystick.Vertical) > inputDeadZone ? moveJoystick.Vertical : 0; } // 摇杆无输入或者未赋值时,读取原有输入 if (Mathf.Abs(horizontalInput) < inputDeadZone && Mathf.Abs(verticalInput) < inputDeadZone) { horizontalInput = Horizontal.GetValue(); verticalInput = Vertical.GetValue(); }
扩展适配(可选)
如果需要同时适配触屏按钮实现跳跃、攻击、暂停等操作,可以按以下逻辑修改:
- 新增UGUI按钮的公共引用变量,比如
public Button jumpButton; - 在
Start()方法中绑定按钮事件,对应2D Game Kit的InputButton封装方法:
private void Start() { // 监听跳跃按钮按下/抬起事件,匹配原输入的触发逻辑 EventTrigger trigger = jumpButton.gameObject.AddComponent<EventTrigger>(); // 按下事件 EventTrigger.Entry downEntry = new EventTrigger.Entry { eventID = EventTriggerType.PointerDown }; downEntry.callback.AddListener(_ => Jump.Press()); trigger.triggers.Add(downEntry); // 抬起事件 EventTrigger.Entry upEntry = new EventTrigger.Entry { eventID = EventTriggerType.PointerUp }; upEntry.callback.AddListener(_ => Jump.Release()); trigger.triggers.Add(upEntry); }
注意事项
- 摇杆所在的Canvas需设置为屏幕空间-覆盖渲染模式,保证触屏交互优先级最高
- 可以添加平台编译宏,只在移动平台启用摇杆逻辑,减少PC端不必要的性能消耗:
#if UNITY_ANDROID || UNITY_IOS // 移动平台摇杆输入逻辑 #else // PC/主机平台原输入逻辑 #endif
内容的提问来源于stack exchange,提问作者Sshan dev
相关产品推荐
相关产品推荐

