143 lines
3.8 KiB
C#
143 lines
3.8 KiB
C#
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<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;
|
|
case LineSyncState.WaitForAutoAdvance:
|
|
token.TryAdvance();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
public class AutoAdvanceHandler : ILineAdvanceHandler
|
|
{
|
|
public void Handle(LineSyncToken token, Func<bool> isAvailable)
|
|
{
|
|
if (!isAvailable())
|
|
{
|
|
return;
|
|
}
|
|
|
|
// 如果已经可以继续了,就直接往下
|
|
if (token.state == LineSyncState.WaitForAutoAdvance)
|
|
{
|
|
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 or LineSyncState.WaitForAutoAdvance)
|
|
{
|
|
token.ForceAdvance();
|
|
}
|
|
}
|
|
}
|
|
} |