diff --git a/Runtime/OverrideUI/XericStyleButton.cs b/Runtime/OverrideUI/XericStyleButton.cs
index fd8c5b7..0a24157 100644
--- a/Runtime/OverrideUI/XericStyleButton.cs
+++ b/Runtime/OverrideUI/XericStyleButton.cs
@@ -54,13 +54,30 @@ namespace XericUI.OverrideUI
{
base.OnEnable();
+ RevalidateStyles();
+
+ StyleRefreshManager.Register(this);
+ ApplyForState(m_CurrentState);
+ }
+
+#if UNITY_EDITOR
+ protected override void OnValidate()
+ {
+ base.OnValidate();
+ RevalidateStyles();
+ ApplyForState(m_CurrentState);
+ }
+#endif
+
+ private void RevalidateStyles()
+ {
+ m_ColorState?.UnsubscribeAll(OnStyleChanged);
+ m_TextureState?.UnsubscribeAll(OnStyleChanged);
+
m_ColorState?.RegisterAll();
m_TextureState?.RegisterAll();
m_ColorState?.SubscribeAll(OnStyleChanged);
m_TextureState?.SubscribeAll(OnStyleChanged);
-
- StyleRefreshManager.Register(this);
- ApplyForState(m_CurrentState);
}
protected override void OnDisable()
diff --git a/Runtime/OverrideUI/XericStyleImage.cs b/Runtime/OverrideUI/XericStyleImage.cs
index 8587b90..5222b58 100644
--- a/Runtime/OverrideUI/XericStyleImage.cs
+++ b/Runtime/OverrideUI/XericStyleImage.cs
@@ -56,6 +56,21 @@ namespace XericUI.OverrideUI
ApplyAllStyles();
}
+#if UNITY_EDITOR
+ /// 编辑器下属性变更时即刻刷新(路径从空变为有效等场景)
+ protected override void OnValidate()
+ {
+ base.OnValidate();
+ if (!m_AutoRefresh) return;
+
+ RegisterIfValid(m_ColorStyle);
+ RegisterIfValid(m_TextureStyle);
+ RegisterIfValid(m_MaterialStyle);
+
+ ApplyAllStyles();
+ }
+#endif
+
protected override void OnDisable()
{
UnregisterIfValid(m_ColorStyle);
@@ -70,6 +85,8 @@ namespace XericUI.OverrideUI
if (field == null) return;
// 路径为空说明未在 Inspector 中配置,跳过注册避免空路径查询错误
if (string.IsNullOrEmpty(field.StylePath)) return;
+ // 先退订再注册,防止 OnValidate 重复调用导致双重订阅
+ field.Member.OnValueChanged -= OnStyleChanged;
field.Register();
field.Member.OnValueChanged += OnStyleChanged;
}
diff --git a/Runtime/OverrideUI/XericStyleToggle.cs b/Runtime/OverrideUI/XericStyleToggle.cs
index 30a3fcf..a1f0173 100644
--- a/Runtime/OverrideUI/XericStyleToggle.cs
+++ b/Runtime/OverrideUI/XericStyleToggle.cs
@@ -74,6 +74,33 @@ namespace XericUI.OverrideUI
{
base.OnEnable();
+ RevalidateStyles();
+
+ StyleRefreshManager.Register(this);
+ onValueChanged.AddListener(OnToggleValueChanged);
+ ApplyForState(m_CurrentState);
+ }
+
+#if UNITY_EDITOR
+ /// 编辑器下属性变更时即刻刷新(路径从空变为有效等场景)
+ protected override void OnValidate()
+ {
+ base.OnValidate();
+ RevalidateStyles();
+ ApplyForState(m_CurrentState);
+ }
+#endif
+
+ /// 重新注册/订阅所有 StyleField(供 OnEnable 和 OnValidate 共用)
+ private void RevalidateStyles()
+ {
+ // 先退订防止双重订阅
+ m_ColorState?.UnsubscribeAll(OnStyleChanged);
+ m_TextureState?.UnsubscribeAll(OnStyleChanged);
+ m_OnOverrideColor.Member.OnValueChanged -= OnStyleChanged;
+ m_OnOverrideTexture.Member.OnValueChanged -= OnStyleChanged;
+ m_CheckmarkStyle.Member.OnValueChanged -= OnStyleChanged;
+
m_ColorState?.RegisterAll();
m_TextureState?.RegisterAll();
m_ColorState?.SubscribeAll(OnStyleChanged);
@@ -85,10 +112,6 @@ namespace XericUI.OverrideUI
m_OnOverrideTexture.Member.OnValueChanged += OnStyleChanged;
m_CheckmarkStyle?.Register();
m_CheckmarkStyle.Member.OnValueChanged += OnStyleChanged;
-
- StyleRefreshManager.Register(this);
- onValueChanged.AddListener(OnToggleValueChanged);
- ApplyForState(m_CurrentState);
}
protected override void OnDisable()