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 _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(); 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.OptionSelected, OnOptionSelected); } private void OnDisable() { EnumEventSystem.Global.UnRegister( DialogEventEnum.OptionSelected, OnOptionSelected); } } }