using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; namespace Multiplayer { public class ClientManager : MonoBehaviour { #region Inspector Variables [Header("Client Settings")] [Tooltip("Address server is hosted on")] [SerializeField] private string ServerAddress = "127.0.0.1"; [Tooltip("Port to connect to server on")] [SerializeField] private int Port = 4444; [Tooltip("Connects client to server on awake")] [SerializeField] private bool ConnectOnStart = false; public string Name; #endregion //Returns if client is current connected to a server public bool IsConnected { get; private set; } public byte ID { get; private set; } //UNET client class which connects to the server; private NetworkClient uNetClient; /// /// Call to connect client to host /// [ContextMenu("Start Client")] public void StartClient() { StartClient(ServerAddress, Port); } /// /// Call to connect the client to the host /// /// Server Address to connect to /// Port to connect on public void StartClient(string ServerAddress, int Port) { //If client is already connected to don't continue if (IsConnected) { Debug.Log("Client already connected to a server. Client needs to disconnect before it can connect to a server"); return; } Debug.Log("Attempting to connect to: '" + ServerAddress + "' on port : '" + Port + "'"); uNetClient = new NetworkClient(); RegisterHandlers(uNetClient); uNetClient.Configure(ChannelConfig.DefaultTopology()); uNetClient.Connect(ServerAddress, Port); } /// /// Helper function which sets up all necessary handlers for message types /// /// private void RegisterHandlers(NetworkClient client) { client.RegisterHandler(MsgType.Connect, OnConnected); client.RegisterHandler(MsgType.Disconnect, OnDisconnected); client.RegisterHandler(LoginMsgID.QueryName, OnRecieveID); } private void OnConnected(NetworkMessage msg) { IsConnected = true; ID = (byte)msg.conn.connectionId; Debug.Log("Successfully connected to server"); } private void OnDisconnected(NetworkMessage msg) { IsConnected = false; Debug.Log("Disconnected from Server"); } private void OnRecieveID(NetworkMessage msg) { PlayerMsg playerMsg; if (!Utility.ReadMessage(msg, out playerMsg)) return; Debug.Log("Recieved ID from server: " + playerMsg.ID); ID = playerMsg.ID; SendMessage(LoginMsgID.Name, new StringMsg(ID, Name)); } /// /// Sends message to server /// /// Message type, used to determin message handler /// The message to send /// Which channel to send on, by deafult sends on Reliable /// If client isn't connected to server add to BackLog, by default true public void SendMessage(short msgType, MessageBase msg, ServerChannel channel = ServerChannel.Reliable) { //if client isn't connected add to backlog if (IsConnected) { Debug.Log("Player not connected to server"); } uNetClient.SendByChannel(msgType, msg, (int)channel); } } }