98 lines
3.5 KiB
C#
98 lines
3.5 KiB
C#
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;
|
||
}
|
||
}
|
||
}
|