using System; using UnityEngine; using VContainer; using Vanguard.Api; using Vanguard.Auth; using Vanguard.Meta; using Vanguard.State; namespace Vanguard.App { /// /// Composition root клиента. Живёт между сценами, хранит DI-контейнер и /// общие сервисы; сцены отвечают только за 3D-вид и свой UI. /// public sealed class VanguardApp : MonoBehaviour { public static VanguardApp Instance { get; private set; } public static string LastInitializationError { get; private set; } private IObjectResolver _container; public IObjectResolver Container => _container; public SceneFlow Flow { get; private set; } private void Awake() { try { Instance = this; DontDestroyOnLoad(gameObject); Application.targetFrameRate = 60; var config = new AppConfig(); config.Load(); var builder = new ContainerBuilder(); builder.RegisterInstance(config); builder.Register(Lifetime.Singleton); builder.Register(Lifetime.Singleton); builder.Register(Lifetime.Singleton); builder.Register(Lifetime.Singleton); builder.Register(Lifetime.Singleton); builder.Register(Lifetime.Singleton); _container = builder.Build(); Flow = _container.Resolve(); } catch (Exception exception) { LastInitializationError = exception.ToString(); Debug.LogException(exception); } } private void Start() { if (Flow != null) _ = Flow.LoadLoginAsync(); } private void OnDestroy() { if (Instance == this) Instance = null; if (_container is IDisposable disposable) disposable.Dispose(); } } }