Files
VR-WuKong/Assets/GameFramework/Runtime/Network/AutoStart.cs

100 lines
3.1 KiB
C#
Raw Normal View History

2025-11-17 00:31:20 +08:00
using Cysharp.Threading.Tasks;
2025-11-13 17:40:28 +08:00
using Mirror;
using Mirror.Discovery;
using System.Collections.Generic;
2025-11-17 00:31:20 +08:00
using UnityEngine;
2025-11-13 17:40:28 +08:00
namespace Tuan.GameFramework
{
public class AutoStart : MonoBehaviour
{
2025-11-17 00:31:20 +08:00
public bool alwaysAutoStart = false;
public VRNetworkDiscovery networkDiscovery;
readonly Dictionary<long, ServerResponse> discoveredServers = new Dictionary<long, ServerResponse>();
2025-11-13 17:40:28 +08:00
public float waitForHostTimeout = 1f;
private async void Start()
{
2025-11-17 00:31:20 +08:00
// skips waiting for users to press ui button
if (alwaysAutoStart)
{
await Waiter();
}
2025-11-13 17:40:28 +08:00
}
2025-11-17 00:31:20 +08:00
public async UniTask Waiter()
2025-11-13 17:40:28 +08:00
{
2025-11-17 00:31:20 +08:00
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
await UniTask.WaitForSeconds(waitForHostTimeout);
if (discoveredServers == null || discoveredServers.Count <= 0)
2025-11-13 17:40:28 +08:00
{
2025-11-17 00:31:20 +08:00
Debug.Log("No Servers found, starting as Host.");
await UniTask.WaitForSeconds(0.1f);
discoveredServers.Clear();
VRNetworkManager.singleton.StartHost();
networkDiscovery.AdvertiseServer();
2025-11-13 17:40:28 +08:00
}
2025-11-17 00:31:20 +08:00
}
2025-11-13 17:40:28 +08:00
2025-11-17 00:31:20 +08:00
void Connect(ServerResponse info)
{
Debug.Log($"Connecting to: {info.uri.Host}");
networkDiscovery.StopDiscovery();
VRNetworkManager.singleton.StartClient(info.uri);
}
2025-11-13 17:40:28 +08:00
2025-11-17 00:31:20 +08:00
public void OnDiscoveredServer(ServerResponse info)
{
discoveredServers[info.serverId] = info;
Connect(info);
}
2025-11-13 17:40:28 +08:00
2025-11-17 00:31:20 +08:00
public void StartAsHost()
{
Debug.Log("Starting as host");
discoveredServers.Clear();
VRNetworkManager.singleton.StartHost();
networkDiscovery.AdvertiseServer();
2025-11-13 17:40:28 +08:00
}
2025-11-17 00:31:20 +08:00
public void StartAsServer()
2025-11-13 17:40:28 +08:00
{
2025-11-17 00:31:20 +08:00
Debug.Log("Starting as server");
discoveredServers.Clear();
// VRNetworkManager.singleton.onlineScene = SceneManager.GetActiveScene().name;
VRNetworkManager.singleton.StartServer();
networkDiscovery.AdvertiseServer();
2025-11-13 17:40:28 +08:00
2025-11-17 00:31:20 +08:00
}
2025-11-13 17:40:28 +08:00
2025-11-17 00:31:20 +08:00
public void StartAsClient()
{
Debug.Log("Starting as client.");
discoveredServers.Clear();
networkDiscovery.StartDiscovery();
2025-11-13 17:40:28 +08:00
}
2025-11-17 00:31:20 +08:00
public void Stop()
2025-11-13 17:40:28 +08:00
{
2025-11-17 00:31:20 +08:00
Debug.Log("Stopping");
// stop host if host mode
if (NetworkServer.active && NetworkClient.isConnected)
{
VRNetworkManager.singleton.StopHost();
}
// stop client if client-only
else if (NetworkClient.isConnected)
{
VRNetworkManager.singleton.StopClient();
}
// stop server if server-only
else if (NetworkServer.active)
{
VRNetworkManager.singleton.StopServer();
}
networkDiscovery.StopDiscovery();
2025-11-13 17:40:28 +08:00
}
}
}