125 lines
5.7 KiB
C#
125 lines
5.7 KiB
C#
using System.Threading.Tasks;
|
|
using Code.App.StateMachine;
|
|
using Code.Audio;
|
|
using Code.Configs;
|
|
using Code.Constants;
|
|
using Code.Gameplay.Camera;
|
|
using Code.Gameplay.Player;
|
|
using Code.Input;
|
|
using Code.Scenes;
|
|
using Code.StaticData;
|
|
using Code.UI;
|
|
using Code.UI.Panels;
|
|
using Cysharp.Threading.Tasks;
|
|
using Reflex.Core;
|
|
using Reflex.Injectors;
|
|
using UnityEngine;
|
|
using UnityEngine.AddressableAssets;
|
|
using UnityEngine.InputSystem;
|
|
|
|
namespace Code.App
|
|
{
|
|
public class BootstrapInstaller : MonoBehaviour, IInstaller
|
|
{
|
|
public void InstallBindings(ContainerBuilder containerBuilder)
|
|
{
|
|
InstallStaticData(containerBuilder, out IStaticDataService staticDataService);
|
|
|
|
InstallInfrastructureUnit(containerBuilder, staticDataService);
|
|
|
|
containerBuilder.AddSingleton(typeof(InputService), typeof(IInputService));
|
|
containerBuilder.AddSingleton(typeof(PlayerFactory), typeof(IPlayerFactory));
|
|
|
|
InitializeCamera(containerBuilder, staticDataService);
|
|
containerBuilder.AddSingleton(typeof(UIFactory), typeof(IUIFactory));
|
|
containerBuilder.AddSingleton(typeof(UIService), typeof(IUIService));
|
|
|
|
containerBuilder.AddSingleton(typeof(AudioFactory), typeof(IAudioFactory));
|
|
containerBuilder.AddSingleton(typeof(AudioService), typeof(IAudioService));
|
|
|
|
containerBuilder.AddSingleton(typeof(SceneLoaderService), typeof(ISceneLoaderService));
|
|
|
|
containerBuilder.OnContainerBuilt += Bootstrap;
|
|
}
|
|
|
|
private void InitializeCamera(ContainerBuilder containerBuilder, IStaticDataService staticDataService)
|
|
{
|
|
Camera camera = Instantiate(staticDataService.CameraConfig.cameraPrefab);
|
|
|
|
DontDestroyOnLoad(camera);
|
|
containerBuilder.AddSingleton(camera);
|
|
}
|
|
|
|
private void InstallInfrastructureUnit(ContainerBuilder containerBuilder, IStaticDataService staticDataService)
|
|
{
|
|
GameObject infrastructureUnit = Instantiate(staticDataService.AppConfig.infrastructureUnitPrefab);
|
|
DontDestroyOnLoad(infrastructureUnit);
|
|
|
|
containerBuilder.AddSingleton(infrastructureUnit);
|
|
containerBuilder.AddSingleton(infrastructureUnit.AddComponent<CoroutineRunner>(),
|
|
typeof(ICoroutineRunner));
|
|
containerBuilder.AddSingleton(infrastructureUnit.AddComponent<AppStateMachine>());
|
|
containerBuilder.AddSingleton(infrastructureUnit.AddComponent<CameraStateMachine>());
|
|
}
|
|
|
|
private void InstallStaticData(ContainerBuilder containerBuilder, out IStaticDataService staticDataService)
|
|
{
|
|
staticDataService = new StaticDataService();
|
|
staticDataService.Load();
|
|
|
|
containerBuilder.AddSingleton(staticDataService, typeof(IStaticDataService));
|
|
containerBuilder.AddSingleton(staticDataService.InputConfig.inputActionAsset, typeof(InputActionAsset));
|
|
containerBuilder.AddSingleton(staticDataService.InputConfig, typeof(InputConfig));
|
|
containerBuilder.AddSingleton(staticDataService.CameraConfig, typeof(CameraConfig));
|
|
containerBuilder.AddSingleton(staticDataService.PlayerConfig, typeof(PlayerConfig));
|
|
containerBuilder.AddSingleton(staticDataService.CharacterConfig, typeof(CharacterConfig));
|
|
containerBuilder.AddSingleton(staticDataService.UIConfig, typeof(UIConfig));
|
|
containerBuilder.AddSingleton(staticDataService.AudioMixerConfig, typeof(AudioMixerConfig));
|
|
containerBuilder.AddSingleton(staticDataService.SoundtrackListConfig, typeof(SoundtrackListConfig));
|
|
containerBuilder.AddSingleton(staticDataService.SFXListConfig, typeof(SFXListConfig));
|
|
containerBuilder.AddSingleton(staticDataService.DispatcherSoundListConfig, typeof(DispatcherSoundListConfig));
|
|
containerBuilder.AddSingleton(staticDataService.EnemiesSoundListConfig, typeof(EnemiesSoundListConfig));
|
|
// containerBuilder.AddSingleton(staticDataService.UIConfig.canvasPrefab, typeof(Canvas));
|
|
// containerBuilder.AddSingleton(staticDataService.UIConfig.uiElementsPrefabs, typeof(UIElement[]));
|
|
}
|
|
|
|
private bool _onAudioLoaded;
|
|
private AppStateMachine _appStateMachine;
|
|
private void Bootstrap(Container container)
|
|
{
|
|
container.Resolve<IAudioFactory>();
|
|
IAudioService audioService = container.Resolve<IAudioService>();
|
|
audioService.Initialize(OnAudioLoaded);
|
|
|
|
_appStateMachine = container.Resolve<AppStateMachine>();
|
|
_appStateMachine.Initialize();
|
|
AttributeInjector.Inject(_appStateMachine.StateMachineContext, container);
|
|
|
|
CameraStateMachine cameraStateMachine = container.Resolve<CameraStateMachine>();
|
|
AttributeInjector.Inject(cameraStateMachine.StateMachineContext, container);
|
|
cameraStateMachine.Initialize();
|
|
|
|
var loadingScreen = GameObject.FindWithTag(Tags.LoadingScreen);
|
|
DontDestroyOnLoad(loadingScreen);
|
|
|
|
IUIService uiService = container.Resolve<IUIService>();
|
|
uiService.Initialize(loadingScreen.GetComponent<LoadingScreen>());
|
|
|
|
}
|
|
|
|
private void TryStartGame()
|
|
{
|
|
if (!_onAudioLoaded) return;
|
|
// TODO: поменяно для теста
|
|
_appStateMachine
|
|
.SwitchState(AppState.MainMenu)
|
|
.AllowStateTransition(AppState.Gameplay);
|
|
}
|
|
|
|
private void OnAudioLoaded()
|
|
{
|
|
_onAudioLoaded = true;
|
|
TryStartGame();
|
|
}
|
|
}
|
|
} |