Я разрабатываю многопользовательскую игру по локальной сети с использованием UNET.
Я использовал многоадресную рассылку UDP для передачи IP-адреса сервера, и другие устройства могут его прослушивать.
У меня есть расширенный сетевой менеджер для некоторых необходимых настроек пользовательского интерфейса.
Устройство, которое делает сервер, может транслировать свой IP-адрес, а другое устройство автоматически получает IP-адрес сервера (это также может быть имя игры) в списке.
При выборе сервера клиент может присоединиться к игре. Я избежал ситуации, когда пользователь вводит ip.
Я счастлив, потому что это работает успешно, когда все игроки играют через маршрутизатор.
Худшая часть начинается, когда я делаю любое устройство точкой доступа Wi-Fi, и к нему присоединяется другое устройство.
Даже создание сервера не удается.
Я также могу поделиться своим кодом, если кто-то собирается мне помочь.
Это проблема с UNET?
Нужно ли использовать какое-то конкретное решение?
В точке доступа Wi-Fi мы должны использовать другие порты, чем обычный маршрутизатор?
Я могу приложить свой код, если кто-то сталкивался с подобным.
Если это так, то как работает сетевой менеджер по умолчанию, предоставляемый единством? Он работает, если мы вводим ip .
Я добавил несколько дополнительных скриптов. Пользователю sao не нужно писать ip и слушать сообщение сервера.
Я думаю, что мой код ломается из-за многоадресной рассылки udp или проблемы с портом.
Прикрепляю свой код.
Код сервера:
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.Networking.NetworkSystem;
using System.Collections;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Net;
using System.Text;
using UnityEngine.UI;
using UnityEngine.Networking; // added for test
public class ServerDemoSample : MonoBehaviour
{
public static ServerDemoSample instance;
//public byte[] buffer;
UdpClient serverOriginator;
public string serverIP;
public int broadcastPort = 8080; //THIS IS ORIGINAL
//int broadcastPort = 7777;
public IPAddress groupIP = IPAddress.Parse ("239.0.0.222");
//public IPAddress groupIP = IPAddress.Parse ("224.0.1.0");
public IPEndPoint remoteEP;
public Text myIpText;
public bool isRunning;
public Button startGameButton;
public Button creatServerButton;
public bool iAmServer = false;
void Start ()
{
//DontDestroyOnLoad (gameObject);
myIpText.text = Network.player.ipAddress;
}
void Update()
{
}
public void BroadcastServerIP()
{
Debug.Log(Time.realtimeSinceStartup + ": Broadcasting IP:" + serverIP);
byte[] buffer = ASCIIEncoding.ASCII.GetBytes(serverIP);
serverOriginator.Send(buffer, buffer.Length, remoteEP);
GLOBALS.instance.serverIpAddress = serverIP;
isRunning = true;
}
public void StartServer()
{
serverIP = Network.player.ipAddress;
iAmServer = true;
GLOBALS.instance.iAmGlobalServer = true;
//Create UDP Client for broadcasting the server
serverOriginator = new UdpClient();
serverOriginator.JoinMulticastGroup(groupIP);
remoteEP = new IPEndPoint(groupIP, broadcastPort);
GLOBALS.instance.serverIpAddress = serverIP;
creatServerButton.transform.FindChild("Text").GetComponent<Text>().text = "Server Created!";
//Broadcast IP
InvokeRepeating("BroadcastServerIP", 0, 1f);
print ("Server IP (SERVER_SCRIPT) : " + serverIP);
}
}
Код клиента:
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
using UnityEngine.Networking.NetworkSystem;
using System;
using System.Net;
using System.Text;
using System.Net.Sockets;
using System.Collections;
using System.Collections.Generic;
public class ClientDemoScript : MonoBehaviour
{
public static ClientDemoScript instance;
UdpClient client;
int receivePort = 8080; //THIS IS ORIGINAL
public string serverIP_;
IPAddress groupIP_ = IPAddress.Parse("239.0.0.222");
public string ipFound;
byte[] receivedBytes = {0,0,0,0}; // made private for all
IPEndPoint remoteEP_;
public Text serverIp2Text;
public string results;
public Text displayServerList;
public List<string> receivedIpList = new List<string>();
void Start ()
{
instance = this;
JoinServer();
}
void Update()
{
serverIp2Text.text = results;
}
public void ReceiveServerInfo(IAsyncResult result)
{
Debug.Log("Received Server Info");
remoteEP_ = new IPEndPoint(IPAddress.Any, receivePort);
if (client != null)
{
if (result != null)
{
receivedBytes = client.EndReceive (result, ref remoteEP_);
}
else
{
return;
}
}
ipFound = Encoding.ASCII.GetString (receivedBytes); //made public var
if (!receivedIpList.Contains (ipFound))
{
receivedIpList.Add (ipFound);
}
Debug.Log("ip: "+ ipFound);
client.BeginReceive (new AsyncCallback (ReceiveServerInfo), null);
GLOBALS.instance.serverIpAddress = ipFound;
}
public void JoinServer()
{
if (client == null)
{
client = new UdpClient(receivePort);
client.JoinMulticastGroup(groupIP_);
}
client.BeginReceive (new AsyncCallback (ReceiveServerInfo), null);
}
}