重要: UNet は非推奨のソリューションになり、現在、新しい Multiplayer とネットワーキングソリューション (Netcode for GameObjects) が開発中です。詳細は、GameObjects Web サイトの Unity Netcode を参照してください。 |
バイトストリームにデータを書き込むには NetworkReader クラスと NetworkWriter クラスを使用しします。
Multiplayer 高レベル API は、これらのクラスを使用して構築されており、これらを広範囲に使用します。ただし、カスタムのトランスポート機能を実装する場合は、これらを直接使用できます。NetworkReader と NetworkWriter には、多くの Unity 型のための特定のシリアライズ関数があります (完全なリストは、NetworkWriter.Write を参照してください)。
クラスを使用するには、書き込み用インスタンスを作成し、それに個々の変数を書き込みます。これらは内部的にバイト配列にシリアライズされ、ネットワークを通して送信されます。受信側では、バイト配列の読み込み用インスタンスが書き込まれたのとまったく同じ順序で変数を読み戻すことが重要です。
これは、MessageBase クラスと共に使用して、シリアル化されたネットワークメッセージを含むバイト配列を作成することができます。
void SendMessage(short msgType, MessageBase msg, int channelId)
{
// メッセージをローカルバッファーに書き込みます
NetworkWriter writer = new NetworkWriter();
writer.StartMessage(msgType);
msg.Serialize(writer);
writer.FinishMessage();
myClient.SendWriter(writer, channelId);
}
メッセージは正しくフォーマットされているため、メッセージハンドラー関数を呼び出すことができます。
以下のコードサンプルは、むしろ低レベルの例で、接続を設定するために高レベル API 内の最低レベルのクラスを使用しています。
これは、クライアントとサーバーを接続するためのコードです。
using UnityEngine;
using UnityEngine.Networking;
public class Serializer : MonoBehaviour {
NetworkServerSimple m_Server;
NetworkClient m_Client;
const short k_MyMessage = 100;
// このようにサーバーインスタンスを使用すると、手動で起動する必要があります
void Update() {
if (m_Server != null)
m_Server.Update();
}
void StartServer() {
m_Server = new NetworkServerSimple();
m_Server.RegisterHandler(k_MyMessage, OnMyMessage);
if (m_Server.Listen(5555))
Debug.Log("Started listening on 5555");
}
void StartClient() {
m_Client = new NetworkClient();
m_Client.RegisterHandler(MsgType.Connect, OnClientConnected);
m_Client.Connect("127.0.0.1", 5555);
}
void OnClientConnected(NetworkMessage netmsg) {
Debug.Log("Client connected to server");
SendMessage();
}
}
次のコードは、NetworkReader と NetworkWriter を使用してメッセージを送信しますが、これらのクラスに組み込まれたメッセージハンドラーを使用します。
void SendMessage() {
NetworkWriter writer = new NetworkWriter();
writer.StartMessage(k_MyMessage);
writer.Write(42);
writer.Write("What is the answer");
writer.FinishMessage();
m_Client.SendWriter(writer, 0);
}
void OnMyMessage(NetworkMessage netmsg) {
Debug.Log("Got message, size=" + netmsg.reader.Length);
var someValue = netmsg.reader.ReadInt32();
var someString = netmsg.reader.ReadString();
Debug.Log("Message value=" + someValue + " Message string='" + someString + "'");
}
メッセージハンドラーのメッセージを設定するときは常に、NetworkWriter.StartMessage()
(メッセージタイプ ID をパラメーターとして持つ) と NetworkWriter.FinishMessage() の呼び出しを使用する必要があります。バイト配列を使用しない場合は、そのステップを省くことができます。