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

文章目录

    • 前言
    • 使用场景
    • 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode—485.最大连续1的个数【简单】

2023每日刷题&#xff08;十五&#xff09; Leetcode—485.最大连续1的个数 实现代码 int findMaxConsecutiveOnes(int* nums, int numsSize){int max 0;int i;int flag 0;int cnt 0;for(i 0; i < numsSize; i) {if(nums[i] 1) {if(flag 0) {flag 1;cnt 1;} else {…

【框架篇】统一用户登录权限验证

✅作者简介&#xff1a;大家好&#xff0c;我是小杨 &#x1f4c3;个人主页&#xff1a;「小杨」的csdn博客 &#x1f433;希望大家多多支持&#x1f970;一起进步呀&#xff01; 统一用户登录权限验证 1&#xff0c;自定义拦截器 对于统一用户登录权限验证的问题&#xff0c…

413 (Payload Too Large) 2023最新版解决方法

文章目录 出现问题解决方法 出现问题 博主在用vue脚手架开发的时候&#xff0c;在上传文件的接口中碰到 这样一个错误&#xff0c;查遍所有csdn&#xff0c;都没有找到解决方法&#xff0c;通过一些方式&#xff0c;终于解决了。 解决方法 1.打开Vue项目的根目录。 2.在根目…

顺序表(2)

目录 Test.c主函数 test5 test6 test7 菜单 Test.c总代码 SeqList.h头文件&函数声明 头文件 函数声明 SeqList.h总代码 SeqList.c函数实现 查找SeqListFind 某位置插入SeqListInsert 某位置删除SeqListErase SeqList.c总代码 顺序表的问题及其思考 多文件…

Vue项目创建与启动(2023超详细的图文教程)

目录 一、下载node.js 二、下载vue-cli与webpack插件 三、项目初始化(项目配置详细信息) 四、项目启动 五、Vue项目工程结构&#xff08;扩展知识&#xff09; 一、下载node.js 1.检测是否已经安装过node.js 打开控制台,输入 npm -v如果有会显示对应版本 如果没有会显示…

如何看待腾讯云双11活动3年轻量服务器突然涨价?

腾讯云双十一优惠活动提供的3轻量应用服务器涨价了&#xff0c;最初双11优惠活动3年轻量2核4G5M服务器从566.6元涨价到756元三年&#xff0c;3年轻量2核2G4M服务器从366.6元恢复到540元三年&#xff0c;大家抓紧吧&#xff0c;三年轻量已经库存已经不多了&#xff0c;看看隔壁阿…

基于Electron27+React18+ArcoDesign客户端后台管理EXE

基于electron27.xreact18搭建电脑端exe后台管理系统模板 electron-react-admin 基于electron27整合vite.jsreact18搭建桌面端后台管理程序解决方案。 前几天有分享electron27react18创建跨平台应用实践&#xff0c;大家感兴趣可以去看看。 https://blog.csdn.net/yanxinyun1990…

云安全-云原生基于容器漏洞的逃逸自动化手法(CDK check)

0x00 docker逃逸的方法种类 1、不安全的配置&#xff1a; 容器危险挂载&#xff08;挂载procfs&#xff0c;Scoket&#xff09; 特权模式启动的提权&#xff08;privileged&#xff09; 2、docker容器自身的漏洞 3、linux系统内核漏洞 这里参考Twiki的云安全博客&#xff0c;下…

快讯|2024 财年第一季度 Tubi 收益增长了 30%

2024 财年第一季度 Tubi 收益增长了 30%&#xff0c;月活跃用户达到了 7000 万 近日&#xff0c;在 2024 财年第一季度财务收益电话会议上&#xff0c;Fox 执行主席兼 CEO Lachlan Murdoch 对 Tubi 的增长表示赞赏&#xff1a;“Tubi 又多了一个令人羡慕的季度&#xff0c;收入…

3D模型格式转换工具HOOPS Exchange:如何将3D PDF转换为STEP格式?

3D CAD数据在制造、工程和设计等各个领域都扮演着重要的角色。为了促进不同软件应用程序之间的协作和互操作性&#xff0c;它通常以不同的格式进行交换。 HOOPS Exchange是一个强大的软件开发工具包&#xff0c;提供了处理和将3D CAD数据从一种格式转换为另一种格式的解决方案…

谭巍主任重点科普HPV病毒最怕的消毒液

HPV病毒&#xff0c;也称为人类乳头瘤病毒&#xff0c;是一种常见的性传播病毒。它感染人体皮肤和黏膜&#xff0c;导致各种疾病&#xff0c;包括尖锐湿疣、宫颈癌等。为了有效控制HPV病毒的传播&#xff0c;劲松中西医医院皮肤性病科主任谭巍认为了解消杀HPV病毒的消毒液是非常…

win10 + vs2017 + cmake3.17编译OSG-3.4.1

参考教程&#xff1a;https://blog.csdn.net/bailang_zhizun/article/details/120992244 1. 下载与解压 2. 修改configure 1&#xff09;Ungrouped Entries -- 》ACTUAL_3RDPARTY_DIR: 设置为&#xff1a; D:/Depend_3rd_party/OSG341/3rdParty 2&#xff09; Ungrouped E…

django如何连接sqlite数据库?

目录 一、SQLite数据库简介 二、Django连接SQLite数据库 1、配置数据库 2、创建数据库表 三、使用Django ORM操作SQLite数据库 1、定义模型 2、创建对象 3、查询对象 总结 本文将深入探讨如何在Django框架中连接和使用SQLite数据库。我们将介绍SQLite数据库的特点&…

设计模式第一课-单例模式(懒汉模式和饿汉模式)

单例模式 个人理解&#xff1a;单例模式实际就是通过类加载的方式获取到一个对象&#xff0c;并且保证这个对象在使用中只有一个&#xff0c;不允许再次被创建 一、懒汉模式 1、懒汉模式的基础写法 代码解释&#xff1a; &#xff08;1&#xff09;、编写LazySingleton类的…

HT5010 音频转换器工作原理

HT5010是一款低成B的立体声DA转换器&#xff0c;内部集成了内插滤波器、DA转换器和输出模拟滤波等电路。其可支持多种音频数字输入格式&#xff0c;支持24-bit字节。 该HT5010 基于一个多比特位的Δ-Σ调制器&#xff0c;将数字信号转化成两个声道的模拟信号并经过模拟滤波器滤…

Python 框架学习 Django篇 (八) 代码优化、数据库冗余处理

我们开发软件系统的时候&#xff0c;需要不断的反思我们代码里面是否有可以优化的地方。而优化的重点之一&#xff0c;就是把冗余的代码优化为可以复用的库。我们在前面编写了一些功能&#xff0c;但是其中存在很多冗余的方法 mgr/medicine.py mgr/k8s.py mgr/medicine.py 打开…

从科幻走向现实,LLM Agent 做到哪一步了?

LLM 洪流滚滚&#xff0c;AI 浪潮席卷全球&#xff0c;在这不断冲击行业认知的一年中&#xff0c;Agent 以冉冉新星之态引起开发者侧目。OpenAI 科学家 Andrej Karpathy 曾言“OpenAI 在大模型领域快人一步&#xff0c;但在 Agent 领域&#xff0c;却是和大家处在同一起跑线上。…

造物者:专注游戏音乐创造——奏响游戏世界乐章

游戏的世界宛如一幅壮丽的画卷&#xff0c;由华丽的图像和引人入胜的故事构成&#xff0c;然而&#xff0c;其完美之作还有一部分不可或缺的元素&#xff0c;那就是音乐。在这个数字时代&#xff0c;北京造物者科技有限公司&#xff08;以下简称造物者&#xff09;正崭露头角&a…

IntelliJ IDEA Services工具栏运行不显示端口问题解决

问题 如Spring Boot服务启动时&#xff0c;端口不显示。 解决 1、 清理所有缓存 2、 关闭IntelliJ IDEA后&#xff0c;到C:\Users\&#xff08;你自己的用户名&#xff09;\AppData\Local\Temp路径把所有文件都删除&#xff0c;因为时一个缓存&#xff0c;不影响其他软件…

RHCSA --- 第二天

一、查看IP地址 [rootlocalhost ~] ip ad 对应四张网卡 第一张&#xff1a;环回网卡&#xff08;用于测试&#xff09; 第二张&#xff08;主要&#xff09;&#xff1a;以太网网卡&#xff08;ens160&#xff09; 2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP>…