NetworkManagerHUD.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. using UnityEngine;
  2. namespace Mirror
  3. {
  4. /// <summary>Shows NetworkManager controls in a GUI at runtime.</summary>
  5. [DisallowMultipleComponent]
  6. [AddComponentMenu("Network/Network Manager HUD")]
  7. [RequireComponent(typeof(NetworkManager))]
  8. [HelpURL("https://mirror-networking.gitbook.io/docs/components/network-manager-hud")]
  9. public class NetworkManagerHUD : MonoBehaviour
  10. {
  11. NetworkManager manager;
  12. public int offsetX;
  13. public int offsetY;
  14. void Awake()
  15. {
  16. manager = GetComponent<NetworkManager>();
  17. }
  18. void OnGUI()
  19. {
  20. // If this width is changed, also change offsetX in GUIConsole::OnGUI
  21. int width = 300;
  22. GUILayout.BeginArea(new Rect(10 + offsetX, 40 + offsetY, width, 9999));
  23. if (!NetworkClient.isConnected && !NetworkServer.active)
  24. StartButtons();
  25. else
  26. StatusLabels();
  27. if (NetworkClient.isConnected && !NetworkClient.ready)
  28. {
  29. if (GUILayout.Button("Client Ready"))
  30. {
  31. // client ready
  32. NetworkClient.Ready();
  33. if (NetworkClient.localPlayer == null)
  34. NetworkClient.AddPlayer();
  35. }
  36. }
  37. StopButtons();
  38. GUILayout.EndArea();
  39. }
  40. void StartButtons()
  41. {
  42. if (!NetworkClient.active)
  43. {
  44. #if UNITY_WEBGL
  45. // cant be a server in webgl build
  46. if (GUILayout.Button("Single Player"))
  47. {
  48. NetworkServer.dontListen = true;
  49. manager.StartHost();
  50. }
  51. #else
  52. // Server + Client
  53. if (GUILayout.Button("Host (Server + Client)"))
  54. manager.StartHost();
  55. #endif
  56. // Client + IP (+ PORT)
  57. GUILayout.BeginHorizontal();
  58. if (GUILayout.Button("Client"))
  59. manager.StartClient();
  60. manager.networkAddress = GUILayout.TextField(manager.networkAddress);
  61. // only show a port field if we have a port transport
  62. // we can't have "IP:PORT" in the address field since this only
  63. // works for IPV4:PORT.
  64. // for IPV6:PORT it would be misleading since IPV6 contains ":":
  65. // 2001:0db8:0000:0000:0000:ff00:0042:8329
  66. if (Transport.active is PortTransport portTransport)
  67. {
  68. // use TryParse in case someone tries to enter non-numeric characters
  69. if (ushort.TryParse(GUILayout.TextField(portTransport.Port.ToString()), out ushort port))
  70. portTransport.Port = port;
  71. }
  72. GUILayout.EndHorizontal();
  73. // Server Only
  74. #if UNITY_WEBGL
  75. // cant be a server in webgl build
  76. GUILayout.Box("( WebGL cannot be server )");
  77. #else
  78. if (GUILayout.Button("Server Only"))
  79. manager.StartServer();
  80. #endif
  81. }
  82. else
  83. {
  84. // Connecting
  85. GUILayout.Label($"Connecting to {manager.networkAddress}..");
  86. if (GUILayout.Button("Cancel Connection Attempt"))
  87. manager.StopClient();
  88. }
  89. }
  90. void StatusLabels()
  91. {
  92. // host mode
  93. // display separately because this always confused people:
  94. // Server: ...
  95. // Client: ...
  96. if (NetworkServer.active && NetworkClient.active)
  97. {
  98. // host mode
  99. GUILayout.Label($"<b>Host</b>: running via {Transport.active}");
  100. }
  101. else if (NetworkServer.active)
  102. {
  103. // server only
  104. GUILayout.Label($"<b>Server</b>: running via {Transport.active}");
  105. }
  106. else if (NetworkClient.isConnected)
  107. {
  108. // client only
  109. GUILayout.Label($"<b>Client</b>: connected to {manager.networkAddress} via {Transport.active}");
  110. }
  111. }
  112. void StopButtons()
  113. {
  114. if (NetworkServer.active && NetworkClient.isConnected)
  115. {
  116. GUILayout.BeginHorizontal();
  117. #if UNITY_WEBGL
  118. if (GUILayout.Button("Stop Single Player"))
  119. manager.StopHost();
  120. #else
  121. // stop host if host mode
  122. if (GUILayout.Button("Stop Host"))
  123. manager.StopHost();
  124. // stop client if host mode, leaving server up
  125. if (GUILayout.Button("Stop Client"))
  126. manager.StopClient();
  127. #endif
  128. GUILayout.EndHorizontal();
  129. }
  130. else if (NetworkClient.isConnected)
  131. {
  132. // stop client if client-only
  133. if (GUILayout.Button("Stop Client"))
  134. manager.StopClient();
  135. }
  136. else if (NetworkServer.active)
  137. {
  138. // stop server if server-only
  139. if (GUILayout.Button("Stop Server"))
  140. manager.StopServer();
  141. }
  142. }
  143. }
  144. }