using Code.Infrastructure.Camera; using Code.Infrastructure.Configs; using Code.Infrastructure.Input; using Code.Infrastructure.Loadings; using Code.Infrastructure.SceneLoader; using Reflex.Core; using UnityEngine; namespace Code.Infrastructure.App { public class PapaInstaller : MonoBehaviour, IInstaller, ISceneConfigsLoadedHandle, IInputServiceInitializedHandle, ICameraInitializedHandle { public void InstallBindings(ContainerBuilder containerBuilder) { containerBuilder.AddSingleton(typeof(EventBus.EventBus)); containerBuilder.AddSingleton(typeof(ConfigLocator), typeof(IConfigLocator)); containerBuilder.AddSingleton(typeof(SceneLoader.SceneLoader)); containerBuilder.AddSingleton(typeof(InputService),typeof(IInputService)); containerBuilder.OnContainerBuilt += Bootstrap; containerBuilder.AddSingleton(typeof(AppStateMachine)); containerBuilder.AddSingleton(typeof(AppStateMachineContext)); containerBuilder.AddSingleton(typeof(CameraFactory)); containerBuilder.AddSingleton(typeof(CameraStateMachine)); containerBuilder.AddSingleton(typeof(CameraStateMachineContext)); } private Loading initialLoading; private Container _thatRightContainer; private void Bootstrap(Container container) { _thatRightContainer = container; container.Resolve().Subscribe(this); container.Resolve(); container.Resolve(); container.Resolve().CreateCameraStateMachine(container.Resolve()).Forget(); initialLoading = new Loading(3, () => EssentialLoadEnded(container)); } private void EssentialLoadEnded(Container container) { container.Resolve().SwitchState(AppStates.Bootstrap).AllowStateTransition(AppStates.Gameplay); container.Resolve().Unsubscribe(this); } public void SceneConfigsLoaded() { initialLoading.DoProgress(); } public void InputServiceInitialized() { initialLoading.DoProgress(); } public void CameraInitialized(CameraStateMachineContext.CameraLoadedData data) { _thatRightContainer.Resolve().cameraLoadedData = data; _thatRightContainer.Resolve().SwitchState(CameraMode.None) .AllowStateTransition(CameraMode.FirstPerson); initialLoading.DoProgress(); } } }