回复下
This commit is contained in:
@@ -2,7 +2,6 @@ using System;
|
||||
using AibisDream.Framework;
|
||||
using AibisDream.Utility;
|
||||
using Yarn.Unity;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AibisDream
|
||||
{
|
||||
@@ -15,28 +14,6 @@ namespace AibisDream
|
||||
HandleLineOutput(dialogueLine, onDialogueLineFinished);
|
||||
|
||||
if (DialogController.Instance.quickRunMode)
|
||||
{
|
||||
// 在快速模式下,延迟更多帧数并重复检查,确保选项有足够时间显示
|
||||
StartCoroutine(QuickRunNextStep(onDialogueLineFinished));
|
||||
}
|
||||
}
|
||||
|
||||
private System.Collections.IEnumerator QuickRunNextStep(Action onDialogueLineFinished)
|
||||
{
|
||||
// 延迟1帧,给Yarn足够时间检查下一个内容是否为选项
|
||||
yield return null;
|
||||
|
||||
// 检查1次,现在有了_isProcessingOptions标志,应该足够了
|
||||
if (DialogCanvasManager.Instance.HasActiveOptions())
|
||||
{
|
||||
yield break;
|
||||
}
|
||||
|
||||
// 再等1帧确保
|
||||
yield return null;
|
||||
|
||||
// 如果没有选项,则跳过到下一行
|
||||
if (!DialogCanvasManager.Instance.HasActiveOptions())
|
||||
{
|
||||
DialogCanvasManager.Instance.TrySkipLine(true);
|
||||
DialogCanvasManager.Instance.NextStep();
|
||||
@@ -52,27 +29,8 @@ namespace AibisDream
|
||||
public override void RunOptions(DialogueOption[] dialogueOptions, Action<int> onOptionSelected)
|
||||
{
|
||||
EnumEventSystem.Global.Send(DialogEventEnum.OptionShow);
|
||||
|
||||
// 自动暂停快进,选项被选择后再恢复
|
||||
bool wasQuickRun = DialogController.Instance.quickRunMode;
|
||||
DialogController.Instance.quickRunMode = false;
|
||||
|
||||
// 包装原有回调,选项被选择后恢复快进状态
|
||||
Action<int> wrappedOnOptionSelected = idx => {
|
||||
// 延迟一帧恢复快进状态,确保Yarn流程正确执行
|
||||
DialogController.Instance.StartCoroutine(RestoreQuickRunMode(wasQuickRun));
|
||||
onOptionSelected(idx);
|
||||
};
|
||||
|
||||
// 只调用一次ShowOptions,使用包装后的回调
|
||||
var options = DialogOption.GeneOptions(dialogueOptions, wrappedOnOptionSelected);
|
||||
var options = DialogOption.GeneOptions(dialogueOptions, onOptionSelected);
|
||||
DialogCanvasManager.Instance.ShowOptions(options);
|
||||
}
|
||||
|
||||
private System.Collections.IEnumerator RestoreQuickRunMode(bool wasQuickRun)
|
||||
{
|
||||
yield return null; // 等待一帧
|
||||
DialogController.Instance.quickRunMode = wasQuickRun;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -177,24 +177,6 @@ namespace AibisDream
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 检查当前是否有活动的选项显示
|
||||
/// </summary>
|
||||
/// <returns>是否有活动选项</returns>
|
||||
public bool HasActiveOptions()
|
||||
{
|
||||
if (_options == null) return false;
|
||||
|
||||
foreach (var option in _options)
|
||||
{
|
||||
if (option.gameObject.activeSelf)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private void HideDialog(Bubble activeBubble)
|
||||
|
||||
@@ -71,16 +71,7 @@ namespace AibisDream
|
||||
{
|
||||
// 无法继续
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 检查当前是否有活动的选项显示
|
||||
/// </summary>
|
||||
/// <returns>是否有活动选项</returns>
|
||||
public bool HasActiveOptions()
|
||||
{
|
||||
return gameObject.activeSelf;
|
||||
}
|
||||
|
||||
|
||||
public void OnLocalizationChanged(string value)
|
||||
{
|
||||
_textParam = JsonUtil.ReadBeanByText<TextParam>(value);
|
||||
|
||||
@@ -100,29 +100,22 @@ namespace AibisDream
|
||||
public void NextStep()
|
||||
{
|
||||
if (_nextStep == null) return;
|
||||
|
||||
ClearBox();
|
||||
|
||||
EnumEventSystem.Global.Send(DialogEventEnum.LineEnd);
|
||||
// 关闭对话
|
||||
var next = _nextStep;
|
||||
_nextStep = null;
|
||||
next.Invoke();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 检查当前是否有活动的选项显示
|
||||
/// </summary>
|
||||
/// <returns>是否有活动选项</returns>
|
||||
public bool HasActiveOptions()
|
||||
{
|
||||
return _choiceBox != null && _choiceBox.activeSelf;
|
||||
}
|
||||
|
||||
public void OnLocalizationChanged(string value)
|
||||
{
|
||||
_textParam = JsonUtil.ReadBeanByText<TextParam>(value);
|
||||
|
||||
var tmp = _dialogText.GetComponent<TMP_Text>();
|
||||
// 修改对话文本
|
||||
tmp.characterSpacing = _textParam.charSpace;
|
||||
_actorName.characterSpacing = _textParam.charSpace;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -32,7 +32,6 @@ namespace AibisDream
|
||||
|
||||
private bool _isNextAutoSkip;
|
||||
private bool _isNextBlocked;
|
||||
private bool _isProcessingOptions; // 标记是否正在处理选项
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -85,7 +84,7 @@ namespace AibisDream
|
||||
AddDialogueLine));
|
||||
_rmvList.Add(
|
||||
EnumEventSystem.Global.Register<DialogEventEnum, DialogText>(DialogEventEnum.OptionSelected,
|
||||
OnOptionSelected));
|
||||
AddDialogueLine));
|
||||
_rmvList.Add(EnumEventSystem.Global.Register(EventEnum.NextYarn, CleanDialogHistory));
|
||||
|
||||
// 文本显示事件
|
||||
@@ -143,12 +142,6 @@ namespace AibisDream
|
||||
_autoNext = null;
|
||||
}
|
||||
|
||||
private void OnOptionSelected(DialogText dialogText)
|
||||
{
|
||||
_isProcessingOptions = false; // 清除处理选项的标志
|
||||
AddDialogueLine(dialogText); // 记录选项
|
||||
}
|
||||
|
||||
public override void OnSingletonDestroy()
|
||||
{
|
||||
// 销毁前处理事件
|
||||
@@ -240,8 +233,6 @@ namespace AibisDream
|
||||
|
||||
public void ShowOptions(DialogOption[] dialogueOptions)
|
||||
{
|
||||
_isProcessingOptions = true; // 设置正在处理选项的标志
|
||||
|
||||
var viewType = dialogueOptions[0].Character.dialogViewType;
|
||||
// 根据状况选择不同的选择框
|
||||
if (viewType == DialogViewType.Default)
|
||||
@@ -277,7 +268,6 @@ namespace AibisDream
|
||||
|
||||
public void HideDialog()
|
||||
{
|
||||
_isProcessingOptions = false; // 清除处理选项的标志
|
||||
_showingView?.HideDialog();
|
||||
}
|
||||
|
||||
@@ -293,7 +283,6 @@ namespace AibisDream
|
||||
|
||||
public void NextStep()
|
||||
{
|
||||
_isProcessingOptions = false; // 清除处理选项的标志
|
||||
var view = _showingView;
|
||||
_hideDialog = ActionKit.Delay(autoHideDuration, () =>
|
||||
{
|
||||
@@ -307,32 +296,6 @@ namespace AibisDream
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 检查当前是否有活动的选项显示
|
||||
/// </summary>
|
||||
/// <returns>是否有活动选项</returns>
|
||||
public bool HasActiveOptions()
|
||||
{
|
||||
// 如果正在处理选项,返回true
|
||||
if (_isProcessingOptions)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// 检查当前显示的对话框是否有选项
|
||||
if (_showingView != null)
|
||||
{
|
||||
// 通过反射检查当前对话框是否有选项显示
|
||||
var hasOptionsMethod = _showingView.GetType().GetMethod("HasActiveOptions",
|
||||
System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
|
||||
if (hasOptionsMethod != null)
|
||||
{
|
||||
return (bool)hasOptionsMethod.Invoke(_showingView, null);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void SwitchDialogView(DialogViewType dialogViewType)
|
||||
{
|
||||
if (_dialogViewDict.TryGetValue(dialogViewType, out var view))
|
||||
|
||||
Reference in New Issue
Block a user