Files
survival-game/Assets/Mirror/Examples/AutoLANClientController/Scripts/CanvasHUD.cs
2025-06-16 15:14:23 +02:00

205 lines
6.9 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mirror;
using UnityEngine.UI;
using Mirror.Discovery;
using UnityEngine.SceneManagement;
namespace Mirror.Examples.AutoLANClientController
{
public class CanvasHUD : MonoBehaviour
{
// this will check for games to join, if non, start host.
public bool alwaysAutoStart = false;
public AutoLANNetworkDiscovery networkDiscovery;
readonly Dictionary<long, ServerResponse> discoveredServers = new Dictionary<long, ServerResponse>();
public bool runAsPlayerHost = false;
// UI
public GameObject PanelStart, PanelStop;
public Button buttonHost, buttonServer, buttonClient, buttonStop, buttonAuto;
public Text infoText;
// legacy inputfield interaction does not auto bring up a keyboard on headset builds, use tmp.
public InputField inputFieldAddress;
private void Start()
{
//Make sure to attach these Buttons in the Inspector
buttonHost.onClick.AddListener(ButtonHost);
buttonServer.onClick.AddListener(ButtonServer);
buttonClient.onClick.AddListener(ButtonClient);
buttonStop.onClick.AddListener(ButtonStop);
buttonAuto.onClick.AddListener(ButtonAuto);
//Update the canvas text if you have manually changed network managers address from the game object before starting the game scene
inputFieldAddress.text = NetworkManager.singleton.networkAddress;
//Adds a listener to the input field and invokes a method when the value changes.
inputFieldAddress.onValueChanged.AddListener(delegate { OnValueChangedAddress(); });
if (networkDiscovery == null)
{
#if UNITY_2022_2_OR_NEWER
networkDiscovery = GameObject.FindAnyObjectByType<AutoLANNetworkDiscovery>();
#else
// Deprecated in Unity 2023.1
networkDiscovery = GameObject.FindObjectOfType<AutoLANNetworkDiscovery>();
#endif
}
// skips waiting for users to press ui button
if (alwaysAutoStart)
{
StartCoroutine(Waiter());
}
}
public IEnumerator Waiter()
{
infoText.text = "Discovering servers..";
discoveredServers.Clear();
networkDiscovery.StartDiscovery();
// we have set this as 3.1 seconds, default discovery scan is 3 seconds, allows some time if host and client are started at same time
yield return new WaitForSeconds(3.1f);
if (discoveredServers == null || discoveredServers.Count <= 0)
{
if (runAsPlayerHost == true)
{
infoText.text = "No Servers found, starting as Host.";
}
else
{
infoText.text = "No Servers found, starting as Server.";
}
yield return new WaitForSeconds(1.0f);
discoveredServers.Clear();
// NetworkManager.singleton.onlineScene = SceneManager.GetActiveScene().name;
if (runAsPlayerHost == true)
{
NetworkManager.singleton.StartHost();
}
else
{
NetworkManager.singleton.StartServer();
}
networkDiscovery.AdvertiseServer();
}
}
void Connect(ServerResponse info)
{
infoText.text = "Connecting to: " + info.serverId;
networkDiscovery.StopDiscovery();
NetworkManager.singleton.StartClient(info.uri);
}
public void OnDiscoveredServer(ServerResponse info)
{
discoveredServers[info.serverId] = info;
Connect(info);
}
public void ButtonHost()
{
SetupInfoText("Starting as host");
discoveredServers.Clear();
//NetworkManager.singleton.onlineScene = SceneManager.GetActiveScene().name;
NetworkManager.singleton.StartHost();
networkDiscovery.AdvertiseServer();
}
public void ButtonServer()
{
SetupInfoText("Starting as server.");
discoveredServers.Clear();
// NetworkManager.singleton.onlineScene = SceneManager.GetActiveScene().name;
NetworkManager.singleton.StartServer();
networkDiscovery.AdvertiseServer();
}
public void ButtonClient()
{
SetupInfoText("Starting as client.");
discoveredServers.Clear();
networkDiscovery.StartDiscovery();
}
public void ButtonStop()
{
SetupInfoText("Stopping.");
// stop host if host mode
if (NetworkServer.active && NetworkClient.isConnected)
{
NetworkManager.singleton.StopHost();
}
// stop client if client-only
else if (NetworkClient.isConnected)
{
NetworkManager.singleton.StopClient();
}
// stop server if server-only
else if (NetworkServer.active)
{
NetworkManager.singleton.StopServer();
}
networkDiscovery.StopDiscovery();
// we need to call setup canvas a second time in this function for it to update the abovee changes
SetupCanvas();
}
public void ButtonAuto()
{
SetupInfoText("Auto Starting.");
StartCoroutine(Waiter());
}
// manually call canvas changes for performance, can lazily be done via Update()
public void SetupCanvas()
{
// Here we will dump majority of the canvas UI
if (NetworkManager.singleton == null)
{
SetupInfoText("NetworkManager null");
return;
}
// check network status, and show required UI
if (!NetworkClient.isConnected && !NetworkServer.active)
{
if (NetworkClient.active)
{
PanelStart.SetActive(false);
PanelStop.SetActive(true);
}
else
{
PanelStart.SetActive(true);
PanelStop.SetActive(false);
}
}
else
{
PanelStart.SetActive(false);
PanelStop.SetActive(true);
}
}
// useful status info to display on screen
public void SetupInfoText(string _info)
{
infoText.text = _info;
SetupCanvas();
}
// Invoked when the value of the text field changes.
public void OnValueChangedAddress()
{
NetworkManager.singleton.networkAddress = inputFieldAddress.text;
}
}
}