using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace DS { /// /// 输入处理器 - 负责处理玩家输入(移动、视角控制)并将输入数据分发给其他系统(如相机和角色控制器)。 /// public class InputHandler : MonoBehaviour { // ===== 公共输入数据(供其他系统读取) ===== [Header("移动输入")] [Tooltip("水平移动输入值 (-1~1),负值表示左,正值表示右")] public float horizontal; [Tooltip("垂直移动输入值 (-1~1),负值表示下,正值表示上")] public float vertical; [Tooltip("综合移动量 (0~1),水平与垂直绝对值的和,并被限制在 0~1 之间")] public float moveAmount; [Header("视角输入")] [Tooltip("鼠标或右摇杆的水平移动增量")] public float mouseX; [Tooltip("鼠标或右摇杆的垂直移动增量")] public float mouseY; public bool b_Input; public bool rollFlag; public bool isInteracting; [Header("其他操作输入")] [Tooltip("翻滚是否触发")] public bool rollTriggered; // ===== 私有引用与输入缓存 ===== private PlayerControls _inputActions; // 新输入系统生成的 PlayerControls 实例 private CameraHandler _cameraHandler; // 相机处理器单例引用 private Vector2 _movementInput; // 缓存移动输入值 (x => 水平, y => 垂直) private Vector2 _cameraInput; // 缓存视角输入值 (x => 水平视角, y => 垂直视角) // ===== Unity 生命周期方法 ===== private void Start() { // 获取相机处理器的单例引用,用于在 FixedUpdate 中驱动相机跟随与旋转 _cameraHandler = CameraHandler.singleton; } /// /// 固定频率更新(用于物理相关的相机跟随和旋转)。 /// private void FixedUpdate() { float delta = Time.fixedDeltaTime; // 固定时间步长,确保物理一致性 if (_cameraHandler != null) { // 让相机跟随目标(通常是玩家角色) _cameraHandler.FollowTarget(delta); // 根据鼠标/摇杆输入旋转相机 _cameraHandler.HandleCameraRotation(delta, mouseX, mouseY); } } /// /// 在脚本启用时注册输入事件并启用输入系统。 /// public void OnEnable() { if (_inputActions == null) { // 实例化输入操作,并绑定事件回调 _inputActions = new PlayerControls(); // 当移动按键被触发(按下/推摇杆)时,将输入值存入 _movementInput _inputActions.PlayerMovement.Movement.performed += ctx => _movementInput = ctx.ReadValue(); // 当视角控制被触发(鼠标移动/右摇杆)时,将输入值存入 _cameraInput _inputActions.PlayerMovement.Camera.performed += ctx => _cameraInput = ctx.ReadValue(); } // 启用输入动作监听 _inputActions.Enable(); } /// /// 在脚本禁用时禁用输入系统,避免误触。 /// private void OnDisable() { _inputActions.Disable(); } // ===== 公共更新入口 ===== /// /// 每帧调用的输入处理入口(通常由 GameManager 或其他管理器调用)。 /// /// 当前帧的时间增量 public void TickInput(float delta) { MoveInput(delta); HandleRollInput(delta); } // ===== 私有输入处理逻辑 ===== /// /// 从缓存的输入向量中提取各个方向的分量,并计算综合移动量。 /// /// 当前帧的时间增量(目前未使用,保留以准备将来可能的平滑处理) private void MoveInput(float delta) { // 从缓存中提取水平和垂直移动分量 horizontal = _movementInput.x; vertical = _movementInput.y; // 综合移动量 = 水平与垂直绝对值的和,限制在 0~1,用于控制移动动画混合等 moveAmount = Mathf.Clamp01(Mathf.Abs(horizontal) + Mathf.Abs(vertical)); // 从缓存中提取视角控制分量 mouseX = _cameraInput.x; mouseY = _cameraInput.y; } private void HandleRollInput(float delta) { b_Input = _inputActions.PlayerActions.Roll.phase == UnityEngine.InputSystem.InputActionPhase.Performed; if (b_Input) { rollFlag = true; } } } }