Files
aibis-dream/Assets/Scripts/Dialog System/LineAdvanceInput.cs
T
2025-11-05 23:59:55 +08:00

134 lines
3.5 KiB
C#

using System;
using AibisDream.Framework;
using UnityEngine;
namespace AibisDream
{
public class LineAdvanceInput : MonoBehaviour
{
#region 状态
private bool _inGame;
private bool _isDialog;
private LineSyncToken _curSyncToken;
private ILineAdvanceHandler _handler;
#endregion
private ILineAdvanceHandler _defaultHandler = new DefaultAdvanceHandler();
private ILineAdvanceHandler _quickHandler;
private ILineAdvanceHandler _autoHandler = new AutoAdvanceHandler();
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 _inGame && _isDialog && _curSyncToken != null && _curSyncToken.state != LineSyncState.Advanced;
}
#endregion
}
public interface ILineAdvanceHandler
{
void Handle(LineSyncToken token, Func<bool> isAvailable);
static ILineAdvanceHandler Create(bool autoMode)
{
return autoMode ? new AutoAdvanceHandler() : new DefaultAdvanceHandler();
}
}
public class DefaultAdvanceHandler : ILineAdvanceHandler
{
public void Handle(LineSyncToken token, Func<bool> 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;
}
}
}
public class AutoAdvanceHandler : ILineAdvanceHandler
{
public void Handle(LineSyncToken token, Func<bool> isAvailable)
{
if (!isAvailable())
{
return;
}
// 如果已经可以继续了,就直接往下
if (token.state == LineSyncState.WaitForAdvance)
{
token.TryAdvance();
}
}
}
public class QuickAdvanceHandler : ILineAdvanceHandler
{
public void Handle(LineSyncToken token, Func<bool> isAvailable)
{
if (!isAvailable())
{
return;
}
// 加速模式强制快进
if (token.state == LineSyncState.PlayText)
{
token.TrySkip();
}
// 如果已经可以继续了,就直接往下
if (token.state is LineSyncState.AdvanceDelay or LineSyncState.WaitForAdvance)
{
token.ForceAdvance();
}
}
}
}