using UnityEngine;
using SpaceMercsLife.Service.Interfaces;
using SpaceMercsLife.Service.Implementation.Mono;
using SpaceMercsLife.Service.Implementation.POCO;
using System.Threading.Tasks;
using UnityEngine.SceneManagement;
using SpaceMercsLife.SLocator;
namespace SpaceMercsLife
{
public class Bootstrap : MonoBehaviour
{
private string configFileName = "game_config";
private string defaultLocale = "en";
private async void Start()
{
MonoBehaviourServicesRegistration();
await POCOServicesRegistration();
ReleaseResources();
await LoadGameSettings();
// Воспроизведение фоновой музыки
var audioService = ServiceLocator.Instance.Get<IAudioService>();
await audioService.PlayBackgroundMusicAsync("main_theme", volume: 1.0f, fadeInDuration: 2.0f);
// Загрузка сцены главного меню
var sceneService = ServiceLocator.Instance.Get<ISceneService>();
await sceneService.LoadSceneAsync("MainMenu", LoadSceneMode.Single, showLoadingScreen: true, uiSceneName: null);
}
private async Task LoadGameSettings()
{
// Загрузка графических настроек
var graphicsService = ServiceLocator.Instance.Get<IGraphicsService>();
await graphicsService.LoadSettingsAsync();
// Загрузка настроек ввода
var inputService = ServiceLocator.Instance.Get<IInputService>();
await inputService.LoadBindingsAsync();
// Загрузка настроек VFX
var vfxService = ServiceLocator.Instance.Get<IVFXService>();
await vfxService.LoadSettingsAsync();
// Загрузка настроек UI
var uiService = ServiceLocator.Instance.Get<IUIService>();
await uiService.LoadSettingsAsync();
// Инициализация камеры
var cameraService = ServiceLocator.Instance.Get<ICameraService>();
var mainCamera = cameraService.CreateCamera("MainCamera");
cameraService.SetMainCamera(mainCamera);
// Загрузка настроек камеры и мыши
await cameraService.LoadSettingsAsync();
}
private void MonoBehaviourServicesRegistration()
{
VFXService vfxServicePrefab = Resources.Load<VFXService>("Prefabs/VFXService");
SceneService sceneServicePrefab = Resources.Load<SceneService>("Prefabs/SceneService");
var vfxService = Instantiate(vfxServicePrefab);
DontDestroyOnLoad(vfxService.gameObject);
vfxService.Initialize(ServiceLocator.Instance.Get<IConfigurationService>());
ServiceLocator.Instance.Register<IVFXService, VFXService>(vfxService);
var sceneService = Instantiate(sceneServicePrefab);
DontDestroyOnLoad(sceneService.gameObject);
ServiceLocator.Instance.Register<ISceneService, SceneService>(sceneService);
}
private void ConfigInitialization()
{
var configService = new SimpleConfigurationService();
configService.LoadConfig($"Config/{configFileName}");
ServiceLocator.Instance.Register<IConfigurationService, SimpleConfigurationService>(configService);
var audioService = new AudioService(configService);
ServiceLocator.Instance.Register<IAudioService, AudioService>(audioService);
var graphicsService = new GraphicsService(configService);
ServiceLocator.Instance.Register<IGraphicsService, GraphicsService>(graphicsService);
var inputService = new InputService(configService);
ServiceLocator.Instance.Register<IInputService, InputService>(inputService);
var cameraService = new CameraService(configService);
ServiceLocator.Instance.Register<ICameraService, CameraService>(cameraService);
var uiService = new UIService(configService);
ServiceLocator.Instance.Register<IUIService, UIService>(uiService);
var localizationService = new SimpleLocalizationService();
localizationService.SetLocale(defaultLocale);
ServiceLocator.Instance.Register<ILocalizationService, SimpleLocalizationService>(localizationService);
}
private async Task POCOServicesRegistration()
{
ConfigInitialization();
ServiceLocator.Instance.Register<IResourceService, ResourceService>(new ResourceService());
ServiceLocator.Instance.Register<IPhysicsService, PhysicsService>(new PhysicsService());
ServiceLocator.Instance.Register<IEventBus, EventBus>(new EventBus());
ServiceLocator.Instance.Register<IStateMachineService, SimpleStateMachineService>(new SimpleStateMachineService());
var binaryDataService = new BinaryDataService();
await binaryDataService.InitializeAsync();
ServiceLocator.Instance.Register<IDataService, BinaryDataService>(binaryDataService);
}
private void ReleaseResources()
{
Resources.UnloadUnusedAssets();
}
}
}