MP-TD/Assets/Scripts/UI/ClientConnectionManager.cs

143 lines
4.8 KiB
C#

using Client;
using Common;
using TMPro;
using Unity.Entities;
using Unity.NetCode;
using Unity.Networking.Transport;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
namespace UI
{
public class ClientConnectionManager : MonoBehaviour
{
[SerializeField] private TMP_InputField _addressField;
[SerializeField] private TMP_InputField _portField;
[SerializeField] private TMP_Dropdown _connectionModeDropdown;
[SerializeField] private Button _connectButton;
[SerializeField] private ColorPicker _colorPicker;
private ushort Port => ushort.Parse(_portField.text);
private string Address => _addressField.text;
private void OnEnable()
{
_addressField.text = "127.0.0.1";
_portField.text = "7979";
_connectionModeDropdown.onValueChanged.AddListener(OnConnectionModeChanged);
_connectButton.onClick.AddListener(OnButtonConnect);
OnConnectionModeChanged(_connectionModeDropdown.value);
}
private void OnDisable()
{
_connectionModeDropdown.onValueChanged.RemoveAllListeners();
_connectButton.onClick.RemoveAllListeners();
}
private void OnConnectionModeChanged(int connectionMode)
{
string buttonLabel;
_connectButton.enabled = true;
switch (connectionMode)
{
case 0:
buttonLabel = "Start Host";
break;
case 1 :
buttonLabel = "Start Server";
break;
case 2:
buttonLabel = "Start Client";
break;
default:
buttonLabel = "<ERROR>";
_connectButton.enabled = false;
break;
}
var buttonText = _connectButton.GetComponentInChildren<TextMeshProUGUI>();
buttonText.text = buttonLabel;
}
private void OnButtonConnect()
{
DestroyLocalSimulationWorld();
SceneManager.LoadScene(1);
switch (_connectionModeDropdown.value)
{
case 0:
StartServer();
StartClient();
break;
case 1:
StartServer();
break;
case 2:
StartClient();
break;
default:
Debug.LogError("Error: Unknown connection mode", gameObject);
break;
}
}
private static void DestroyLocalSimulationWorld()
{
//Destroy default world, we will create a new one
foreach (var world in World.All)
{
if (world.Flags == WorldFlags.Game)
{
world.Dispose();
break;
}
}
}
private void StartServer()
{
//Create server world
var serverWorld = ClientServerBootstrap.CreateServerWorld("TD Server World");
//Define endpoint for world to listen to, and set network driver to listen to specified port
var serverEndPoint = NetworkEndpoint.AnyIpv4.WithPort(Port);
{
using var networkDriverQuery = serverWorld.EntityManager.CreateEntityQuery(ComponentType.ReadWrite<NetworkStreamDriver>());
networkDriverQuery.GetSingletonRW<NetworkStreamDriver>().ValueRW.Listen(serverEndPoint);
}
}
private void StartClient()
{
//Create server world
var clientWorld = ClientServerBootstrap.CreateClientWorld("TD Client World");
//Set IP adress and port for server to host on
var connectionEndpoint = NetworkEndpoint.Parse(Address, Port);
{
using var networkDriverQuery = clientWorld.EntityManager.CreateEntityQuery(ComponentType.ReadWrite<NetworkStreamDriver>());
networkDriverQuery.GetSingletonRW<NetworkStreamDriver>().ValueRW.Connect(clientWorld.EntityManager, connectionEndpoint);
}
World.DefaultGameObjectInjectionWorld = clientWorld;
//create entity with join request component, so that the ClientRequestGameEntrySystem can take over
var teamRequestEntity = clientWorld.EntityManager.CreateEntity();
var color = _colorPicker.Color;
clientWorld.EntityManager.AddComponentData(teamRequestEntity, new ClientTeamRequest
{
Value = TeamType.Player,
Color = color,
});
}
}
}