网络功能插件Mirror学习笔记

2020-03-02  本文已影响0人  sky嗨嗨

写在前面

!!本文章不具有参考意义!!
主要作者健忘所以学明白了就写下来给未来忘掉的自己看(x

关键词

  1. LLAPI:Low Level Application Program Interface
  2. HLAPI:High Level Application Program Interface

Message

  1. 通过继承MessageBase或者实现IMessageBase,自定义Message类内可以包含自己想传递的数据,比如玩家昵称玩家等级,etc

  2. 系统底层代码在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之类的

つづく

上一篇下一篇

猜你喜欢

热点阅读