using System; using AibisDream.Framework; using UnityEngine; namespace AibisDream { public class LineAdvanceInput : MonoBehaviour { #region 状态 private LineSyncToken _curSyncToken; private ILineAdvanceHandler _handler; #endregion private ILineAdvanceHandler _defaultHandler = new DefaultAdvanceHandler(); private ILineAdvanceHandler _quickHandler = new QuickAdvanceHandler(); private ILineAdvanceHandler _autoHandler = new AutoAdvanceHandler(); private void OnEnable() { ResetAdvanceMode(); } public void RunLine(LineSyncToken lineSyncEvent) { _curSyncToken = lineSyncEvent; } private void Update() { _handler.Handle(_curSyncToken, IsInputAvailable); } public void SwitchAdvanceHandler(AdvanceModeEnum advanceMode) { _handler = advanceMode switch { AdvanceModeEnum.Auto => _autoHandler, AdvanceModeEnum.Quick => _quickHandler, AdvanceModeEnum.Default => _defaultHandler, _ => _defaultHandler, }; } public void ResetAdvanceMode() { _handler = _defaultHandler; } #region 输入事件处理 private bool IsInputAvailable() { return GameManager.Instance.state.IsInputAvailable() && _curSyncToken != null && _curSyncToken.state != LineSyncState.Advanced; } #endregion } public interface ILineAdvanceHandler { void Handle(LineSyncToken token, Func isAvailable); static ILineAdvanceHandler Create(bool autoMode) { return autoMode ? new AutoAdvanceHandler() : new DefaultAdvanceHandler(); } } public class DefaultAdvanceHandler : ILineAdvanceHandler { public void Handle(LineSyncToken token, Func isAvailable) { if (Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.Space)) { if (isAvailable()) { HandleInput(token); } } } private void HandleInput(LineSyncToken token) { switch (token.state) { case LineSyncState.PlayText: token.TrySkip(); break; case LineSyncState.WaitForAdvance: token.TryAdvance(); break; case LineSyncState.WaitForAutoAdvance: token.TryAdvance(); break; } } } public class AutoAdvanceHandler : ILineAdvanceHandler { public void Handle(LineSyncToken token, Func isAvailable) { if (!isAvailable()) { return; } // 如果已经可以继续了,就直接往下 if (token.state == LineSyncState.WaitForAutoAdvance) { token.TryAdvance(); return; } if (Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.Space)) { HandleInput(token); } } private void HandleInput(LineSyncToken token) { switch (token.state) { case LineSyncState.PlayText: token.TrySkip(); break; case LineSyncState.WaitForAdvance: token.TryAdvance(); break; case LineSyncState.WaitForAutoAdvance: token.TryAdvance(); break; } } } public class QuickAdvanceHandler : ILineAdvanceHandler { public void Handle(LineSyncToken token, Func isAvailable) { if (!isAvailable()) { return; } // 加速模式强制快进 if (token.state == LineSyncState.PlayText) { token.TrySkip(); } // 如果已经可以继续了,就直接往下 if (token.state is LineSyncState.AdvanceDelay or LineSyncState.WaitForAdvance or LineSyncState.WaitForAutoAdvance) { token.ForceAdvance(); } } } }