标记 #option_prompt 的台词不再进入普通台词流程,由 OptionView 暂存并在下一组 Dream Options 出现时显示在选项上方,同时通过 新增 LineHistoryAppend 事件加入对话历史。OnelineOptions 支持 提示语文本与独立选项根节点,并改为按实例追踪销毁按钮。
113 lines
3.4 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|