您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
151 行
4.9 KiB
151 行
4.9 KiB
using System;
|
|
using BossRoom.Scripts.Shared.Net.UnityServices.Auth;
|
|
using Unity.Multiplayer.Samples.BossRoom.Shared;
|
|
using Unity.Multiplayer.Samples.BossRoom.Shared.Net.UnityServices.Lobbies;
|
|
using Unity.Multiplayer.Samples.BossRoom.Visual;
|
|
using Unity.Services.Authentication;
|
|
using Unity.Services.Core;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using VContainer;
|
|
using VContainer.Unity;
|
|
|
|
namespace Unity.Multiplayer.Samples.BossRoom.Client
|
|
{
|
|
/// <summary>
|
|
/// Client side game logic that runs when sitting at the MainMenu.
|
|
/// </summary>
|
|
public class ClientMainMenuState : GameStateBehaviour
|
|
{
|
|
public override GameState ActiveState { get { return GameState.MainMenu; } }
|
|
|
|
[SerializeField] NameGenerationData m_NameGenerationData;
|
|
[SerializeField] LobbyUIMediator m_LobbyUIMediator;
|
|
[SerializeField] IPUIMediator m_IPUIMediator;
|
|
[SerializeField] Button m_LobbyButton;
|
|
[SerializeField] GameObject m_SignInSpinner;
|
|
[SerializeField] UIProfileSelector m_UIProfileSelector;
|
|
[SerializeField] UITooltipDetector m_UGSSetupTooltipDetector;
|
|
|
|
[Inject] AuthenticationServiceFacade m_AuthServiceFacade;
|
|
[Inject] LocalLobbyUser m_LocalUser;
|
|
[Inject] LocalLobby m_LocalLobby;
|
|
[Inject] ProfileManager m_ProfileManager;
|
|
|
|
protected override void Awake()
|
|
{
|
|
base.Awake();
|
|
|
|
m_LobbyButton.interactable = false;
|
|
m_LobbyUIMediator.Hide();
|
|
|
|
if (string.IsNullOrEmpty(Application.cloudProjectId))
|
|
{
|
|
OnSignInFailed();
|
|
return;
|
|
}
|
|
|
|
TrySignIn();
|
|
}
|
|
|
|
protected override void Configure(IContainerBuilder builder)
|
|
{
|
|
base.Configure(builder);
|
|
builder.RegisterComponent(m_NameGenerationData);
|
|
builder.RegisterComponent(m_LobbyUIMediator);
|
|
builder.RegisterComponent(m_IPUIMediator);
|
|
}
|
|
|
|
|
|
private async void TrySignIn()
|
|
{
|
|
try
|
|
{
|
|
var unityAuthenticationInitOptions = new InitializationOptions();
|
|
var profile = m_ProfileManager.Profile;
|
|
if (profile.Length > 0)
|
|
{
|
|
unityAuthenticationInitOptions.SetProfile(profile);
|
|
}
|
|
|
|
await m_AuthServiceFacade.InitializeAndSignInAsync(unityAuthenticationInitOptions);
|
|
OnAuthSignIn();
|
|
m_ProfileManager.onProfileChanged += OnProfileChanged;
|
|
}
|
|
catch (Exception)
|
|
{
|
|
OnSignInFailed();
|
|
}
|
|
}
|
|
|
|
private void OnAuthSignIn()
|
|
{
|
|
m_LobbyButton.interactable = true;
|
|
m_UGSSetupTooltipDetector.enabled = false;
|
|
m_SignInSpinner.SetActive(false);
|
|
|
|
Debug.Log($"Signed in. Unity Player ID {AuthenticationService.Instance.PlayerId}");
|
|
|
|
m_LocalUser.ID = AuthenticationService.Instance.PlayerId;
|
|
// The local LobbyUser object will be hooked into UI before the LocalLobby is populated during lobby join, so the LocalLobby must know about it already when that happens.
|
|
m_LocalLobby.AddUser(m_LocalUser);
|
|
}
|
|
|
|
private void OnSignInFailed()
|
|
{
|
|
if (m_LobbyButton)
|
|
{
|
|
m_LobbyButton.interactable = false;
|
|
m_UGSSetupTooltipDetector.enabled = true;
|
|
}
|
|
if (m_SignInSpinner)
|
|
{
|
|
m_SignInSpinner.SetActive(false);
|
|
}
|
|
}
|
|
|
|
protected override void OnDestroy()
|
|
{
|
|
if (m_ProfileManager != null)
|
|
{
|
|
m_ProfileManager.onProfileChanged -= OnProfileChanged;
|
|
}
|
|
|
|
base.OnDestroy();
|
|
}
|
|
|
|
async void OnProfileChanged()
|
|
{
|
|
m_LobbyButton.interactable = false;
|
|
m_SignInSpinner.SetActive(true);
|
|
await m_AuthServiceFacade.SwitchProfileAndReSignInAsync(m_ProfileManager.Profile);
|
|
|
|
m_LobbyButton.interactable = true;
|
|
m_SignInSpinner.SetActive(false);
|
|
|
|
Debug.Log($"Signed in. Unity Player ID {AuthenticationService.Instance.PlayerId}");
|
|
|
|
// Updating LocalUser and LocalLobby
|
|
m_LocalLobby.RemoveUser(m_LocalUser);
|
|
m_LocalUser.ID = AuthenticationService.Instance.PlayerId;
|
|
m_LocalLobby.AddUser(m_LocalUser);
|
|
}
|
|
|
|
public void OnStartClicked()
|
|
{
|
|
m_LobbyUIMediator.ToggleJoinLobbyUI();
|
|
m_LobbyUIMediator.Show();
|
|
}
|
|
|
|
public void OnDirectIPClicked()
|
|
{
|
|
m_LobbyUIMediator.Hide();
|
|
m_IPUIMediator.Show();
|
|
}
|
|
|
|
public void OnChangeProfileClicked()
|
|
{
|
|
m_UIProfileSelector.Show();
|
|
}
|
|
}
|
|
}
|