修复表格中对样式的依赖与更新
This commit is contained in:
@@ -49,25 +49,39 @@ namespace XericUI.OverrideUI
|
||||
|
||||
if (!m_AutoRefresh) return;
|
||||
|
||||
m_ColorStyle?.Register();
|
||||
m_TextureStyle?.Register();
|
||||
m_MaterialStyle?.Register();
|
||||
m_ColorStyle.OnValueChanged += OnStyleChanged;
|
||||
m_TextureStyle.OnValueChanged += OnStyleChanged;
|
||||
m_MaterialStyle.OnValueChanged += OnStyleChanged;
|
||||
RegisterIfValid(m_ColorStyle);
|
||||
RegisterIfValid(m_TextureStyle);
|
||||
RegisterIfValid(m_MaterialStyle);
|
||||
|
||||
ApplyAllStyles();
|
||||
}
|
||||
|
||||
protected override void OnDisable()
|
||||
{
|
||||
if (m_ColorStyle != null) { m_ColorStyle.OnValueChanged -= OnStyleChanged; m_ColorStyle.Unregister(); }
|
||||
if (m_TextureStyle != null) { m_TextureStyle.OnValueChanged -= OnStyleChanged; m_TextureStyle.Unregister(); }
|
||||
if (m_MaterialStyle != null) { m_MaterialStyle.OnValueChanged -= OnStyleChanged; m_MaterialStyle.Unregister(); }
|
||||
UnregisterIfValid(m_ColorStyle);
|
||||
UnregisterIfValid(m_TextureStyle);
|
||||
UnregisterIfValid(m_MaterialStyle);
|
||||
|
||||
base.OnDisable();
|
||||
}
|
||||
|
||||
private void RegisterIfValid(StyleField field)
|
||||
{
|
||||
if (field == null) return;
|
||||
// 路径为空说明未在 Inspector 中配置,跳过注册避免空路径查询错误
|
||||
if (string.IsNullOrEmpty(field.StylePath)) return;
|
||||
field.Register();
|
||||
field.Member.OnValueChanged += OnStyleChanged;
|
||||
}
|
||||
|
||||
private void UnregisterIfValid(StyleField field)
|
||||
{
|
||||
if (field == null) return;
|
||||
if (string.IsNullOrEmpty(field.StylePath)) return;
|
||||
field.Member.OnValueChanged -= OnStyleChanged;
|
||||
field.Unregister();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 样式应用
|
||||
@@ -83,12 +97,12 @@ namespace XericUI.OverrideUI
|
||||
if (m_TextureStyle != null)
|
||||
{
|
||||
StyleValue val = m_TextureStyle.GetValue();
|
||||
Sprite sp = val?.GetValueAs<Sprite>();
|
||||
if (sp != null) { m_ResolvedSprite = sp; sprite = sp; }
|
||||
else
|
||||
if (val != null)
|
||||
{
|
||||
Texture2D tex = val?.GetValueAs<Texture2D>();
|
||||
if (tex != null)
|
||||
// 通过 Unity Object 基类获取并类型判断,抑制 Color→Object 转换的日志错误
|
||||
Object obj = SafeGetObject<Object>(val);
|
||||
if (obj is Sprite sp) { m_ResolvedSprite = sp; sprite = sp; }
|
||||
else if (obj is Texture2D tex)
|
||||
{
|
||||
m_ResolvedSprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f));
|
||||
sprite = m_ResolvedSprite;
|
||||
@@ -99,8 +113,11 @@ namespace XericUI.OverrideUI
|
||||
if (m_MaterialStyle != null)
|
||||
{
|
||||
StyleValue val = m_MaterialStyle.GetValue();
|
||||
Material mat = val?.GetValueAs<Material>();
|
||||
if (mat != null) material = mat;
|
||||
if (val != null)
|
||||
{
|
||||
Object obj = SafeGetObject<Object>(val);
|
||||
if (obj is Material mat) material = mat;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -112,6 +129,23 @@ namespace XericUI.OverrideUI
|
||||
|
||||
#endregion
|
||||
|
||||
#region 辅助
|
||||
|
||||
/// <summary>
|
||||
/// 安全获取 UnityEngine.Object 类型值——临时关闭日志以抑制 StyleValue 内部的类型不匹配错误。
|
||||
/// </summary>
|
||||
private static T SafeGetObject<T>(StyleValue val) where T : Object
|
||||
{
|
||||
if (val == null) return null;
|
||||
var logger = Debug.unityLogger;
|
||||
bool prev = logger.logEnabled;
|
||||
logger.logEnabled = false;
|
||||
try { return val.GetValueAs<T>(); }
|
||||
finally { logger.logEnabled = prev; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 组件替换
|
||||
|
||||
#if UNITY_EDITOR
|
||||
|
||||
@@ -80,11 +80,11 @@ namespace XericUI.OverrideUI
|
||||
m_TextureState?.SubscribeAll(OnStyleChanged);
|
||||
|
||||
m_OnOverrideColor?.Register();
|
||||
m_OnOverrideColor.OnValueChanged += OnStyleChanged;
|
||||
m_OnOverrideColor.Member.OnValueChanged += OnStyleChanged;
|
||||
m_OnOverrideTexture?.Register();
|
||||
m_OnOverrideTexture.OnValueChanged += OnStyleChanged;
|
||||
m_OnOverrideTexture.Member.OnValueChanged += OnStyleChanged;
|
||||
m_CheckmarkStyle?.Register();
|
||||
m_CheckmarkStyle.OnValueChanged += OnStyleChanged;
|
||||
m_CheckmarkStyle.Member.OnValueChanged += OnStyleChanged;
|
||||
|
||||
StyleRefreshManager.Register(this);
|
||||
onValueChanged.AddListener(OnToggleValueChanged);
|
||||
@@ -101,9 +101,9 @@ namespace XericUI.OverrideUI
|
||||
m_TextureState?.UnsubscribeAll(OnStyleChanged);
|
||||
m_ColorState?.UnregisterAll();
|
||||
m_TextureState?.UnregisterAll();
|
||||
if (m_OnOverrideColor != null) { m_OnOverrideColor.OnValueChanged -= OnStyleChanged; m_OnOverrideColor.Unregister(); }
|
||||
if (m_OnOverrideTexture != null) { m_OnOverrideTexture.OnValueChanged -= OnStyleChanged; m_OnOverrideTexture.Unregister(); }
|
||||
if (m_CheckmarkStyle != null) { m_CheckmarkStyle.OnValueChanged -= OnStyleChanged; m_CheckmarkStyle.Unregister(); }
|
||||
if (m_OnOverrideColor != null) { m_OnOverrideColor.Member.OnValueChanged -= OnStyleChanged; m_OnOverrideColor.Unregister(); }
|
||||
if (m_OnOverrideTexture != null) { m_OnOverrideTexture.Member.OnValueChanged -= OnStyleChanged; m_OnOverrideTexture.Unregister(); }
|
||||
if (m_CheckmarkStyle != null) { m_CheckmarkStyle.Member.OnValueChanged -= OnStyleChanged; m_CheckmarkStyle.Unregister(); }
|
||||
|
||||
base.OnDisable();
|
||||
}
|
||||
|
||||
@@ -75,27 +75,78 @@ namespace XericUI
|
||||
|
||||
|
||||
private XericImage m_ximage;
|
||||
private bool m_ximageCached;
|
||||
|
||||
protected XericImage ximage
|
||||
{
|
||||
get
|
||||
{
|
||||
if (m_ximageCached)
|
||||
return m_ximage;
|
||||
|
||||
if (m_ximage)
|
||||
{
|
||||
m_ximageCached = true;
|
||||
return m_ximage;
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
if (!graphic)
|
||||
{
|
||||
m_ximageCached = true;
|
||||
return null;
|
||||
}
|
||||
#endif
|
||||
m_ximage = graphic.GetComponent<XericImage>();
|
||||
m_ximageCached = true;
|
||||
if (m_ximage)
|
||||
return m_ximage;
|
||||
#if UNITY_EDITOR
|
||||
if (!graphic)
|
||||
return null;
|
||||
#endif
|
||||
m_ximage = graphic.GetComponent<XericImage>();
|
||||
if (m_ximage)
|
||||
return m_ximage;
|
||||
Debug.Log("请替换toggle的checkmark为XericImage以支持更多的功能");
|
||||
#endif
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private bool bindXImage;
|
||||
|
||||
#if UNITY_EDITOR
|
||||
protected override void OnEnable()
|
||||
{
|
||||
EnsureXericImageCheckmark();
|
||||
base.OnEnable();
|
||||
}
|
||||
|
||||
private void EnsureXericImageCheckmark()
|
||||
{
|
||||
if (graphic == null || graphic is XericImage) return;
|
||||
|
||||
var img = graphic as Image;
|
||||
if (img == null) return;
|
||||
|
||||
var go = img.gameObject;
|
||||
var sprite = img.sprite;
|
||||
var color = img.color;
|
||||
var material = img.material;
|
||||
var raycastTarget = img.raycastTarget;
|
||||
var type = img.type;
|
||||
|
||||
UnityEditor.Undo.DestroyObjectImmediate(img);
|
||||
var ximg = UnityEditor.Undo.AddComponent<XericImage>(go);
|
||||
ximg.sprite = sprite;
|
||||
ximg.color = color;
|
||||
ximg.material = material;
|
||||
ximg.raycastTarget = raycastTarget;
|
||||
ximg.type = type;
|
||||
UnityEditor.EditorUtility.SetDirty(go);
|
||||
#if dUI_TextMeshPro
|
||||
Debug.Log("已将 Toggle 的 Checkmark 自动替换为 XericImage,以支持更多功能");
|
||||
#else
|
||||
Debug.Log("已将 Toggle 的 Checkmark 自动替换为 XericImage");
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
protected override void InstantClearState()
|
||||
{
|
||||
base.InstantClearState();
|
||||
|
||||
Reference in New Issue
Block a user