回复下

This commit is contained in:
2025-07-14 22:50:10 +08:00
parent ed067faad6
commit 9274281fcb
5 changed files with 7 additions and 120 deletions
+1 -43
View File
@@ -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)
+1 -10
View File
@@ -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);
+4 -11
View File
@@ -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))