134 lines
3.5 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|
|
} |