Files
dingyuntian c751a859ff feat(dialog): 添加梦境选项提示语支持
标记 #option_prompt 的台词不再进入普通台词流程,由 OptionView
暂存并在下一组 Dream Options 出现时显示在选项上方,同时通过
新增 LineHistoryAppend 事件加入对话历史。OnelineOptions 支持
提示语文本与独立选项根节点,并改为按实例追踪销毁按钮。
2026-07-19 00:00:17 +08:00

113 lines
3.4 KiB
C#

using System.Collections.Generic;
using AibisDream.Framework;
using TMPro;
using UnityEngine;
namespace AibisDream
{
public class OnelineOptions : MonoBehaviour
{
[SerializeField] private GameObject choiceButtonPrefab;
[SerializeField] private Transform optionsRoot;
[SerializeField] private bool showDisabledOptions;
[SerializeField] private GameObject optionPromptRoot;
[SerializeField] private TMP_Text optionPrompt;
private readonly List<GameObject> _choiceInstances = new();
private Transform OptionsRoot => optionsRoot != null ? optionsRoot : transform;
private GameObject OptionPromptRoot
{
get
{
if (optionPromptRoot != null)
return optionPromptRoot;
if (optionPrompt != null && optionPrompt.transform.parent != null)
return optionPrompt.transform.parent.gameObject;
return optionPrompt != null ? optionPrompt.gameObject : null;
}
}
public void ShowOptions(DialogOption[] dialogOptions, string optionPromptText = null)
{
gameObject.SetActive(true);
ClearOptionButtons();
ShowOptionPrompt(optionPromptText);
// 生成新按钮
foreach (var option in dialogOptions)
{
// 如果选项不可用且不显示不可用选项,则跳过
if (!option.IsAvailable && !showDisabledOptions) continue;
// 生成按钮
var choiceInstance = Instantiate(choiceButtonPrefab, OptionsRoot);
_choiceInstances.Add(choiceInstance);
var choiceButton = choiceInstance.GetComponent<OnelineOption>();
choiceButton.Init();
choiceButton.SetOption(option);
}
}
public void HideOptions()
{
ClearOptionButtons();
SetOptionPromptVisible(false);
}
private void ShowOptionPrompt(string optionPromptText)
{
var shouldShowPrompt = !string.IsNullOrWhiteSpace(optionPromptText);
if (shouldShowPrompt && optionPrompt != null)
{
optionPrompt.text = optionPromptText;
}
SetOptionPromptVisible(shouldShowPrompt);
}
private void SetOptionPromptVisible(bool visible)
{
var root = OptionPromptRoot;
if (root != null)
{
root.SetActive(visible);
}
}
private void ClearOptionButtons()
{
foreach (var choiceInstance in _choiceInstances)
{
if (choiceInstance != null)
{
Destroy(choiceInstance);
}
}
_choiceInstances.Clear();
}
private void OnOptionSelected(LineInfo _)
{
HideOptions();
}
private void OnEnable()
{
EnumEventSystem.Global.Register<DialogEventEnum, LineInfo>(
DialogEventEnum.OptionSelected,
OnOptionSelected);
}
private void OnDisable()
{
EnumEventSystem.Global.UnRegister<DialogEventEnum, LineInfo>(
DialogEventEnum.OptionSelected,
OnOptionSelected);
}
}
}