using System; using UnityEngine; using Unity.Netcode; using Unity.Netcode.Transports.UTP; namespace Colosseum.UI { /// /// 네트워크 연결 설정 (Inspector에서 제어) /// public class ConnectionUI : MonoBehaviour { [Header("Connection Settings")] [SerializeField] private string ipAddress = "127.0.0.1"; [SerializeField] private ushort port = 7777; [Header("Editor Test")] [Tooltip("에디터 Play Mode 진입 시 자동으로 Host를 시작합니다")] [SerializeField] private bool autoStartHostInEditor = false; [Header("Status (Read Only)")] [SerializeField, Tooltip("현재 연결 상태")] private string connectionStatus = "Disconnected"; private UnityTransport transport; private void Awake() { transport = NetworkManager.Singleton?.GetComponent(); } private void Start() { UpdateTransportSettings(); #if UNITY_EDITOR if (autoStartHostInEditor && NetworkManager.Singleton != null && !NetworkManager.Singleton.IsListening) { if (IsVirtualProjectClone()) StartClient(); else StartHost(); } #endif } private void Update() { UpdateConnectionStatus(); } private void UpdateConnectionStatus() { if (NetworkManager.Singleton == null) { connectionStatus = "No NetworkManager"; return; } if (NetworkManager.Singleton.IsServer && NetworkManager.Singleton.IsHost) connectionStatus = "Host"; else if (NetworkManager.Singleton.IsServer) connectionStatus = "Server"; else if (NetworkManager.Singleton.IsClient) connectionStatus = NetworkManager.Singleton.IsConnectedClient ? "Connected" : "Connecting..."; else connectionStatus = "Disconnected"; } public void StartHost() { UpdateTransportSettings(); NetworkManager.Singleton.StartHost(); Debug.Log("[Network] Started as Host"); } public void StartClient() { UpdateTransportSettings(); NetworkManager.Singleton.StartClient(); Debug.Log($"[Network] Connecting to {ipAddress}:{port}..."); } public void StartServer() { UpdateTransportSettings(); NetworkManager.Singleton.StartServer(); Debug.Log("[Network] Started as Server"); } public void Disconnect() { if (NetworkManager.Singleton != null) { NetworkManager.Singleton.Shutdown(); Debug.Log("[Network] Disconnected"); } } private void UpdateTransportSettings() { if (transport != null) { transport.SetConnectionData(ipAddress, port); } } private void OnValidate() { if (Application.isPlaying && transport != null) { UpdateTransportSettings(); } } /// /// MPP 가상 플레이어 복제본 에디터인지 확인합니다. /// private static bool IsVirtualProjectClone() { string[] arguments = Environment.GetCommandLineArgs(); for (int i = 0; i < arguments.Length; i++) { if (string.Equals(arguments[i], "--virtual-project-clone", StringComparison.OrdinalIgnoreCase)) return true; } return false; } } }