Important: UNet adalah solusi yang diuraikan, dan Solusi Multiplayer baru dan NetworkingSistem Unity yang memungkinkan game multiplayer di jaringan komputer. More info Lihat di Glossary (Netcode untuk GameObjects) sedang berkembang. Untuk informasi lebih lanjut dan langkah selanjutnya melihat informasi di . |
Selain perintah “tingkat tinggi” dan panggilan RPC, Anda juga dapat mengirim pesan jaringan mentah.
Ada kelas yang disebut MessageBase yang dapat Anda perpanjangkan untuk membuat kelas pesan jaringan serializable. Kelas ini memiliki fungsi Serialize dan Deserialize yang mengambil objek penulis dan pembaca. Anda dapat menerapkan fungsi-fungsi ini sendiri, atau Anda dapat mengandalkan implementasi yang dihasilkan oleh sistem jaringan. Kelas dasar terlihat seperti ini:
public abstract class MessageBase
{
// De-serialize the contents of the reader into this message
public virtual void Deserialize(NetworkReader reader) {}
// Serialize the contents of this message into the writer
public virtual void Serialize(NetworkWriter writer) {}
}
Kelas pesan dapat berisi anggota yang merupakan jenis dasar, struktur, dan array, termasuk sebagian besar jenis Mesin Unity umum (seperti Vektor3). Mereka tidak dapat mengandung anggota yang merupakan kelas kompleks atau wadah umum. Ingat bahwa jika Anda ingin mengandalkan implementasi kode-generasi, Anda harus memastikan jenis Anda terlihat secara publik.
Ada kelas pesan bawaan untuk jenis pesan jaringan yang umum:
Untuk mengirim pesan, gunakan metode Send()
pada kelas NetworkClient, NetworkServer, dan NetworkConnection yang bekerja dengan cara yang sama. Ini mengambil ID pesan, dan objek pesan yang berasal dari MessageBase. Kode di bawah ini menunjukkan cara mengirim dan menangani pesan menggunakan salah satu kelas pesan bawaan:
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.Networking.NetworkSystem;
public class Begin : NetworkBehaviour
{
const short MyBeginMsg = 1002;
NetworkClient m_client;
public void SendReadyToBeginMessage(int myId)
{
var msg = new IntegerMessage(myId);
m_client.Send(MyBeginMsg, msg);
}
public void Init(NetworkClient client)
{
m_client = client;
NetworkServer.RegisterHandler(MyBeginMsg, OnServerReadyToBeginMessage);
}
void OnServerReadyToBeginMessage(NetworkMessage netMsg)
{
var beginMessage = netMsg.ReadMessage<IntegerMessage>();
Debug.Log("received OnServerReadyToBeginMessage " + beginMessage.value);
}
}
Untuk menyatakan kelas pesan jaringan kustom dan menggunakannya:
using UnityEngine;
using UnityEngine.Networking;
public class Scores : MonoBehaviour
{
NetworkClient myClient;
public class MyMsgType {
public static short Score = MsgType.Highest + 1;
};
public class ScoreMessage : MessageBase
{
public int score;
public Vector3 scorePos;
public int lives;
}
public void SendScore(int score, Vector3 scorePos, int lives)
{
ScoreMessage msg = new ScoreMessage();
msg.score = score;
msg.scorePos = scorePos;
msg.lives = lives;
NetworkServer.SendToAll(MyMsgType.Score, msg);
}
// Create a client and connect to the server port
public void SetupClient()
{
myClient = new NetworkClient();
myClient.RegisterHandler(MsgType.Connect, OnConnected);
myClient.RegisterHandler(MyMsgType.Score, OnScore);
myClient.Connect("127.0.0.1", 4444);
}
public void OnScore(NetworkMessage netMsg)
{
ScoreMessage msg = netMsg.ReadMessage<ScoreMessage>();
Debug.Log("OnScoreMessage " + msg.score);
}
public void OnConnected(NetworkMessage netMsg)
{
Debug.Log("Connected to server");
}
}
Perhatikan bahwa tidak ada kode serialisasi untuk kelas ScoreMessage
dalam contoh kode sumber ini. Tubuh fungsi serialisasi secara otomatis dihasilkan untuk kelas ini oleh Unity.
Ada juga kelas ErrorMessage yang berasal dari MessageBase
. Kelas ini dilewatkan ke callback kesalahan pada klien dan server.
errorCode di kelas KesalahanMessage sesuai dengan numerasi Login Login.
class MyClient
{
NetworkClient client;
void Start()
{
client = new NetworkClient();
client.RegisterHandler(MsgType.Error, OnError);
}
void OnError(NetworkMessage netMsg)
{
var errorMsg = netMsg.ReadMessage<ErrorMessage>();
Debug.Log("Error:" + errorMsg.errorCode);
}
}