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);
}
}
}