好多新内容
This commit is contained in:
@@ -84,6 +84,9 @@ public static class LocalizationService
|
||||
return results;
|
||||
}
|
||||
|
||||
// Addressables/LocalizationSettings 是否已完成初始化(与基础初始化分离)。
|
||||
private static bool _settingsInitialized;
|
||||
|
||||
public static void EnsureInitialized()
|
||||
{
|
||||
if (_initialized)
|
||||
@@ -98,14 +101,41 @@ public static class LocalizationService
|
||||
return;
|
||||
}
|
||||
|
||||
// 只做"安全的同步基础初始化":语言偏好 + 运行时回退包(从 StreamingAssets 读)。
|
||||
// Get()/TryGet() 会先查表、查不到再走这些回退包,所以此时本地化已可用。
|
||||
_currentLanguageCode = NormalizeLanguageCode(PlayerPrefs.GetString(LanguagePrefKey, ResolveStartupLanguageCode()));
|
||||
PlayerPrefs.SetString(LanguagePrefKey, _currentLanguageCode);
|
||||
PlayerPrefs.Save();
|
||||
LoadRuntimeFallbackPack(DefaultLanguageCode);
|
||||
LoadRuntimeFallbackPack("en-US");
|
||||
|
||||
_initialized = true;
|
||||
}
|
||||
|
||||
// 关键(修复启动死锁):绝不在此处同步 WaitForCompletion 等 Addressables 初始化。
|
||||
// 该方法可能在 [RuntimeInitializeOnLoadMethod(BeforeSceneLoad)] 阶段被调用,
|
||||
// 此时引擎主循环尚未运行,WaitForCompletion 会自旋泵送 Addressables 异步链,
|
||||
// 而其 continuation 需要主线程/尚未就绪的子系统 → WaitOnAddress 永远等不到信号而死锁。
|
||||
// 改为把 LocalizationSettings 初始化推迟到引擎就绪后(EnsureLocalizationSettingsInitialized)。
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 初始化 Unity Localization(Addressables 表数据库)。必须在引擎主循环运行后调用
|
||||
/// (如首帧协程 / 场景加载后),不能在 BeforeSceneLoad 同步阶段调用,否则死锁。
|
||||
/// 未完成前,本地化走运行时回退包,不影响 Get() 可用性。
|
||||
/// </summary>
|
||||
public static void EnsureLocalizationSettingsInitialized()
|
||||
{
|
||||
if (_settingsInitialized) return;
|
||||
|
||||
lock (SyncRoot)
|
||||
{
|
||||
if (_settingsInitialized) return;
|
||||
if (!_initialized) EnsureInitialized();
|
||||
|
||||
if (LocalizationSettings.HasSettings)
|
||||
{
|
||||
// 引擎已就绪,此时 WaitForCompletion 安全(异步链能被正常泵送完成)。
|
||||
LocalizationSettings.InitializeSynchronously = true;
|
||||
var init = LocalizationSettings.InitializationOperation;
|
||||
if (!init.IsDone)
|
||||
@@ -123,13 +153,15 @@ public static class LocalizationService
|
||||
ApplySelectedLocale(_currentLanguageCode, savePreference: true, notifyListeners: false);
|
||||
}
|
||||
|
||||
_initialized = true;
|
||||
_settingsInitialized = true;
|
||||
}
|
||||
}
|
||||
|
||||
public static void SetLanguage(string languageCode)
|
||||
{
|
||||
EnsureInitialized();
|
||||
// 运行时切换语言由 UI 触发(引擎已就绪),此处确保 Localization 设置已初始化,安全。
|
||||
EnsureLocalizationSettingsInitialized();
|
||||
string normalized = NormalizeLanguageCode(languageCode);
|
||||
if (string.Equals(_currentLanguageCode, normalized, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user