NodeScript+ 导入了个 UI Extend
Signed-off-by: TRADER_FOER <lhf190@outlook.com>
This commit is contained in:
97
Assets/Scripts/Editor Tools/NodeScript/NodeUIBuilder.cs
Normal file
97
Assets/Scripts/Editor Tools/NodeScript/NodeUIBuilder.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user