UNET を使用して LAN マルチプレイヤー ゲームを開発しています。
UDPマルチキャストを使用してサーバーIPをブロードキャストし、他のデバイスがそれをリッスンできます.
一部の UI カスタマイズが必要なため、ネットワーク マネージャーを拡張しました。
サーバーを作成するデバイスはそのIPをブロードキャストでき、他のデバイスは自動的にリスト内のサーバーIP(ゲーム名でもかまいません)を取得します
サーバーを選択すると、クライアントはゲームに参加できます。ユーザーがipを入力する状況を回避しました。
すべてのプレーヤーがルーター経由でプレイするときに問題なく動作するので満足しています。
最悪の部分は、Wifi ホットスポットと他のデバイスが参加するデバイスを作成するときに始まります。
サーバーの作成も失敗します。
誰かが私を助けてくれるなら、私のコードも共有できます。
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);
}
}