using System; using Script.Gameplay.Input; using UnityEngine; using Core; using Script.Gameplay.Global; namespace Gameplay.Player { public enum WatchMode { Normal, Inside, Outside } public class PlayerWatchModeController : MonoBehaviour { [SerializeField] private Camera cam; public event Action OnEnterInsideWatchMode; public event Action OnExitInsideWatchMode; private InputManager inputManager; private TimePauseManager timePauseManager; private WatchMode currentMode = WatchMode.Normal; public WatchMode CurrentWatchMode { get => currentMode; set { if (value != WatchMode.Inside) { OnExitInsideWatchMode?.Invoke(); } if (value == WatchMode.Inside) { OnEnterInsideWatchMode?.Invoke(); } currentMode = value; SwitchWatchMode(currentMode); } } private void Start() { inputManager = InputManager.Instance; timePauseManager = TimePauseManager.Instance; var input = inputManager.Input; input.Player.SwitchWatchMode.performed += ctx => { var modeTemp = (WatchMode)(((int)CurrentWatchMode + 1) % 3); CurrentWatchMode = modeTemp; }; ; ControllerLocator.Instance.Register(this); } // 实现按Tap键实现在WatchMode 3个模式切换,并通过SwitchWatchMode设置正确的相机模式 private void SwitchWatchMode(WatchMode watchMode) { switch (watchMode) { case WatchMode.Normal: SetSeeLines(false); inputManager.SetCursorState(false, CursorLockMode.Locked); inputManager.SetInputForLook(true); inputManager.SetInputForMove(true); if (timePauseManager != null) { timePauseManager.SetPaused(false); } break; case WatchMode.Inside: SetSeeLines(false); inputManager.SetCursorState(true, CursorLockMode.Confined); inputManager.SetInputForLook(false); inputManager.SetInputForMove(false); if (timePauseManager != null) { timePauseManager.SetPaused(true); } break; case WatchMode.Outside: SetSeeLines(true); inputManager.SetCursorState(false, CursorLockMode.Locked); inputManager.SetInputForLook(true); inputManager.SetInputForMove(true); if (timePauseManager != null) { timePauseManager.SetPaused(false); } break; default: throw new ArgumentOutOfRangeException(); } } private void SetSeeLines(bool seeLine) { int linesLayer = LayerMask.NameToLayer("Lines"); int mask = cam.cullingMask; if (seeLine) mask |= 1 << linesLayer; // 打开 else mask &= ~(1 << linesLayer); // 关闭 cam.cullingMask = mask; } } }