unity3d
ネットワーキング
サーチ…
備考
Unityのヘッドレスモード
Linuxで展開するサーバーを構築する場合、ビルド設定には「ヘッドレスモード」オプションがあります。このオプションを使用してアプリケーションをビルドすると、何も表示されず、ユーザーの入力が読み取られません。これは通常、サーバーにとって必要なものです。
サーバー、クライアントを作成し、メッセージを送信する。
Unityネットワークは、低レベルの実装から抽象化されたネットワーク通信を処理するための高水準API(HLA)を提供します。
この例では、1つまたは複数のクライアントと通信できるサーバーを作成する方法を説明します。
HLAでは、クラスをシリアライズして、このクラスのオブジェクトをネットワーク経由で簡単に送信することができます。
シリアライズするために使用しているクラス
このクラスはMessageBaseから継承する必要があります。この例では、このクラス内に文字列を送信します。
using System;
using UnityEngine.Networking;
public class MyNetworkMessage : MessageBase
{
public string message;
}
サーバーの作成
ポート9999をリッスンし、最大10の接続を許可し、カスタムクラスのネットワークからオブジェクトを読み込むサーバーを作成します。
HLAは異なるタイプのメッセージをIDに関連付ける。 Unity NetworkingのMsgTypeクラスで定義されているデフォルトのメッセージタイプがあります。たとえば、接続タイプはID 32を持ち、クライアントが接続するときにサーバで呼び出されます。サーバに接続するときにクライアントで呼び出されます。ハンドラを登録して、さまざまな種類のメッセージを管理できます。
私たちの場合のようにカスタムクラスを送信するときには、ネットワーク経由で送信するクラスに関連付けられた新しいIDを持つハンドラを定義します。
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class Server : MonoBehaviour {
int port = 9999;
int maxConnections = 10;
// The id we use to identify our messages and register the handler
short messageID = 1000;
// Use this for initialization
void Start () {
// Usually the server doesn't need to draw anything on the screen
Application.runInBackground = true;
CreateServer();
}
void CreateServer() {
// Register handlers for the types of messages we can receive
RegisterHandlers ();
var config = new ConnectionConfig ();
// There are different types of channels you can use, check the official documentation
config.AddChannel (QosType.ReliableFragmented);
config.AddChannel (QosType.UnreliableFragmented);
var ht = new HostTopology (config, maxConnections);
if (!NetworkServer.Configure (ht)) {
Debug.Log ("No server created, error on the configuration definition");
return;
} else {
// Start listening on the defined port
if(NetworkServer.Listen (port))
Debug.Log ("Server created, listening on port: " + port);
else
Debug.Log ("No server created, could not listen to the port: " + port);
}
}
void OnApplicationQuit() {
NetworkServer.Shutdown ();
}
private void RegisterHandlers () {
// Unity have different Messages types defined in MsgType
NetworkServer.RegisterHandler (MsgType.Connect, OnClientConnected);
NetworkServer.RegisterHandler (MsgType.Disconnect, OnClientDisconnected);
// Our message use his own message type.
NetworkServer.RegisterHandler (messageID, OnMessageReceived);
}
private void RegisterHandler(short t, NetworkMessageDelegate handler) {
NetworkServer.RegisterHandler (t, handler);
}
void OnClientConnected(NetworkMessage netMessage)
{
// Do stuff when a client connects to this server
// Send a thank you message to the client that just connected
MyNetworkMessage messageContainer = new MyNetworkMessage();
messageContainer.message = "Thanks for joining!";
// This sends a message to a specific client, using the connectionId
NetworkServer.SendToClient(netMessage.conn.connectionId,messageID,messageContainer);
// Send a message to all the clients connected
messageContainer = new MyNetworkMessage();
messageContainer.message = "A new player has conencted to the server";
// Broadcast a message a to everyone connected
NetworkServer.SendToAll(messageID,messageContainer);
}
void OnClientDisconnected(NetworkMessage netMessage)
{
// Do stuff when a client dissconnects
}
void OnMessageReceived(NetworkMessage netMessage)
{
// You can send any object that inherence from MessageBase
// The client and server can be on different projects, as long as the MyNetworkMessage or the class you are using have the same implementation on both projects
// The first thing we do is deserialize the message to our custom type
var objectMessage = netMessage.ReadMessage<MyNetworkMessage>();
Debug.Log("Message received: " + objectMessage.message);
}
}
クライアント
今度はクライアントを作成します
using System;
using UnityEngine;
using UnityEngine.Networking;
public class Client : MonoBehaviour
{
int port = 9999;
string ip = "localhost";
// The id we use to identify our messages and register the handler
short messageID = 1000;
// The network client
NetworkClient client;
public Client ()
{
CreateClient();
}
void CreateClient()
{
var config = new ConnectionConfig ();
// Config the Channels we will use
config.AddChannel (QosType.ReliableFragmented);
config.AddChannel (QosType.UnreliableFragmented);
// Create the client ant attach the configuration
client = new NetworkClient ();
client.Configure (config,1);
// Register the handlers for the different network messages
RegisterHandlers();
// Connect to the server
client.Connect (ip, port);
}
// Register the handlers for the different message types
void RegisterHandlers () {
// Unity have different Messages types defined in MsgType
client.RegisterHandler (messageID, OnMessageReceived);
client.RegisterHandler(MsgType.Connect, OnConnected);
client.RegisterHandler(MsgType.Disconnect, OnDisconnected);
}
void OnConnected(NetworkMessage message) {
// Do stuff when connected to the server
MyNetworkMessage messageContainer = new MyNetworkMessage();
messageContainer.message = "Hello server!";
// Say hi to the server when connected
client.Send(messageID,messageContainer);
}
void OnDisconnected(NetworkMessage message) {
// Do stuff when disconnected to the server
}
// Message received from the server
void OnMessageReceived(NetworkMessage netMessage)
{
// You can send any object that inherence from MessageBase
// The client and server can be on different projects, as long as the MyNetworkMessage or the class you are using have the same implementation on both projects
// The first thing we do is deserialize the message to our custom type
var objectMessage = netMessage.ReadMessage<MyNetworkMessage>();
Debug.Log("Message received: " + objectMessage.message);
}
}
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow