Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections.Generic;
- using Cysharp.Threading.Tasks;
- using UnityEngine;
- using UnityEngine.Localization;
- using UnityEngine.Localization.Settings;
- using UnityEngine.AddressableAssets;
- using UnityEngine.ResourceManagement.AsyncOperations;
- using WayHeart.Infrastructure.State;
- using WayHeart.Service.Audio;
- using Constant;
- using WayHeart.Service.Loader;
- using TMPro;
- public class BootstrapState : IStateGame
- {
- private readonly GameStateMachine _gameStateMachine;
- private readonly AudioService _audioService;
- readonly AssetLoader _assetLoader;
- public BootstrapState(GameStateMachine gameStateMachine, AudioService audioService, AssetLoader assetLoader)
- {
- _gameStateMachine = gameStateMachine;
- _audioService = audioService;
- _assetLoader = assetLoader;
- }
- public async UniTask Enter()
- {
- await StartBackgroundResourceLoading();
- await _gameStateMachine.Enter<LoadMainMenuState>();
- }
- public UniTask Exit()
- {
- return UniTask.CompletedTask;
- }
- private async UniTask StartBackgroundResourceLoading()
- {
- _assetLoader.LoadAssetAsync<AudioClip>(ConstantAudioName.DefaultClick).Forget();
- _assetLoader.LoadAssetAsync<AudioClip>(ConstantAudioName.DefaultDeny).Forget();
- _audioService.Ambient.PlayWhenReadyAsync(ConstantAudioName.MainMenuAmbient, true).Forget();
- // Завантажуємо шрифти та локалізацію паралельно
- await UniTask.WhenAll(
- LoadFontsAsync(),
- LoadLocalization()
- );
- }
- private async UniTask LoadLocalization()
- {
- await LocalizationSettings.InitializationOperation;
- LoadSavedLanguage();
- await PreloadMainMenuTables();
- }
- private void LoadSavedLanguage()
- {
- string savedLangCode = PlayerPrefs.GetString("SelectedLanguage", "");
- if (!string.IsNullOrEmpty(savedLangCode))
- {
- Locale savedLocale = LocalizationSettings.AvailableLocales.GetLocale(new LocaleIdentifier(savedLangCode));
- if (savedLocale != null)
- {
- LocalizationSettings.SelectedLocale = savedLocale;
- return;
- }
- }
- Locale deviceLocale = LocalizationSettings.AvailableLocales.GetLocale(Application.systemLanguage);
- LocalizationSettings.SelectedLocale =
- deviceLocale != null ? deviceLocale : LocalizationSettings.AvailableLocales.Locales[0];
- }
- private async UniTask PreloadMainMenuTables()
- {
- var stringDatabase = LocalizationSettings.StringDatabase;
- var mainMenuTable = stringDatabase.GetTableAsync(ConstantLocalizationTabelName.MainMenu).ToUniTask();
- var popupTable = stringDatabase.GetTableAsync(ConstantLocalizationTabelName.Popup).ToUniTask();
- await UniTask.WhenAll(mainMenuTable, popupTable);
- }
- /// <summary>
- /// Завантажує TextMesh Pro шрифти через Addressables.
- /// Шрифти необхідні для TMP Fallback системи (емоджі та тег font) і мають бути в пам'яті до показу UI.
- /// </summary>
- private async UniTask LoadFontsAsync()
- {
- // Назви шрифтів з Addressables
- string[] fontNames = new[]
- {
- "FramerSans300 SDF",
- "FramerSans400 SDF",
- "FramerSans600 SDF"
- };
- // Завантажуємо всі шрифти паралельно та отримуємо результати через кортежі
- var (font300, font400, font600) = await UniTask.WhenAll(
- LoadSingleFontAsync(fontNames[0]),
- LoadSingleFontAsync(fontNames[1]),
- LoadSingleFontAsync(fontNames[2])
- );
- // Перевіряємо що всі шрифти успішно завантажились
- if (font300 != null && font400 != null && font600 != null)
- {
- // Оновлюємо TMP Settings щоб теги <font="FontName"> працювали з новими екземплярами шрифтів
- TMP_Settings.fallbackFontAssets = new List<TMP_FontAsset> { font300, font400, font600 };
- TMP_Settings.defaultFontAsset = font300;
- // Оновлюємо внутрішню таблицю TMP для пошуку шрифтів через теги <font>
- MaterialReferenceManager.AddFontAsset(font300);
- MaterialReferenceManager.AddFontAsset(font400);
- MaterialReferenceManager.AddFontAsset(font600);
- }
- else
- {
- Debug.LogWarning("❌ Не всі шрифти завантажились. TMP Settings не оновлено.");
- }
- }
- /// <summary>
- /// Завантажує окремий TMP шрифт через Addressables.
- /// При помилці логує її, але не блокує загрузку (graceful degradation).
- /// </summary>
- private async UniTask<TMP_FontAsset> LoadSingleFontAsync(string fontName)
- {
- try
- {
- var handle = Addressables.LoadAssetAsync<TMP_FontAsset>(fontName);
- await handle.ToUniTask();
- if (handle.Status == AsyncOperationStatus.Succeeded)
- {
- Debug.Log($"✓ Завантажено шрифт: {fontName}");
- return handle.Result;
- }
- else
- {
- Debug.LogWarning($"❌ Помилка завантаження шрифту {fontName}: {handle.OperationException}");
- return null;
- }
- }
- catch (System.Exception ex)
- {
- // Не блокуємо запуск гри при помилці завантаження шрифтів
- Debug.LogWarning($"❌ Помилка завантаження шрифту {fontName}: {ex.Message}");
- return null;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment