using System; using TMPro; using UnityEngine; using UnityEngine.UI; namespace Ichni.NodeScript { public class NodeUIBuilder { Transform parent; GameObject dropdownPrefab; GameObject inputPrefab; public NodeUIBuilder(Transform parent, GameObject dropdownPrefab, GameObject inputPrefab) { this.parent = parent; this.dropdownPrefab = dropdownPrefab; this.inputPrefab = inputPrefab; } public NodeUIBuilder Dropdown(string label, string[] options, int defaultIndex, Action onChanged) { if (parent == null || dropdownPrefab == null || options == null || options.Length == 0) return this; var go = UnityEngine.Object.Instantiate(dropdownPrefab, parent); go.name = "dd_" + label; var dd = go.GetComponentInChildren(); if (dd != null) { dd.ClearOptions(); foreach (var o in options) dd.options.Add(new TMP_Dropdown.OptionData(o)); dd.value = defaultIndex; dd.onValueChanged.AddListener(i => onChanged?.Invoke(i)); } var lbl = go.GetComponentInChildren(); if (lbl != null && lbl.transform != dd?.transform) lbl.text = label; return this; } public NodeUIBuilder FloatField(string label, float defaultValue, Action onChanged) { if (parent == null || inputPrefab == null) return this; var go = UnityEngine.Object.Instantiate(inputPrefab, parent); go.name = "inp_" + label; var input = go.GetComponentInChildren(); if (input != null) { input.text = defaultValue.ToString("0.##"); input.contentType = TMP_InputField.ContentType.DecimalNumber; input.onValueChanged.AddListener(s => { if (float.TryParse(s, out float v)) onChanged?.Invoke(v); }); } var lbl = go.GetComponentInChildren(); if (lbl != null && lbl.transform != input?.transform) lbl.text = label; return this; } /// 类型选择下拉(NodeConst / NodeCombine 用) public NodeUIBuilder TypeDropdown(string[] options, int defaultIndex, Action onChanged) { return Dropdown("Type", options, defaultIndex, onChanged); } /// Bool 开关(NodeSelect 的 condition 备选) public NodeUIBuilder Toggle(string label, bool defaultValue, Action onChanged) { if (parent == null || dropdownPrefab == null) return this; var go = UnityEngine.Object.Instantiate(dropdownPrefab, parent); go.name = "tgl_" + label; var dd = go.GetComponentInChildren(); if (dd != null) { dd.ClearOptions(); dd.options.Add(new TMP_Dropdown.OptionData("False")); dd.options.Add(new TMP_Dropdown.OptionData("True")); dd.value = defaultValue ? 1 : 0; dd.onValueChanged.AddListener(i => onChanged?.Invoke(i == 1)); } var lbl = go.GetComponentInChildren(); if (lbl != null && lbl.transform != dd?.transform) lbl.text = label; return this; } } }