https://zhuanlan.zhihu.com/p/424070778 ### 游戏输入系统设计总结 #### **核心设计思路** 1. **输入抽象分层**: - **基础输入层**:将输入抽象为按钮(`IButtonInput`)和轴值(`IAxisInput`)两类 - **复合输入层**:支持多个按键绑定到同一行为(`CompoundButtonInput`/`CompoundAxisInput`) - **行为映射层**:将输入状态转化为游戏行为(`InputButtonProcessor`) 2. **关键接口设计**: csharp 复制 下载 // 按钮输入 public interface IButtonInput { bool GetButton(); // 获取按钮状态 } // 轴值输入 public interface IAxisInput { float AxisValue(); // 获取轴值(-1~1) } #### **核心组件实现** 1. **基础输入实现**: - `KeyCodeButtonInput`:封装Unity键值检测 - `ButtonAxisInput`:将按钮转为轴值(正/负方向) 2. **复合输入容器**: csharp 复制 下载 // 复合按钮(OR逻辑) public class CompoundButtonInput : IButtonInput { public bool GetButton() { foreach(var btn in Buttons) if(btn.GetButton()) return true; return false; } } // 复合轴值(取极值叠加) public class CompoundAxisInput : IAxisInput { public float AxisValue() { float max=0, min=0; foreach(var axis in Axis) { float val = axis.AxisValue(); if(val<0) min = Mathf.Min(min, val); else max = Mathf.Max(max, val); } return max + min; } } 3. **行为状态机**: csharp 复制 下载 public class InputButtonProcessor { // 状态记录 public bool WasPressed; // 上一帧状态 public bool IsPressed; // 当前帧状态 // 状态查询属性 public bool OnPressed => IsPressed && !WasPressed; // 刚按下 public bool OnReleased => !IsPressed && WasPressed; // 刚释放 // 状态更新 public void Update(bool isPressed) { WasPressed = IsPressed; IsPressed = isPressed; } } #### **系统工作流程** 1. **初始化绑定**(PlayerInput): csharp 复制 下载 public void AddKeyboardControls() { // 水平轴:A/D/左右箭头 HorizontalDigiPad.Add(new ButtonAxisInput( new KeyCodeButtonInput(KeyCode.A), ButtonAxisInput.Mode.Negative )); // 跳跃:空格/Z/Y Jump.Add(new KeyCodeButtonInput(KeyCode.Space)); } 2. **状态更新**(每帧): csharp 复制 下载 void RefreshControls() { // 1. 更新轴值输入 Input.HorizontalValue = HorizontalDigiPad.AxisValue(); // 2. 更新按钮状态机 for(int i=0; i 该设计通过分层抽象解决了多键位绑定问题,核心价值在于将**物理输入**到**游戏行为**的映射关系标准化,为复杂输入需求提供了可扩展框架。