65 lines
1.7 KiB
C#
65 lines
1.7 KiB
C#
using UnityEngine;
|
||
using Mirror;
|
||
using Mirror.Discovery;
|
||
using Cysharp.Threading.Tasks;
|
||
using System.Collections.Generic;
|
||
using System.Threading.Tasks;
|
||
|
||
namespace Tuan.GameFramework
|
||
{
|
||
public class AutoStart : MonoBehaviour
|
||
{
|
||
public NetworkManager networkManager;
|
||
public NetworkDiscovery networkDiscovery;
|
||
|
||
public float waitForHostTimeout = 1f;
|
||
|
||
private bool hostFound = false;
|
||
private async void Start()
|
||
{
|
||
networkDiscovery.OnServerFound.AddListener(OnServerFound);
|
||
await Connect();
|
||
}
|
||
|
||
private async UniTask Connect()
|
||
{
|
||
if (networkManager == null || networkDiscovery == null)
|
||
{
|
||
Debug.LogError("请确认 NetworkManager 和 NetworkDiscovery 已设置");
|
||
return;
|
||
}
|
||
|
||
hostFound = false;
|
||
|
||
networkDiscovery.StartDiscovery();
|
||
|
||
await UniTask.WaitForSeconds(1.1f);
|
||
|
||
if (!hostFound)
|
||
{
|
||
Debug.Log("未发现 Host,自己成为 Host");
|
||
networkManager.StartHost();
|
||
networkDiscovery.AdvertiseServer();
|
||
}
|
||
}
|
||
|
||
private void OnServerFound(ServerResponse info)
|
||
{
|
||
if (hostFound) return;
|
||
|
||
hostFound = true;
|
||
Debug.Log($"发现 Host: {info.uri.Host}");
|
||
|
||
networkDiscovery.StopDiscovery();
|
||
|
||
networkManager.networkAddress = info.uri.Host;
|
||
networkManager.StartClient();
|
||
}
|
||
|
||
private void OnDestroy()
|
||
{
|
||
if (networkDiscovery != null)
|
||
networkDiscovery.OnServerFound.RemoveListener(OnServerFound);
|
||
}
|
||
}
|
||
} |