129 lines
4.4 KiB
C#
129 lines
4.4 KiB
C#
using Code.App.Loading;
|
|
using Code.App.StateMachine;
|
|
using Code.Audio;
|
|
using Code.Gameplay.Camera;
|
|
using Code.Gameplay.Camera.CameraStates;
|
|
using Code.Gameplay.Door;
|
|
using Code.Input;
|
|
using Code.Scenes;
|
|
using Code.Scenes.SceneEnvironments;
|
|
using Code.StateMachine;
|
|
using Code.UI;
|
|
using Code.UI.Panels;
|
|
using Cysharp.Threading.Tasks;
|
|
using Reflex.Extensions;
|
|
using UnityEngine;
|
|
using UnityEngine.SceneManagement;
|
|
|
|
namespace Code.App.AppStates
|
|
{
|
|
public class MainMenuState : BaseState<AppStateMachineContext>
|
|
{
|
|
public MainMenuState(AppStateMachineContext context) : base(context)
|
|
{
|
|
}
|
|
|
|
public override void EnterState()
|
|
{
|
|
Context.LoadingManager
|
|
.RegisterLoading(LoadingWork.LoadScene)
|
|
.RegisterLoading(LoadingWork.LoadUI)
|
|
.RegisterLoading(LoadingWork.LoadAudio);
|
|
|
|
// Context.UIService.LoadingScreen.Show();
|
|
|
|
Context.CameraStateMachine.SwitchState(CameraMode.MainMenu);
|
|
|
|
Context.SceneLoaderService.LoadSceneAsyncAwaitable((int)SceneIds.MainMenu);
|
|
Context.LoadingManager.OnLoadingEnded += AfterSceneLoaded;
|
|
|
|
#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
|
|
WaitForLoad();
|
|
#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
|
|
}
|
|
|
|
private async UniTaskVoid WaitForLoad()
|
|
{
|
|
await UniTask.WhenAll(
|
|
Context.UIService.AsyncSwitchPanelTo(UIPanel.MainMenu),
|
|
Context.AudioFactory.WarmMenuMusic(),
|
|
Context.AudioFactory.WarmAudioTestClips()
|
|
);
|
|
Context.LoadingManager
|
|
.UnregisterLoading(LoadingWork.LoadUI)
|
|
.UnregisterLoading(LoadingWork.LoadAudio);
|
|
|
|
InitializeAudio();
|
|
|
|
InitializeInput();
|
|
}
|
|
|
|
private void AfterSceneLoaded()
|
|
{
|
|
var mainMenuEnvironment = (MainMenuEnvironment)SceneManager.GetActiveScene()
|
|
.GetSceneContainer().Resolve<CurrentSceneEnvironment>();
|
|
|
|
InitializeUI(mainMenuEnvironment);
|
|
|
|
InitializeCamera(mainMenuEnvironment);
|
|
|
|
Context.LoadingManager.OnLoadingEnded -= AfterSceneLoaded;
|
|
}
|
|
|
|
private void InitializeCamera(MainMenuEnvironment mainMenuEnvironment)
|
|
{
|
|
((Gameplay.Camera.CameraStates.MainMenuState)Context.CameraStateMachine.CurrentBaseState).SetFollowTransform(mainMenuEnvironment
|
|
.cameraPosition);
|
|
}
|
|
|
|
private void InitializeInput()
|
|
{
|
|
Context.InputService.EnableMap(ActionMappings.MainMenu);
|
|
}
|
|
|
|
private void InitializeAudio()
|
|
{
|
|
Context.AudioService.TransitToSnapshot(AudioSnapshotState.Menu);
|
|
Context.AudioService.PlayRandomMusicUntilHumanityWillBeDestroyedForTheySins(MusicType.Menu);
|
|
}
|
|
|
|
private void InitializeUI(MainMenuEnvironment mainMenuEnvironment)
|
|
{
|
|
var menuPanel = (MainMenuPanel)Context.UIService.CurrentPanel;
|
|
menuPanel.Initialize(mainMenuEnvironment.uiVariables,
|
|
mainMenuEnvironment.startButton,
|
|
mainMenuEnvironment.settingButton,
|
|
mainMenuEnvironment.exitButton);
|
|
|
|
menuPanel.startButton.button.onClick.AddListener(StartGame);
|
|
menuPanel.exitButton.button.onClick.AddListener(ExitGame);
|
|
|
|
mainMenuEnvironment.menuButtonsCanvas.worldCamera = Context.CameraStateMachine.Camera;
|
|
mainMenuEnvironment.settingsCanvas.worldCamera = Context.CameraStateMachine.Camera;
|
|
}
|
|
|
|
public override void Tick()
|
|
{
|
|
}
|
|
|
|
private void StartGame()
|
|
{
|
|
Context.StateMachine.SwitchState(AppState.Gameplay)
|
|
.AllowStateTransition(AppState.GameOver);
|
|
}
|
|
|
|
private void ExitGame()
|
|
{
|
|
Application.Quit();
|
|
}
|
|
|
|
public override void ExitState()
|
|
{
|
|
Context.InputService.DisableMap(ActionMappings.MainMenu);
|
|
Context.AudioService.GladlyAskToStopMusic(MusicType.Menu, callback: Context.AudioFactory.ReleaseMenuMusic);
|
|
|
|
Context.AudioFactory.ReleaseAudioTestClips();
|
|
base.ExitState();
|
|
}
|
|
}
|
|
} |