using System.Collections.Generic; using UnityEngine; using TMPro; using PlayFab; using PlayFab.ClientModels; using UnityEngine.Networking; public class Test : MonoBehaviour { // ╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗ // Local Defines // ╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝ enum State { NotLoggedIn, LoggingIn, LoggedIn, Matchmaking, Connecting, Authenticating } static public class ServerMsgType { public const short Connect = MsgType.Connect; public const short Disconnect = MsgType.Disconnect; public const short Error = MsgType.Error; public const short Authenticate = 200; } public class AuthenticateMessage : MessageBase { public string PlayFabId = string.Empty; public string Alias = string.Empty; public bool IsLocal = false; public string AuthTicket = string.Empty; public int BattleGroup = 0; public int BattleTier = 0; } // ╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗ // Variables // ╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝ public RectTransform m_TextArea; public TextMeshProUGUI m_EntryPrefab; List m_Entries = new List(); public TextMeshProUGUI m_ButtonLabel; State m_State = State.NotLoggedIn; string m_PlayFabId = null; NetworkClient m_NetworkClient; string m_AuthTicket = string.Empty; // ╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗ // Internal // ╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝ void Awake() { m_ButtonLabel.text = "LOGIN"; } void AddTextEntry( string text ) { TextMeshProUGUI entry = Instantiate( m_EntryPrefab, m_TextArea ); entry.rectTransform.anchoredPosition = new Vector2( 0f, m_Entries.Count * -40f ); entry.rectTransform.localRotation = Quaternion.identity; entry.rectTransform.localScale = Vector3.one; entry.text = text; m_Entries.Add( entry ); } void OnConnected( NetworkMessage netMsg ) { if( m_State == State.Connecting ) { if( m_NetworkClient == null || m_NetworkClient.connection.connectionId != netMsg.conn.connectionId ) { m_NetworkClient.Disconnect(); m_State = State.LoggedIn; AddTextEntry( "OnConnected bad client." ); } else { m_State = State.Authenticating; AddTextEntry( "Authenticating..." ); m_NetworkClient.Send( ServerMsgType.Authenticate, new AuthenticateMessage() { PlayFabId = m_PlayFabId, Alias = "Test", IsLocal = false, AuthTicket = m_AuthTicket, BattleGroup = 0, BattleTier = 0 } ); } } else { m_NetworkClient.Disconnect(); m_State = State.LoggedIn; AddTextEntry( "OnConnected wrong state." ); } } void OnDisconnected( NetworkMessage netMsg ) { m_State = State.LoggedIn; AddTextEntry( "OnDisconnected." ); if( m_NetworkClient != null ) { m_NetworkClient.Shutdown(); m_NetworkClient = null; } } void OnError( NetworkMessage netMsg ) { m_State = State.LoggedIn; AddTextEntry( "OnError." ); if( m_NetworkClient != null ) { m_NetworkClient.Shutdown(); m_NetworkClient = null; } } // ╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗ // Interface // ╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝ public void Connect() { if( m_State == State.NotLoggedIn ) { m_State = State.LoggingIn; AddTextEntry( "Logging in..." ); PlayFabClientAPI.LoginWithCustomID( new LoginWithCustomIDRequest() { TitleId = "AC50", CreateAccount = true, CustomId = SystemInfo.deviceUniqueIdentifier, }, ( result ) => { m_PlayFabId = result.PlayFabId; m_State = State.LoggedIn; AddTextEntry( "Logged in." ); m_ButtonLabel.text = "CONNECT"; }, ( error ) => { m_State = State.NotLoggedIn; AddTextEntry( "Failed to login." ); } ); } else if( m_State == State.LoggedIn ) { m_State = State.Matchmaking; AddTextEntry( "Matchaking..." ); PlayFabClientAPI.Matchmake( new MatchmakeRequest() { BuildVersion = "Arena", Region = Region.USEast, GameMode = "Arena" }, ( result ) => { if( m_State == State.Matchmaking ) { m_State = State.Connecting; AddTextEntry( "Connecting..." ); m_NetworkClient = new NetworkClient(); m_NetworkClient.RegisterHandler( ServerMsgType.Connect, OnConnected ); m_NetworkClient.RegisterHandler( ServerMsgType.Disconnect, OnDisconnected ); m_NetworkClient.RegisterHandler( ServerMsgType.Error, OnError ); m_AuthTicket = result.Ticket; m_NetworkClient.Connect( result.ServerIPV4Address, result.ServerPort ?? 7777 ); } }, ( error ) => { if( m_State == State.Matchmaking ) { m_State = State.LoggedIn; AddTextEntry( "Failed to Matchmake." ); } } ); } } }