Unity中LocalizeStringEvent动态更新本地化文本失效问题排查
问题原因分析
- LocalizedString实例频繁重建导致监听失效:每次调用
SetWorldMessage都新建LocalizedString对象,原有的与TextMeshPro的绑定监听会因实例替换中断,即便worldMessageEvent内部字符串已更新,也无法通知TextMeshPro刷新显示。 - TextMeshPro未绑定LocalizedString的更新事件:若
worldMessageEvent未将TextMeshPro组件与LocalizedString的StringChanged事件关联,仅设置StringReference无法触发UI自动同步。
优雅解决方案
方案1:复用LocalizedString实例(推荐)
避免重复创建实例,通过复用同一LocalizedString对象维护绑定关系,仅更新key和参数:
// 类成员变量,复用同一个LocalizedString实例 private LocalizedString _worldLocalizedString; private void Awake() { // 初始化LocalizedString,绑定表格引用 _worldLocalizedString = new LocalizedString(TABLE_REFERENCE, string.Empty); // 订阅字符串变更事件,自动同步到TextMeshPro _worldLocalizedString.StringChanged += UpdateWorldMessageText; // 将复用实例赋值给事件的StringReference worldMessageEvent.StringReference = _worldLocalizedString; } private void UpdateWorldMessageText(string updatedText) { // 更新关联的TextMeshProUGUI组件文本 worldMessageEvent.GetComponent<TextMeshProUGUI>().text = updatedText; } private void SetWorldMessage(string key) { // 更新本地化key _worldLocalizedString.TableEntryReference = key; // 清空旧参数并添加新参数 _worldLocalizedString.Arguments.Clear(); _worldLocalizedString.Arguments.Add(WORLD_MESSAGE_ARGUMENT, currentWave); // 触发字符串刷新 _worldLocalizedString.RefreshString(); }
方案2:兼容现有逻辑的强制刷新
若不想修改实例复用逻辑,可在刷新字符串后主动触发TextMeshPro的UI更新,比直接赋值更贴合本地化系统用法:
private void SetWorldMessage(string key) { LocalizedString localizedString = new(TABLE_REFERENCE, key) { { WORLD_MESSAGE_ARGUMENT, currentWave } }; worldMessageEvent.StringReference = localizedString; worldMessageEvent.StringReference.RefreshString(); // 主动获取关联组件并刷新UI var textMesh = worldMessageEvent.GetComponent<TextMeshProUGUI>(); if (textMesh != null) { textMesh.text = worldMessageEvent.StringReference.GetLocalizedString(); textMesh.ForceMeshUpdate(); } }
方案3:检查Unity Localization系统配置
- 确保
LocalizationSettings已正确配置,本地化表格加载正常。 - 若
worldMessageEvent是LocalizeStringEvent组件,确认已绑定目标TextMeshProUGUI——该组件会自动订阅StringChanged事件并更新UI,无需手动处理。
内容的提问来源于stack exchange,提问作者Xetiam
相关产品推荐
相关产品推荐

