超级爆改
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user