您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
98 行
2.7 KiB
98 行
2.7 KiB
using UnityEngine;
|
|
using UnityEngine.Networking;
|
|
//using NetworkWriter = UnityEngine.Networking.NetworkWriter;
|
|
|
|
public class UNETServerBroadcast
|
|
{
|
|
public struct GameInfo
|
|
{
|
|
public uint token;
|
|
public string servername;
|
|
public string levelname;
|
|
public string gamemode;
|
|
public int connectedPlayers;
|
|
public int maxPlayers;
|
|
}
|
|
|
|
public GameInfo gameInfo;
|
|
|
|
public UNETServerBroadcast(int hostId, UNETBroadcastConfig config, int serverPort)
|
|
{
|
|
m_HostId = hostId;
|
|
m_Config = config;
|
|
m_ServerPort = serverPort;
|
|
|
|
m_Msg = new byte[1024];
|
|
}
|
|
|
|
public void Start()
|
|
{
|
|
UpdateGameInfo();
|
|
m_Broadcasting = true;
|
|
m_PendingStartAttempts = 3;
|
|
}
|
|
|
|
public void UpdateBroadcast()
|
|
{
|
|
if(m_PendingStartAttempts > 0)
|
|
{
|
|
--m_PendingStartAttempts;
|
|
StartInternal();
|
|
}
|
|
}
|
|
|
|
public void Stop()
|
|
{
|
|
m_Broadcasting = false;
|
|
NetworkTransport.StopBroadcastDiscovery();
|
|
m_PendingStartAttempts = 0;
|
|
}
|
|
|
|
public void UpdateGameInfo()
|
|
{
|
|
var writer = new NetworkWriter(m_Msg, null);
|
|
|
|
writer.WriteInt32("serverPort", m_ServerPort);
|
|
writer.WriteUInt32("token", gameInfo.token);
|
|
writer.WriteString("servername", gameInfo.servername);
|
|
writer.WriteString("levelname", gameInfo.levelname);
|
|
writer.WriteString("gamemode", gameInfo.gamemode);
|
|
writer.WriteInt32("connectedPlayers", gameInfo.connectedPlayers);
|
|
writer.WriteInt32("maxPlayers", gameInfo.maxPlayers);
|
|
writer.Flush();
|
|
m_MsgSize = writer.GetLength();
|
|
|
|
if (m_Broadcasting)
|
|
{
|
|
// TODO : We have to restart the broadcast to update the message but we cannot
|
|
// do this in a single frame since we have to wait for some internal state in UNET
|
|
// to reset, so we try 3 times
|
|
NetworkTransport.StopBroadcastDiscovery();
|
|
m_PendingStartAttempts = 3;
|
|
}
|
|
}
|
|
|
|
void StartInternal()
|
|
{
|
|
GameDebug.Assert(m_Broadcasting);
|
|
|
|
if (NetworkTransport.IsBroadcastDiscoveryRunning())
|
|
NetworkTransport.StopBroadcastDiscovery();
|
|
|
|
byte err;
|
|
if (NetworkTransport.StartBroadcastDiscovery(m_HostId, m_Config.port, m_Config.key, m_Config.version, m_Config.subVersion, m_Msg, m_MsgSize, k_BroadcastInterval, out err))
|
|
m_PendingStartAttempts = 0;
|
|
}
|
|
|
|
int m_HostId;
|
|
int m_ServerPort;
|
|
UNETBroadcastConfig m_Config;
|
|
|
|
bool m_Broadcasting = false;
|
|
int m_PendingStartAttempts;
|
|
|
|
byte[] m_Msg = new byte[1024];
|
|
int m_MsgSize;
|
|
|
|
const int k_BroadcastInterval = 2000;
|
|
}
|