VanguardReMaster/client/Assets/Vanguard/Runtime/App/SceneFlow.cs

83 lines
2.5 KiB
C#

using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.SceneManagement;
using Vanguard.Api.Contracts;
using Vanguard.Battle;
namespace Vanguard.App
{
/// <summary>
/// Переходы между сценами-экранами. Boot и VanguardApp остаются
/// персистентными; данные перехода (выбранная колода, тикет) временно
/// лежат здесь и забираются целевой сценой.
/// </summary>
public sealed class SceneFlow
{
public const string Boot = "Boot";
public const string Login = "Login";
public const string Lobby = "Lobby";
public const string DeckBuilder = "DeckBuilder";
public const string Battle = "Battle";
public const string PlaymatSandbox = "GameBoard3D";
public DeckDto PendingQueueDeck { get; private set; }
public MatchConnectionInfo PendingMatch { get; private set; }
public Task LoadLoginAsync()
{
PendingQueueDeck = null;
PendingMatch = null;
return LoadAsync(Login);
}
public Task LoadLobbyAsync() => LoadAsync(Lobby);
public Task LoadDeckBuilderAsync() => LoadAsync(DeckBuilder);
public Task OpenLobbyWithQueueAsync(DeckDto deck)
{
PendingQueueDeck = deck;
return LoadAsync(Lobby);
}
public Task LoadBattleAsync(MatchConnectionInfo info)
{
PendingMatch = info;
return LoadAsync(Battle);
}
public DeckDto ConsumePendingQueueDeck()
{
var deck = PendingQueueDeck;
PendingQueueDeck = null;
return deck;
}
public MatchConnectionInfo ConsumePendingMatch()
{
var match = PendingMatch;
PendingMatch = null;
return match;
}
public async Task LoadAsync(string sceneName)
{
if (string.IsNullOrEmpty(sceneName))
return;
if (SceneManager.GetActiveScene().name == sceneName)
return;
var operation = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Single);
if (operation == null)
{
Debug.LogError("Сцена не добавлена в Build Settings: " + sceneName);
return;
}
while (!operation.isDone)
await Task.Yield();
}
}
}