162 lines
5.0 KiB
C#
162 lines
5.0 KiB
C#
using Cysharp.Threading.Tasks;
|
||
using Periscope;
|
||
using System.Threading;
|
||
using TMPro;
|
||
using UnityEngine;
|
||
using UnityEngine.XR;
|
||
|
||
/// <summary>
|
||
/// Главный загрузчик.
|
||
/// </summary>
|
||
public class MainBootstrap : MonoBehaviour
|
||
{
|
||
[SerializeField] TextMeshProUGUI window;
|
||
[SerializeField] private ConfigCatalog ConfigCatalog;
|
||
[SerializeField] private In.InputType InputType;
|
||
[SerializeField] private GameManager gm;
|
||
|
||
[Header("Настройка камер")]
|
||
[SerializeField] private Transform CamerasPivot;
|
||
[SerializeField] private Camera VR_Camera;
|
||
[SerializeField] private Camera Screen_Camera;
|
||
|
||
[Header("Sound manager")]
|
||
[SerializeField] private SoundManager soundManager;
|
||
|
||
[Header("Отладка")]
|
||
[SerializeField] private bool logging;
|
||
|
||
|
||
|
||
private async void Awake()
|
||
{
|
||
XRSettings.useOcclusionMesh = false;
|
||
|
||
window.text += "Инициализация диспетчера...\n";
|
||
UnityMainThreadDispatcher.Initialize();
|
||
await UniTask.Delay(1000);
|
||
window.text += "Диспетчер инициализирован...\n";
|
||
await UniTask.Delay(1000);
|
||
|
||
|
||
window.text += "Проверка лицензии...\n";
|
||
bool ok = await Defender.Instance.CheckLicenseAsync();
|
||
if (ok)
|
||
{
|
||
window.text += "Лицензия валидна\n";
|
||
}
|
||
else
|
||
{
|
||
window.text += "Нет лицензии\n";
|
||
await UniTask.Delay(2000);
|
||
Application.Quit();
|
||
}
|
||
|
||
|
||
InitializeMangers();
|
||
Cursor.lockState = CursorLockMode.Locked;
|
||
Cursor.visible = false;
|
||
|
||
window.text += "Регулировка перископа...\n";
|
||
PeriscopeManager.Init(GameManager.globalCts);
|
||
PeriscopeManager.MoveUpToEnd();
|
||
await PeriscopeWait(PeriscopeManager.config.MoveUpToEndTimeMs, window.text);
|
||
|
||
await UniTask.Delay(1000);
|
||
window.text += "Заходим в игру...\n";
|
||
await UniTask.Delay(1000);
|
||
SceneLoader.LoadScene("MenuOneRegime");
|
||
}
|
||
|
||
private async UniTask PeriscopeWait(int timeMs, string message, CancellationToken token = default)
|
||
{
|
||
float startTime = Time.time;
|
||
float duration = timeMs / 1000f; // Конвертируем в секунды
|
||
|
||
while (Time.time - startTime < duration)
|
||
{
|
||
// Проверяем отмену
|
||
if (token.IsCancellationRequested)
|
||
break;
|
||
|
||
// Вычисляем процент (0-1)
|
||
float elapsed = Time.time - startTime;
|
||
float percent = Mathf.Clamp01(elapsed / duration);
|
||
|
||
var progress = GetProgressBar(percent * 100f);
|
||
window.text = $"{message}{progress}\n";
|
||
|
||
await UniTask.Delay(100, cancellationToken: token);
|
||
}
|
||
|
||
// По завершении показываем 100%
|
||
window.text = $"{message}{GetProgressBar(100f)}\n";
|
||
}
|
||
|
||
private void InitializeMangers()
|
||
{
|
||
gm.Init();
|
||
window.text += "Инициализация менеджеров...\n";
|
||
DontDestroyOnLoad(gm);
|
||
if (ConfigCatalog == null)
|
||
{
|
||
Log("Не указан каталог конфигов");
|
||
return;
|
||
}
|
||
|
||
var catalogValidatinResult = ConfigCatalog.ValidateReferences();
|
||
if (!catalogValidatinResult.OK)
|
||
{
|
||
Log($"Ошибка в каталоге конфига: \n{catalogValidatinResult.message}");
|
||
return;
|
||
}
|
||
|
||
#region Инициализации
|
||
|
||
SettingsManager.Initialize(ConfigCatalog.SettingsManagerConfig.DefaultSettingsScheme);
|
||
|
||
CamerasManager.Initialize(CamerasPivot, VR_Camera, Screen_Camera);
|
||
|
||
|
||
ComPortController.Initialize(ControllerConfig.LoadOrCreate(), ComPortController.InputType.Decimal);
|
||
ComPortController.PaymentReceived += WalletManager.OnCoin;
|
||
|
||
|
||
|
||
|
||
WalletManager.Initialize(ConfigCatalog.WalletManagerConfig);
|
||
CountersSystem.Init(ConfigCatalog.CountersConfig);
|
||
|
||
|
||
GameModesHolder.Initialize(ConfigCatalog.GameModesConfig);
|
||
In.Initialize(In.GetInputSourceByType(InputType));
|
||
|
||
soundManager.Initialize();
|
||
#endregion
|
||
|
||
Log("Главный загрузчик отработал");
|
||
BootstrapperState.MainBootstraped = true;
|
||
window.text += "Готово...\n";
|
||
}
|
||
|
||
private void Log(string message)
|
||
{
|
||
if (logging) Debug.Log(message);
|
||
}
|
||
|
||
private static string GetProgressBar(float percent, int totalLength = 10)
|
||
{
|
||
// Ограничиваем процент от 0 до 100
|
||
percent = Mathf.Clamp(percent, 0f, 100f);
|
||
|
||
// Вычисляем количество заполненных блоков
|
||
int filledCount = Mathf.RoundToInt((percent / 100f) * totalLength);
|
||
|
||
// Собираем строку
|
||
string filled = new string('■', filledCount);
|
||
string empty = new string('□', totalLength - filledCount);
|
||
|
||
return $"[{filled}{empty}]";
|
||
}
|
||
}
|