EditorGUI.EndChangeCheck 出现问题,观察到的字段尚未更新

问题描述 投票:0回答:1

我正在尝试使用自定义实现来扩展 TextMeshProUI。我用它扩展了编辑器,以便我可以跟踪一些更改

public class LocalizedTMP_UGUI : TextMeshProUGUI
{
    // Stripped code
    [SerializeField] private List<LocArgument> m_arguments;

    public void SetLocalizedText()
    {
        text = m_localizer.GetLocalization(m_localizationKey, m_arguments);
        ForceMeshUpdate();
    }
}
[Serializable]
public class LocArgument 
{
    public string name; 
    public string value;

    public LocArgument(string name, string value)
    {
        this.name = name;
        this.value = value;
    }
}

编辑器部分:

[CustomEditor(typeof(LocalizedTMP_UGUI))]
[CanEditMultipleObjects]
public class LocalizedTMP_UGUI_Editor : TMP_EditorPanelUI, ITMPEditor
{
    private SerializedProperty m_arguments;
    private string [] m_languages; 
    private int m_languageIndex = 0;
    private ILocalization m_localizer;

    // removed OnEnable

    public override void OnInspectorGUI()
    {
        serializedObject.Update();
        int languageIndex = EditorGUILayout.Popup(m_languageIndex, m_languages);
        if (languageIndex != m_languageIndex) 
        {
            m_localizer.SetWithLocale(m_languages[languageIndex]);
            SetText();
            m_languageIndex = languageIndex; 
        }
        EditorGUI.BeginChangeCheck();
        EditorGUILayout.PropertyField(m_arguments);
        if (EditorGUI.EndChangeCheck())
        {
            SetText();
        }
        serializedObject.ApplyModifiedProperties();
        base.OnInspectorGUI();
    }

    public void SetText() 
    {
        LocalizedTMP_UGUI targetComp = (LocalizedTMP_UGUI)target;
        targetComp.SetLocalizedText();
        Repaint();
    }
}

当我在 EditorGUILayout.Popup 中切换设置时,它会刷新文本。但是,如果我更改参数列表(值字段)的内容,它不会影响场景中显示的文本或组件的文本字段。不过,如果与检查器交互(例如折叠/展开列表),那么它会刷新并正确显示。

我注意到,在调试 SetLocalizedText 方法时,文本被分配一个字母延迟。因此,如果我开始输入“Hello”,那么当输入 H 时,它会显示“”,然后接下来输入 e,它将显示“H”,然后在输入 l 时显示“He”,依此类推。即使设置了文本属性,它也不会更新检查器中的文本字段,直到摆弄组件。

unity-game-engine textmeshpro
1个回答
0
投票

我有两个问题,首先,根据评论,我正在设置文本字段,而它需要是序列化属性。

private SerializedProperty m_text;

protected override void OnEnable()
{
    m_text = serializedObject.FindProperty("m_text");
}
public void SetText() 
{
    LocalizedTMP_UGUI targetComp = (LocalizedTMP_UGUI)target;
    m_text.stringValue = m_localizer.GetLocalization(targetComp.LocalizationKey, targetComp.Arguments.ToList());
    serializedObject.ApplyModifiedProperties();
}

第二个问题出现在以下位置,检查返回 true,但序列化对象仍需要更新

if(EditorGUI.EndChangeCheck())
{
    serializedObject.ApplyModifiedProperties();
    SetText();
}

ApplyModifiedProperty 通常放置在 OnInspectorGUI 的末尾,但在这种情况下,需要在使用之前检查更新属性。

© www.soinside.com 2019 - 2024. All rights reserved.