using UnityEngine; using Yarn.Unity; using Sirenix.OdinInspector; namespace SLSUtilities.Narrative.UI { /// /// 高级选项展现层,继承自官方 OptionsPresenter。 /// public class AdvancedOptionsPresenter : OptionsPresenter { [TitleGroup("Advanced Settings", Alignment = TitleAlignments.Centered)] [BoxGroup("Advanced Settings/Prefabs")] [Required("需要指定 AdvancedOptionItem 预制体")] [SerializeField] private AdvancedOptionItem advancedOptionViewPrefab; public override YarnTask OnDialogueStartedAsync() { // 建立关键词缓存,保证 ProcessWithMarkup 能正确查找关键词数据 // (不依赖 AdvancedLinePresenter 是否已经运行) if (StorySystem.Database != null) KeywordProcessor.BuildCache(StorySystem.Database.keywords); return base.OnDialogueStartedAsync(); } public override YarnTask RunOptionsAsync(DialogueOption[] dialogueOptions, LineCancellationToken cancellationToken) { // 过滤掉不可用且带有 "hide" 或 "#hide" 标签的选项 var filteredOptions = new System.Collections.Generic.List(); foreach (var option in dialogueOptions) { bool shouldHide = false; if (!option.IsAvailable && option.Line != null && option.Line.Metadata != null) { foreach (var tag in option.Line.Metadata) { if (tag.Equals("hide", System.StringComparison.OrdinalIgnoreCase) || tag.Equals("#hide", System.StringComparison.OrdinalIgnoreCase)) { shouldHide = true; break; } } } if (!shouldHide) { filteredOptions.Add(option); } } return base.RunOptionsAsync(filteredOptions.ToArray(), cancellationToken); } protected override OptionItem CreateNewOptionView() { var targetTransform = canvasGroup != null ? canvasGroup.transform : this.transform; var optionView = Instantiate(advancedOptionViewPrefab, targetTransform, false); if (optionView == null) { Debug.LogError("Failed to instantiate advancedOptionViewPrefab."); return null; } optionView.transform.SetAsLastSibling(); optionView.gameObject.SetActive(false); return optionView; } } }