超级爆改

This commit is contained in:
SoulliesOfficial
2026-03-22 12:05:32 -04:00
parent f28bc68518
commit 731726239a
1959 changed files with 8890135 additions and 2222 deletions

View File

@@ -25,10 +25,24 @@ namespace Ichni.Editor
public HsvDrawer hsvDrawer;
private UnityAction customAction;
public override void Initialize(IBaseElement baseElement, string title, string parameterName)
{
base.Initialize(baseElement, title, parameterName);
Color baseColor = (Color)connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement); //获取对应变量的值
Color baseColor = (Color)connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement);
// [对象池安全] 只清除我们的自定义监听器,完全保全 UI 的预定义特效。
sliderR.onValueChanged.RemoveListener(SliderChange);
sliderG.onValueChanged.RemoveListener(SliderChange);
sliderB.onValueChanged.RemoveListener(SliderChange);
sliderA.onValueChanged.RemoveListener(SliderChange);
inputFieldBaseR.onEndEdit.RemoveListener(OnEndEditNode);
inputFieldBaseG.onEndEdit.RemoveListener(OnEndEditNode);
inputFieldBaseB.onEndEdit.RemoveListener(OnEndEditNode);
inputFieldBaseA.onEndEdit.RemoveListener(OnEndEditNode);
customAction = null;
inputFieldBaseR.text = baseColor.r.ToString();
inputFieldBaseG.text = baseColor.g.ToString();
inputFieldBaseB.text = baseColor.b.ToString();
@@ -41,20 +55,24 @@ namespace Ichni.Editor
sliderG.onValueChanged.AddListener(SliderChange);
sliderB.onValueChanged.AddListener(SliderChange);
sliderA.onValueChanged.AddListener(SliderChange);
inputFieldBaseR.onEndEdit.AddListener(_ => ApplyParameters());
inputFieldBaseG.onEndEdit.AddListener(_ => ApplyParameters());
inputFieldBaseB.onEndEdit.AddListener(_ => ApplyParameters());
inputFieldBaseA.onEndEdit.AddListener(_ => ApplyParameters());
inputFieldBaseR.onEndEdit.AddListener(OnEndEditNode);
inputFieldBaseG.onEndEdit.AddListener(OnEndEditNode);
inputFieldBaseB.onEndEdit.AddListener(OnEndEditNode);
inputFieldBaseA.onEndEdit.AddListener(OnEndEditNode);
colorPreview.color = baseColor;
}
private void OnEndEditNode(string str)
{
ApplyParameters();
}
private void ApplyParameters()
{
Color newValue = new Color(float.Parse(inputFieldBaseR.text), float.Parse(inputFieldBaseG.text),
float.Parse(inputFieldBaseB.text), float.Parse(inputFieldBaseA.text));
ReflectionHelper.SetDeepValue(connectedBaseElement, parameterName, newValue);
Ichni.Editor.Commands.CommandManager.ExecuteCommand(new Ichni.Editor.Commands.ChangeValueCommand(connectedBaseElement, parameterName, newValue));
colorPreview.color = newValue;
connectedBaseElement.Refresh();
// 同步到HSV轮盘
@@ -62,6 +80,7 @@ namespace Ichni.Editor
{
hsvDrawer.SyncFromBaseElement();
}
customAction?.Invoke();
}
public void SliderChange(float value)
@@ -89,16 +108,7 @@ namespace Ichni.Editor
public override DynamicUIElement AddListenerFunction(UnityAction action)
{
inputFieldBaseR.onEndEdit.AddListener(_ => action());
inputFieldBaseG.onEndEdit.AddListener(_ => action());
inputFieldBaseB.onEndEdit.AddListener(_ => action());
inputFieldBaseA.onEndEdit.AddListener(_ => action());
sliderR.onValueChanged.AddListener(_ => action());
sliderG.onValueChanged.AddListener(_ => action());
sliderB.onValueChanged.AddListener(_ => action());
sliderA.onValueChanged.AddListener(_ => action());
customAction += action;
return this;
}
private void Update()

View File

@@ -22,18 +22,31 @@ namespace Ichni.Editor
this.buttonText.text = buttonText;
}
private UnityAction customAction;
private UnityAction appliedFunction;
public void ApplyFunction(UnityAction function)
{
button.onClick.AddListener(function);
if (connectedBaseElement != null)
{
button.onClick.AddListener(connectedBaseElement.Refresh);
}
// [对象池安全] 改为只清除我们自己挂载的动作,避免杀掉预制体内置的动效
if (appliedFunction != null) button.onClick.RemoveListener(appliedFunction);
button.onClick.RemoveListener(OnButtonClick);
customAction = null;
appliedFunction = function;
button.onClick.AddListener(appliedFunction);
button.onClick.AddListener(OnButtonClick);
}
private void OnButtonClick()
{
if (connectedBaseElement != null) connectedBaseElement.Refresh();
customAction?.Invoke();
}
public override DynamicUIElement AddListenerFunction(UnityAction action)
{
button.onClick.AddListener(action);
customAction += action;
return this;
}
}

View File

@@ -48,8 +48,12 @@ namespace Ichni.Editor
toggleEnableEmission.gameObject.SetActive(false);
}
Color emissionColor = (Color)connectedBaseElement.GetType().GetField(colorParameterName).GetValue(connectedBaseElement);
float emissionIntensity = (float)connectedBaseElement.GetType().GetField(emissionIntensityName).GetValue(connectedBaseElement);
Color emissionColor = (Color)ReflectionHelper.GetDeepValue(connectedBaseElement, colorParameterName);
float emissionIntensity = 1f;
if (emissionIntensityName != "NULL")
emissionIntensity = (float)ReflectionHelper.GetDeepValue(connectedBaseElement, emissionIntensityName);
else
emissionIntensity = emissionColor.a;
inputFieldEmissionR.text = emissionColor.r.ToString();
inputFieldEmissionG.text = emissionColor.g.ToString();
@@ -80,10 +84,18 @@ namespace Ichni.Editor
if (canDisableEmission)
{
ReflectionHelper.SetDeepValue(connectedBaseElement, emissionEnabledName, enableEmission);
Ichni.Editor.Commands.CommandManager.ExecuteCommand(new Ichni.Editor.Commands.ChangeValueCommand(connectedBaseElement, emissionEnabledName, enableEmission));
}
ReflectionHelper.SetDeepValue(connectedBaseElement, colorParameterName, emissionColor);
ReflectionHelper.SetDeepValue(connectedBaseElement, emissionIntensityName, emissionIntensity);
if (emissionIntensityName != "NULL")
{
Ichni.Editor.Commands.CommandManager.ExecuteCommand(new Ichni.Editor.Commands.ChangeValueCommand(connectedBaseElement, emissionIntensityName, emissionIntensity));
}
else
{
emissionColor.a = emissionIntensity; // 退行赋值给 Alpha 通道
}
Ichni.Editor.Commands.CommandManager.ExecuteCommand(new Ichni.Editor.Commands.ChangeValueCommand(connectedBaseElement, colorParameterName, emissionColor));
colorPreview.color = emissionColor;
//connectedBaseElement.Refresh();
}

View File

@@ -47,7 +47,7 @@ namespace Ichni.Editor
private void ApplyParameters(int value)
{
ReflectionHelper.SetDeepValue(connectedBaseElement, parameterName, value);
Ichni.Editor.Commands.CommandManager.ExecuteCommand(new Ichni.Editor.Commands.ChangeValueCommand(connectedBaseElement, parameterName, value));
connectedBaseElement.Refresh();
}

View File

@@ -13,16 +13,32 @@ namespace Ichni.Editor
public TMP_InputField inputField;
public bool isAutoUpdate { get; set; }
public bool isReceiving { get; set; }
private UnityAction<string> customAction;
public override void Initialize(IBaseElement baseElement, string title, string parameterName)
{
// [对象池安全]
inputField.onEndEdit.RemoveListener(OnEndEditNode);
inputField.onSelect.RemoveListener(OnSelectNode);
inputField.onDeselect.RemoveListener(OnDeselectNode);
customAction = null;
base.Initialize(baseElement, title, parameterName);
if (parameterName != string.Empty)
{
ApplyContent();
inputField.onEndEdit.AddListener(ApplyParameters);
inputField.onEndEdit.AddListener(OnEndEditNode);
}
}
private void OnEndEditNode(string str)
{
ApplyParameters(str);
customAction?.Invoke(str);
}
private void OnSelectNode(string str) { isReceiving = false; }
private void OnDeselectNode(string str) { isReceiving = true; }
private void Update()
{
@@ -44,8 +60,11 @@ namespace Ichni.Editor
isAutoUpdate = enable;
isReceiving = true;
inputField.onSelect.AddListener(_ => isReceiving = false);
inputField.onDeselect.AddListener(_ => isReceiving = true);
inputField.onSelect.RemoveListener(OnSelectNode);
inputField.onSelect.AddListener(OnSelectNode);
inputField.onDeselect.RemoveListener(OnDeselectNode);
inputField.onDeselect.AddListener(OnDeselectNode);
}
public void ApplyContent()
@@ -89,14 +108,14 @@ namespace Ichni.Editor
}
if (value != null)
{
ReflectionHelper.SetDeepValue(connectedBaseElement, parameterName, value);
Ichni.Editor.Commands.CommandManager.ExecuteCommand(new Ichni.Editor.Commands.ChangeValueCommand(connectedBaseElement, parameterName, value));
}
connectedBaseElement.Refresh();
}
public override DynamicUIElement AddListenerFunction(UnityAction action)
{
inputField.onEndEdit.AddListener(_ => action());
customAction += _ => action();
return this;
}
}

View File

@@ -74,7 +74,7 @@ namespace Ichni.Editor
private void ApplyParameters(string value)
{
ReflectionHelper.SetDeepValue(connectedBaseElement, parameterName, value);
Ichni.Editor.Commands.CommandManager.ExecuteCommand(new Ichni.Editor.Commands.ChangeValueCommand(connectedBaseElement, parameterName, value));
connectedBaseElement.Refresh();
}

View File

@@ -11,30 +11,54 @@ namespace Ichni.Editor
{
public Toggle toggle;
private UnityAction<bool> customAction;
public override void Initialize(IBaseElement baseElement, string title, string parameterName)
{
// [对象池安全] 精准解绑业务代理,不动预制体原生的展示事件!
toggle.onValueChanged.RemoveListener(OnToggleValueChanged);
customAction = null;
base.Initialize(baseElement, title, parameterName);
if (parameterName != string.Empty)
{
toggle.isOn = (bool)ReflectionHelper.GetDeepValue(connectedBaseElement, parameterName);
toggle.onValueChanged.AddListener(ApplyParameters);
var val = ReflectionHelper.GetDeepValue(connectedBaseElement, parameterName);
if (val != null)
{
toggle.isOn = (bool)val;
}
else
{
Debug.LogWarning($"[DynamicUI] 尝试绑定 {title} ({parameterName}) 失败,由于其值或路径无效。");
toggle.isOn = false;
}
toggle.onValueChanged.AddListener(OnToggleValueChanged);
}
else
{
toggle.isOn = false;
toggle.onValueChanged.AddListener(OnToggleValueChanged);
}
}
private void OnToggleValueChanged(bool value)
{
if (parameterName != string.Empty)
{
ApplyParameters(value);
}
customAction?.Invoke(value);
}
private void ApplyParameters(bool value)
{
ReflectionHelper.SetDeepValue(connectedBaseElement, parameterName, value);
Ichni.Editor.Commands.CommandManager.ExecuteCommand(new Ichni.Editor.Commands.ChangeValueCommand(connectedBaseElement, parameterName, value));
connectedBaseElement.Refresh();
}
public override DynamicUIElement AddListenerFunction(UnityAction action)
{
toggle.onValueChanged.AddListener(_ => action());
customAction += _ => action();
return this;
}
}

View File

@@ -16,6 +16,8 @@ namespace Ichni.Editor
public bool isAutoUpdate { get; set; }
public bool isReceiving { get; set; }
private UnityAction<string> customAction;
public override void Initialize(IBaseElement baseElement, string title, string parameterName)
{
base.Initialize(baseElement, title, parameterName);
@@ -23,11 +25,24 @@ namespace Ichni.Editor
{
ApplyContent();
inputFieldX.onEndEdit.AddListener(_ => ApplyParameters());
inputFieldY.onEndEdit.AddListener(_ => ApplyParameters());
// [对象池安全]
inputFieldX.onEndEdit.RemoveListener(OnEndEditNode);
inputFieldY.onEndEdit.RemoveListener(OnEndEditNode);
customAction = null;
inputFieldX.onEndEdit.AddListener(OnEndEditNode);
inputFieldY.onEndEdit.AddListener(OnEndEditNode);
}
}
private void OnEndEditNode(string str)
{
ApplyParameters();
customAction?.Invoke(str);
}
private void OnSelectNode(string str) { isReceiving = false; }
private void OnDeselectNode(string str) { isReceiving = true; }
private void Update()
{
(this as IHaveAutoUpdate).UpdateContent();
@@ -75,11 +90,15 @@ namespace Ichni.Editor
isAutoUpdate = enable;
isReceiving = true;
inputFieldX.onSelect.AddListener(_ => isReceiving = false);
inputFieldY.onSelect.AddListener(_ => isReceiving = false);
inputFieldX.onSelect.RemoveListener(OnSelectNode);
inputFieldY.onSelect.RemoveListener(OnSelectNode);
inputFieldX.onSelect.AddListener(OnSelectNode);
inputFieldY.onSelect.AddListener(OnSelectNode);
inputFieldX.onDeselect.AddListener(_ => isReceiving = true);
inputFieldY.onDeselect.AddListener(_ => isReceiving = true);
inputFieldX.onDeselect.RemoveListener(OnDeselectNode);
inputFieldY.onDeselect.RemoveListener(OnDeselectNode);
inputFieldX.onDeselect.AddListener(OnDeselectNode);
inputFieldY.onDeselect.AddListener(OnDeselectNode);
}
public void ApplyContent()
@@ -92,14 +111,13 @@ namespace Ichni.Editor
private void ApplyParameters()
{
Vector2 newValue = new Vector2(float.Parse(inputFieldX.text), float.Parse(inputFieldY.text));
ReflectionHelper.SetDeepValue(connectedBaseElement, parameterName, newValue);
Ichni.Editor.Commands.CommandManager.ExecuteCommand(new Ichni.Editor.Commands.ChangeValueCommand(connectedBaseElement, parameterName, newValue));
connectedBaseElement.Refresh();
}
public override DynamicUIElement AddListenerFunction(UnityAction action)
{
inputFieldX.onEndEdit.AddListener(_ => action());
inputFieldY.onEndEdit.AddListener(_ => action());
customAction += _ => action();
return this;
}
}

View File

@@ -19,6 +19,8 @@ namespace Ichni.Editor
public bool isAutoUpdate { get; set; }
public bool isReceiving { get; set; }
private UnityAction<string> customAction;
public override void Initialize(IBaseElement baseElement, string title, string parameterName)
{
base.Initialize(baseElement, title, parameterName);
@@ -26,12 +28,26 @@ namespace Ichni.Editor
{
ApplyContent();
inputFieldX.onEndEdit.AddListener(_ => ApplyParameters());
inputFieldY.onEndEdit.AddListener(_ => ApplyParameters());
inputFieldZ.onEndEdit.AddListener(_ => ApplyParameters());
// [对象池安全]
inputFieldX.onEndEdit.RemoveListener(OnEndEditNode);
inputFieldY.onEndEdit.RemoveListener(OnEndEditNode);
inputFieldZ.onEndEdit.RemoveListener(OnEndEditNode);
customAction = null;
inputFieldX.onEndEdit.AddListener(OnEndEditNode);
inputFieldY.onEndEdit.AddListener(OnEndEditNode);
inputFieldZ.onEndEdit.AddListener(OnEndEditNode);
}
}
private void OnEndEditNode(string str)
{
ApplyParameters();
customAction?.Invoke(str);
}
private void OnSelectNode(string str) { isReceiving = false; }
private void OnDeselectNode(string str) { isReceiving = true; }
private void Update()
{
(this as IHaveAutoUpdate).UpdateContent();
@@ -87,13 +103,19 @@ namespace Ichni.Editor
isAutoUpdate = enable;
isReceiving = true;
inputFieldX.onSelect.AddListener(_ => isReceiving = false);
inputFieldY.onSelect.AddListener(_ => isReceiving = false);
inputFieldZ.onSelect.AddListener(_ => isReceiving = false);
inputFieldX.onSelect.RemoveListener(OnSelectNode);
inputFieldY.onSelect.RemoveListener(OnSelectNode);
inputFieldZ.onSelect.RemoveListener(OnSelectNode);
inputFieldX.onSelect.AddListener(OnSelectNode);
inputFieldY.onSelect.AddListener(OnSelectNode);
inputFieldZ.onSelect.AddListener(OnSelectNode);
inputFieldX.onDeselect.AddListener(_ => isReceiving = true);
inputFieldY.onDeselect.AddListener(_ => isReceiving = true);
inputFieldZ.onDeselect.AddListener(_ => isReceiving = true);
inputFieldX.onDeselect.RemoveListener(OnDeselectNode);
inputFieldY.onDeselect.RemoveListener(OnDeselectNode);
inputFieldZ.onDeselect.RemoveListener(OnDeselectNode);
inputFieldX.onDeselect.AddListener(OnDeselectNode);
inputFieldY.onDeselect.AddListener(OnDeselectNode);
inputFieldZ.onDeselect.AddListener(OnDeselectNode);
}
public void ApplyContent()
@@ -107,16 +129,13 @@ namespace Ichni.Editor
private void ApplyParameters()
{
Vector3 newValue = new Vector3(float.Parse(inputFieldX.text), float.Parse(inputFieldY.text), float.Parse(inputFieldZ.text));
ReflectionHelper.SetDeepValue(connectedBaseElement, parameterName, newValue);
Ichni.Editor.Commands.CommandManager.ExecuteCommand(new Ichni.Editor.Commands.ChangeValueCommand(connectedBaseElement, parameterName, newValue));
connectedBaseElement.Refresh();
}
public override DynamicUIElement AddListenerFunction(UnityAction action)
{
inputFieldX.onEndEdit.AddListener(_ => action());
inputFieldY.onEndEdit.AddListener(_ => action());
inputFieldZ.onEndEdit.AddListener(_ => action());
customAction += _ => action();
return this;
}
}