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;
|
|
|
|
/// <summary>
|
|
/// Call to connect client to host
|
|
/// </summary>
|
|
[ContextMenu("Start Client")]
|
|
public void StartClient()
|
|
{
|
|
StartClient(ServerAddress, Port);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Call to connect the client to the host
|
|
/// </summary>
|
|
/// <param name="ServerAddress">Server Address to connect to</param>
|
|
/// <param name="Port">Port to connect on</param>
|
|
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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Helper function which sets up all necessary handlers for message types
|
|
/// </summary>
|
|
/// <param name="client"></param>
|
|
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<PlayerMsg>(msg, out playerMsg))
|
|
return;
|
|
|
|
Debug.Log("Recieved ID from server: " + playerMsg.ID);
|
|
|
|
ID = playerMsg.ID;
|
|
SendMessage(LoginMsgID.Name, new StringMsg(ID, Name));
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Sends message to server
|
|
/// </summary>
|
|
/// <param name="msgType">Message type, used to determin message handler</param>
|
|
/// <param name="msg">The message to send</param>
|
|
/// <param name="channel">Which channel to send on, by deafult sends on Reliable</param>
|
|
/// <param name="BackLog">If client isn't connected to server add to BackLog, by default true</param>
|
|
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);
|
|
}
|
|
}
|
|
}
|