我正在尝试使用自定义实现来扩展 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”,依此类推。即使设置了文本属性,它也不会更新检查器中的文本字段,直到摆弄组件。
我有两个问题,首先,根据评论,我正在设置文本字段,而它需要是序列化属性。
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 的末尾,但在这种情况下,需要在使用之前检查更新属性。