网络功能插件Mirror学习笔记
2020-03-02 本文已影响0人
sky嗨嗨
写在前面
!!本文章不具有参考意义!!
主要作者健忘所以学明白了就写下来给未来忘掉的自己看(x
关键词
- LLAPI:Low Level Application Program Interface
- HLAPI:High Level Application Program Interface
Message
-
通过继承MessageBase或者实现IMessageBase,自定义Message类内可以包含自己想传递的数据,比如玩家昵称玩家等级,etc
-
系统底层代码在Send的时候会自动把被传message内的Serialize方法内参数NetworkWriter和Deserialize方法内参数NetworkReader赋值
例子:每次在Client连接到Server的时候发一个消息,打印一句Hello world
using UnityEngine;
using Mirror;
public class TestMsg : MessageBase {
public string msg;
public override void Serialize(NetworkWriter writer) {
writer.WriteString(msg);
}
public override void Deserialize(NetworkReader reader) {
msg = reader.ReadString();
}
}
public class Debugger : NetworkManager {
public override void OnStartServer() {
base.OnStartServer();
NetworkServer.RegisterHandler<TestMsg>(OnTestMsg);
}
public override void OnClientConnect(NetworkConnection conn) {
base.OnClientConnect(conn);
var testMsg = new TestMsg() { msg = "hello world" };
NetworkClient.Send<TestMsg>(testMsg);
}
private void OnTestMsg(NetworkConnection conn, TestMsg testMsg) {
Debug.Log(testMsg.msg);
}
}
Serialize & Deserialize方法
NetworkWriter会把数据连成一串,猜测内部是一个queue一样的数据结构。NetworkReader通过调取不同读取方法ReadString()、ReaderByte()、etc来读取这一串数据的末尾,遵循先进先出原则,所以write的顺序要和read的顺序一样。
至于为什么需要Serialize/Deserialize,可能因为LLAPI传输数据的方法都是传输一样的格式的数据吧(比如byte之类的
つづく