Unity之NetCode多人网络游戏联机对战教程(5)--ConnectionData与MemoryPack

news2024/11/22 22:31:38

文章目录

    • 前言
    • 使用场景
    • ConnectionData
    • 数据序列化处理
    • MemoryPack
    • 安装MemoryPack
    • 日志输出
    • 后话
    • 学习链接

前言

ConnectionDataConnectionApproval 是搭配使用的,在ConnectionApproval系列讲解中涉及的几个使用场景将会在这里讲解


使用场景

  • 使用密码加入房间

  • 玩家选择不同的角色

  • 房间人数

  • 各种需要服务端下发的信息等等


ConnectionData

ConnectionData是在(NetworkManager.ConnectionApprovalRequest.Payload)的一个参数,接受客户端应该发送到服务器的任何自定义数据。连接数据在客户端的NetworkingConfig中指定(在连接时提供)。NetworkConfig.ConnectionData会自动随着连接请求消息发送到服务器,因此在调用NetworkManager.StartClient之前,应该在客户端上填充NetworkConfig.ConnectionData

  • 例子
using Unity.Netcode;

NetworkManager.Singleton.NetworkConfig.ConnectionData = System.Text.Encoding.UTF8.GetBytes("room password");
NetworkManager.Singleton.StartClient();

由客户端的NetworkConfig.ConnectionData定义的Payload将作为连接请求消息的一部分发送到服务器,服务器将使用它来决定是否批准客户端连接。连接数据是可选的,您可以使用连接批准过程来分配玩家的唯一预制体,并实现在不需要客户端发送任何连接数据的情况下在各种位置生成玩家。


数据序列化处理

当你的想传送的数据不止一点半点,这时候就要对数据进行序列化处理进行传送,这里推荐一个高效率的序列化模块 --> MemoryPack

MemoryPack

开源链接:https://github.com/Cysharp/MemoryPack

对于标准对象,MemoryPack比其他二进制序列化器快10倍,并且比其他序列化器快2到5倍。对于结构数组,MemoryPack更为强大,速度可比其他序列化器快50到200倍。

MemoryPack采用了C#特定的、经过优化的二进制格式,是一个全新的设计,利用了.NET 7和C# 11,以及增量源生成器(.NET Standard 2.1(.NET 5、6),还支持Unity)。

其他序列化器执行许多编码操作,如VarInt编码、标签、字符串等。MemoryPack格式采用了零编码设计,尽可能地复制C#内存。零编码类似于FlatBuffers,但不需要特殊类型,MemoryPack的序列化目标是POCO(普通C#对象)


安装MemoryPack

  • Unity最低版本要求:2021.3

  • 如果你使用git方式获取MemoryPack,则需要在NuGet中安装System.Runtime.CompilerServices.Unsafe/6.0.0

  • 直接导入unitypackage则不需要额外安装

下载release的unitypackage导入到项目当中


Scripts新建一个脚本ConnectionData.cs

using System;
using MemoryPack;


[MemoryPackable]
public partial class ConnectionData
{
    public readonly String Name;
    public readonly int Gender;
    public readonly String RoomPassword;
    public ConnectionData(string name, int gender, string roomPassword)
    {
        this.Name = name;
        this.Gender = gender;
        this.RoomPassword = roomPassword;
    }
}

GameManager.cs 进行数据处理反序列化

using UnityEngine;
using Unity.Netcode;
using MemoryPack;

public class GameManager : NetworkBehaviour
{
    public GameObject Man;
    public GameObject Girl;

    public override void OnNetworkSpawn()
    {
        base.OnNetworkSpawn();
        if (IsServer)
        {
            NetworkManager.ConnectionApprovalCallback = ApprovalCheck;
        }
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.O))
        {
            NetworkManager.Singleton.NetworkConfig.PlayerPrefab = Man;
            NetworkManager.Singleton.StartHost();
        }

        if (Input.GetKeyDown(KeyCode.P))
        {
            var data = new ConnectionData
            {
                Name = "NueXini",
                Gender = 0,
                RoomPassword = "NueXini's room"
            };
            var bin = MemoryPackSerializer.Serialize(data);
            NetworkManager.Singleton.NetworkConfig.ConnectionData = bin;
            NetworkManager.Singleton.StartClient();
        }
    }

    private void ApprovalCheck(NetworkManager.ConnectionApprovalRequest request, NetworkManager.ConnectionApprovalResponse response)
    {
        var clientId = request.ClientNetworkId;
        var connectionData = request.Payload;

        var data = MemoryPackSerializer.Deserialize<ConnectionData>(request.Payload);

        Debug.Log(data.Name);
        Debug.Log(data.Gender == 0 ? "男" : "女");
        Debug.Log(data.RoomPassword);

        if (data.Gender == 0)
        {
            response.PlayerPrefabHash = Girl.GetComponent<NetworkObject>().PrefabIdHash;
        }
        else
        {
            response.PlayerPrefabHash = Man.GetComponent<NetworkObject>().PrefabIdHash;
        }

        response.Approved = true;
        response.CreatePlayerObject = true;
        response.Position = Vector3.zero;
        response.Rotation = Quaternion.identity;
        response.Reason = "Some reason for not approving the client";
        response.Pending = false;
    }
}

日志输出

日志中可以看到数据可以被正确反序列化出来,MemoryPack对这种二进制数据处理速度非常优秀,值得去深入学习。


后话

MemoryPack作为一个序列化工具,可以在数据的存放等场景使用,并不局限于当前,例如一些存档,人物数据等等都可以使用


学习链接

https://neuecc.medium.com/how-to-make-the-fastest-net-serializer-with-net-7-c-11-case-of-memorypack-ad28c0366516

https://www.cnblogs.com/InCerry/p/how-to-make-the-fastest-net-serializer-with-net-7-c-11-case-of-memorypack.html

https://unity.com/cn/products/netcode

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1162235.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

极致分离卷积块 XSepConv 学习笔记 (附代码)

论文地址&#xff1a;https://arxiv.org/pdf/2002.12046.pdf 代码地址&#xff1a; 1.是什么&#xff1f; XSepConv是由清华大学提出的&#xff0c;它是一种新型的卷积神经网络模块&#xff0c;可以在保持计算量不变的情况下提高模型的性能。XSepConv的特点是将深度卷积和逐…

group by用法和SQL执行顺序详解

一、group by 1、作用 数据分组 -> 组内数据处理&#xff08;求组内的最大值、最小值、平均值等&#xff09; 2、案例&#xff1a; Order Details&#xff08;订单详情表&#xff09; 表结构&#xff1a;每个Order&#xff0c;都对应着好几个不同的Product&#xff0c;每…

尚硅谷大数据项目《在线教育之实时数仓》笔记005

视频地址&#xff1a;尚硅谷大数据项目《在线教育之实时数仓》_哔哩哔哩_bilibili 目录 第9章 数仓开发之DWD层 P031 P032 P033 P034 P035 P036 P037 P038 P039 P040 第9章 数仓开发之DWD层 P031 DWD层设计要点&#xff1a; &#xff08;1&#xff09;DWD层的设计依…

Azure 机器学习 - 使用 Visual Studio Code训练图像分类 TensorFlow 模型

了解如何使用 TensorFlow 和 Azure 机器学习 Visual Studio Code 扩展训练图像分类模型来识别手写数字。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员…

免费(daoban)gpt,同时去除广告

一. 内容简介 免费(daoban)gpt&#xff0c;同时去除广告&#xff0c;https://chat18.aichatos.xyz/&#xff0c;也可当gpt用&#xff0c;就是有点广告&#xff0c;大家也可以支持一下 二. 软件环境 2.1 Tampermonkey 三.主要流程 3.1 创建javascript脚本 点击添加新脚本 …

超详细!!!顺序表的实现

顺链表的实现 顺序表的概念及结构概念顺序表与数组的区别顺序表的结构 动态顺序表的实现头文件 "SeqList.h"定义结构体 SL 源文件顺列表的实现初始化顺列表 void SLInit(SL* ps)检查顺列表空间大小 void SLCheckCapacity(SL* ps)尾插数据 void SLPushBack(SL* ps,SLD…

java强转实验

不存在继承关系时&#xff0c;强转会出现编译时异常。即&#xff1a;无法将两个不同类型的对象做转换 当存在继承关系时&#xff0c;强转正常。备注&#xff1a;同名字段&#xff0c;类型一致&#xff0c;可以强转替代getset。同名字段&#xff0c;类型不一致&#xff0c;强转会…

网络安全之XSS漏洞

一. 引言 Cross-Site Scripting&#xff08;跨站脚本攻击&#xff09;简称XSS&#xff0c;是一种代码注入攻击。XSS 攻击通常指的是利用网页的漏洞&#xff0c;攻击者通过巧妙的方法注入 XSS 代码到网页&#xff0c;因为浏览器无法分辨哪些脚本是可信的&#xff0c;导致 XSS 脚…

matlab求解时变系统的Riccati矩阵微分方程

对于代数Riccati方程的求解网上能找到很多的资源&#xff0c;matlab也有成熟的函数&#xff0c;但是对于时变系统的Riccati矩阵微分方程&#xff0c;能找到的资料还比较少。 一、求解代数Riccati方程 可以在网上找到很多资料&#xff0c;如 https://blog.csdn.net/m0_622999…

python中有哪些你觉得超级牛的模块?

之前在做数据分析的时候&#xff0c;用过一个自动化生成数据探索报告的Python库&#xff1a;ydata_profiling 一般我们在做数据处理前会进行数据探索&#xff0c;包括看统计分布、可视化图表、数据质量情况等&#xff0c;这个过程会消耗很多时间&#xff0c;可能需要上百行代码…

Linux--线程--互斥锁

1.互斥量 a&#xff09;互斥量&#xff08;mutex&#xff09;从本质上来说是一把锁&#xff0c;一般在主线程中定义一个互斥量&#xff0c;就是定义一把锁。然后根据我们的需求来对线程操作这把锁。 b&#xff09;如果给所有的线程都加上锁了&#xff0c;线程们会去争取内存空…

2018年第三届 美亚杯电子取证 个人赛题解

1 Victor的笔记本电脑己成功取证并制作成法证映像档 (Forensic Image)&#xff0c;下列哪个是其MD5哈希值? (2分) A. FC20782C21751AB76B2A93F3A17922D0 B. 5F1BDEB87EE9F710C90CFB3A0BB01616 C. A0BB016160CFB3A0BB0161661670CFB3 D. 917ED59083C8B35C54D3FCBFE4C4BB0B E. F…

当你在浏览器地址栏输入一个URL后,将会发生的事情?个人笔记

客户端 在浏览器输入 URL 回车之后发生了什么&#xff08;超详细版&#xff09; - 知乎 (zhihu.com) 大致流程是&#xff1a; URL 解析DNS 查询TCP 连接处理请求接受响应渲染页面 1.URL解析 地址解析&#xff1a; 首先判断你输入是否是一个合法的URL还是一个待搜索的关键…

上市公司-供应链效率数据集(2000-2022年)

参照张倩肖&#xff08;2023&#xff09;、Feng&#xff08;2015&#xff09;、张树山&#xff08;2023&#xff09;的做法&#xff0c;团队以库存周转天数来衡量供应链效率 库存周转天数有效克服了因企业保留安全库存而导致供应链效率较低的测算误差&#xff0c;体现供应链上…

回归预测 | Matlab实现POA-CNN-SVM鹈鹕算法优化卷积神经网络-支持向量机多变量回归预测

Matlab实现POA-CNN-SVM鹈鹕算法优化卷积神经网络-支持向量机多变量回归预测 目录 Matlab实现POA-CNN-SVM鹈鹕算法优化卷积神经网络-支持向量机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.POS-CNN-SVM鹈鹕算法优化卷积神经网络-支持向量机的多变量回归…

好用的CRM软件都有哪些功能?

好用的CRM软件不仅仅是将客户资料存档&#xff0c;更大的作用还在于充分发挥数据的价值提升客户管理效率。如果您了解过多款CRM软件就一定会发现它们的功能都不尽相同&#xff0c;但是好用的CRM工具离不开这些功能&#xff1a; 一、客户视图 客户视图主要由4类数据组成&#…

基于springboot实现游戏分享网站系统项目【项目源码+论文说明】

基于springboot实现游戏分享网站演示 摘要 网络的广泛应用给生活带来了十分的便利。所以把游戏分享管理与现在网络相结合&#xff0c;利用java技术建设游戏分享网站&#xff0c;实现游戏分享的信息化。则对于进一步提高游戏分享管理发展&#xff0c;丰富游戏分享管理经验能起到…

跨境商城源码价格

在当今数字商务的时代&#xff0c;跨境电商已经成为了越来越多企业的选择。然而&#xff0c;要建立一个高效、便捷、全球化的跨境商城并不是一件简单的事情。所幸&#xff0c;现在有一个开源的解决方案&#xff0c;给企业提供了无限的可能性。跨境商城源码价格合乎实际&#xf…

浅谈AcrelEMS-CB商业建筑能源管理系统解决方案-安科瑞 蒋静

1概述 AcrelEMS-CB商业建筑能源管理系统&#xff0c;集电力监控、电能质量监测与治理、电气安全预警、能耗分析、照明控制、新能源使用、能源收费以及设备运维等功能于一体&#xff0c;通过一套系统对商业建筑的能源进行统一监控、统一运维和调度&#xff0c;系统可以通过WEB和…

对比学习(contrastive Learning)

起源和定义 自监督学习又可以分为对比学习(contrastive learning)和生成学习(generative learning)两条主要的技术路线。 比学习的核心思想是将正样本和负样本在特征空间对比&#xff0c;从而学习样本的特征表示&#xff0c;使得样本与正样本的特征表示尽可能接近。正样本和负…