好多新内容

This commit is contained in:
FloatGaming
2026-07-22 05:35:53 +08:00
parent b5d1cdcbc5
commit 15649d02f8
128 changed files with 5956 additions and 673 deletions
@@ -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))
{