NodeScript+ 导入了个 UI Extend

Signed-off-by: TRADER_FOER <lhf190@outlook.com>
This commit is contained in:
2026-05-23 21:05:16 +08:00
parent 7ea1f1d8c3
commit 51878f15ae
531 changed files with 198095 additions and 144473 deletions

View File

@@ -0,0 +1,97 @@
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<int> 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<TMP_Dropdown>();
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<TMP_Text>();
if (lbl != null && lbl.transform != dd?.transform) lbl.text = label;
return this;
}
public NodeUIBuilder FloatField(string label, float defaultValue, Action<float> onChanged)
{
if (parent == null || inputPrefab == null) return this;
var go = UnityEngine.Object.Instantiate(inputPrefab, parent);
go.name = "inp_" + label;
var input = go.GetComponentInChildren<TMP_InputField>();
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<TMP_Text>();
if (lbl != null && lbl.transform != input?.transform) lbl.text = label;
return this;
}
/// <summary>类型选择下拉NodeConst / NodeCombine 用)</summary>
public NodeUIBuilder TypeDropdown(string[] options, int defaultIndex, Action<int> onChanged)
{
return Dropdown("Type", options, defaultIndex, onChanged);
}
/// <summary>Bool 开关NodeSelect 的 condition 备选)</summary>
public NodeUIBuilder Toggle(string label, bool defaultValue, Action<bool> onChanged)
{
if (parent == null || dropdownPrefab == null) return this;
var go = UnityEngine.Object.Instantiate(dropdownPrefab, parent);
go.name = "tgl_" + label;
var dd = go.GetComponentInChildren<TMP_Dropdown>();
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<TMP_Text>();
if (lbl != null && lbl.transform != dd?.transform) lbl.text = label;
return this;
}
}
}