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()