NetworkDiscoveryHUD.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. namespace Mirror.Discovery
  4. {
  5. [DisallowMultipleComponent]
  6. [AddComponentMenu("Network/NetworkDiscoveryHUD")]
  7. [HelpURL("https://mirror-networking.gitbook.io/docs/components/network-discovery")]
  8. [RequireComponent(typeof(NetworkDiscovery))]
  9. public class NetworkDiscoveryHUD : MonoBehaviour
  10. {
  11. readonly Dictionary<long, ServerResponse> discoveredServers = new Dictionary<long, ServerResponse>();
  12. Vector2 scrollViewPos = Vector2.zero;
  13. public NetworkDiscovery networkDiscovery;
  14. #if UNITY_EDITOR
  15. void OnValidate()
  16. {
  17. if (networkDiscovery == null)
  18. {
  19. networkDiscovery = GetComponent<NetworkDiscovery>();
  20. UnityEditor.Events.UnityEventTools.AddPersistentListener(networkDiscovery.OnServerFound, OnDiscoveredServer);
  21. UnityEditor.Undo.RecordObjects(new Object[] { this, networkDiscovery }, "Set NetworkDiscovery");
  22. }
  23. }
  24. #endif
  25. void OnGUI()
  26. {
  27. if (NetworkManager.singleton == null)
  28. return;
  29. if (!NetworkClient.isConnected && !NetworkServer.active && !NetworkClient.active)
  30. DrawGUI();
  31. if (NetworkServer.active || NetworkClient.active)
  32. StopButtons();
  33. }
  34. void DrawGUI()
  35. {
  36. GUILayout.BeginArea(new Rect(10, 10, 300, 500));
  37. GUILayout.BeginHorizontal();
  38. if (GUILayout.Button("Find Servers"))
  39. {
  40. discoveredServers.Clear();
  41. networkDiscovery.StartDiscovery();
  42. }
  43. // LAN Host
  44. if (GUILayout.Button("Start Host"))
  45. {
  46. discoveredServers.Clear();
  47. NetworkManager.singleton.StartHost();
  48. networkDiscovery.AdvertiseServer();
  49. }
  50. // Dedicated server
  51. if (GUILayout.Button("Start Server"))
  52. {
  53. discoveredServers.Clear();
  54. NetworkManager.singleton.StartServer();
  55. networkDiscovery.AdvertiseServer();
  56. }
  57. GUILayout.EndHorizontal();
  58. // show list of found server
  59. GUILayout.Label($"Discovered Servers [{discoveredServers.Count}]:");
  60. // servers
  61. scrollViewPos = GUILayout.BeginScrollView(scrollViewPos);
  62. foreach (ServerResponse info in discoveredServers.Values)
  63. if (GUILayout.Button(info.EndPoint.Address.ToString()))
  64. Connect(info);
  65. GUILayout.EndScrollView();
  66. GUILayout.EndArea();
  67. }
  68. void StopButtons()
  69. {
  70. GUILayout.BeginArea(new Rect(10, 40, 100, 25));
  71. // stop host if host mode
  72. if (NetworkServer.active && NetworkClient.isConnected)
  73. {
  74. if (GUILayout.Button("Stop Host"))
  75. {
  76. NetworkManager.singleton.StopHost();
  77. networkDiscovery.StopDiscovery();
  78. }
  79. }
  80. // stop client if client-only
  81. else if (NetworkClient.isConnected)
  82. {
  83. if (GUILayout.Button("Stop Client"))
  84. {
  85. NetworkManager.singleton.StopClient();
  86. networkDiscovery.StopDiscovery();
  87. }
  88. }
  89. // stop server if server-only
  90. else if (NetworkServer.active)
  91. {
  92. if (GUILayout.Button("Stop Server"))
  93. {
  94. NetworkManager.singleton.StopServer();
  95. networkDiscovery.StopDiscovery();
  96. }
  97. }
  98. GUILayout.EndArea();
  99. }
  100. void Connect(ServerResponse info)
  101. {
  102. networkDiscovery.StopDiscovery();
  103. NetworkManager.singleton.StartClient(info.uri);
  104. }
  105. public void OnDiscoveredServer(ServerResponse info)
  106. {
  107. // Note that you can check the versioning to decide if you can connect to the server or not using this method
  108. discoveredServers[info.serverId] = info;
  109. }
  110. }
  111. }