当前位置: 首页 > article >正文

Unity使用反射进行Protobuf(CS/SC)协议,json格式

protobuf生成的协议,有挺多协议的.利用反射生成dto进行伪协议的响应 和 发送请求
应用场景:
请求(CS)_后端先写完了,前端还搞完时,可使用此请求,可自测
响应(SC)_可自行构建一个响应,对数据进行测试

// 请求 使用物品  CS
message ReqUseItem{optional Opcodes MessageID=1[default = CG_MSG_REQ_USE_ITEM];optional uint32 itemId = 2;optional uint32 num = 3;optional string strparam = 4;  //buff{"castBuff":"1"}        {"rewardIdx":"1"} 礼包选择,从1开始     
}
//响应 使用物品 SC
message RetUseItem{optional Opcodes MessageID=1[default = GC_MSG_RET_USE_ITEM];optional uint32 errorCode = 2;optional uint32 itemId = 3;optional uint32 num = 4;repeated ItemInfo rewards = 5;optional string strparam = 6;
}

Unity使用Odin,写的页面,Json格式 dtoName{json内容}
在这里插入图片描述

using System;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using System.Reflection;
using QQu;
using Sirenix.OdinInspector;
using UnityEditor;
using Sirenix.OdinInspector.Editor;
using Sirenix.Utilities;
using Sirenix.Utilities.Editor;/// <summary> 协议 辅助工具  一般用来 1.测试请求   2.自己给自己下发数据</summary>
public class EditorSendReceiveNet : OdinEditorWindow
{[MenuItem("Tools/辅助工具/协议工具_请求_伪收到 &#%N", priority = 199)]public static void ShowNetTool(){var win = GetWindow<EditorSendReceiveNet>("协议___C2S___S2C(伪)");win.position = GUIHelper.GetEditorWindowRect().AlignCenter(680, 520);}private  Dictionary<string, Type> mEntityPbClass;public EditorSendReceiveNet(){Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); // 获取当前应用程序域中所有已加载的程序集mEntityPbClass = new Dictionary<string, Type>();foreach (var assembly in assemblies){Type[] types = assembly.GetTypes(); // 筛选出所有 Pb 命名空间中的公共类var entityValues = types.Where(t => t.IsClass && t.IsPublic && t.Namespace == "Pb").ToList();foreach (var itemClass in entityValues){var key = itemClass.FullName.Replace("Pb.", "");mEntityPbClass[key] = itemClass;}}Debug.LogError($"初始化_Pb_总条数{mEntityPbClass.Count}");}[LabelText("只知道dto名字"), HorizontalGroup("module"), PropertyOrder(Order = 1), Space(5)]public string mDtoNameTxt = "ReqUseItem";[Button("先 生成一个Json_Dto,然后手动自行修改赋值", ButtonSizes.Medium, ButtonHeight = 30), HorizontalGroup("module"), PropertyOrder(Order = 2)]public void GenOneDto(){if (mEntityPbClass.TryGetValue(mDtoNameTxt, out var itemClass)){var properties = itemClass.GetProperties();var defaultValues = new Dictionary<string, object>();foreach (var property in properties){if (property.PropertyType == typeof(int) || property.PropertyType == typeof(uint)){defaultValues[property.Name] = 0;}else if (property.PropertyType == typeof(string)){defaultValues[property.Name] = "string_null";}else if (property.PropertyType == typeof(decimal) || property.PropertyType == typeof(float)){defaultValues[property.Name] = 0;}else if (property.PropertyType == typeof(bool)){defaultValues[property.Name] = false;}else if (property.PropertyType.IsClass){defaultValues[property.Name] = null;}}var jsonContent = Newtonsoft.Json.JsonConvert.SerializeObject(defaultValues);mDtoJsonTxt = itemClass.Name.ToString() + "\n" + jsonContent.ToString();}else{Debug.LogError("确定左边 输入正确了?");}}[TextArea(20, 50), HideLabel, Space(30), PropertyOrder(Order = 3), InfoBox("应用场景: \r\n请求(CS)_后端先写完了,前端还搞完时,可使用此请求,可自测\r\n响应(SC)_可自行构建一个响应,对数据进行测试\r\nPS:Console面板的Log可以直接copy内容,再对内容进行小修改")]public string mDtoJsonTxt = @"SyncCurrency{""InfoLists"": [{""Ntype"": 11,""Val"": 101660500}]
}";[HorizontalGroup("Split", 0.5f)][Button("伪_接收到协议", ButtonSizes.Medium, ButtonHeight = 30), PropertyOrder(Order = 4)]public void ReceiveNet(){int index = mDtoJsonTxt.IndexOf('{');string typeName = mDtoJsonTxt.Substring(0, index).Trim();string jsonContent = mDtoJsonTxt.Substring(index).Trim();if (string.IsNullOrEmpty(typeName) || string.IsNullOrEmpty(jsonContent)){Debug.LogError("数据格式 不对哦   dtoName{jsonString}   eg:SyncCurrency{  \"InfoLists\": [    {      \"Ntype\": 11,      \"Val\": 101660500    }  ]}");return;}if (mEntityPbClass.TryGetValue(typeName, out var itemClass)){var syncCurrency = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonContent, itemClass); // 使用非泛型的方法PropertyInfo messageIDProperty = itemClass.GetProperty("MessageID");object messageIDValue = messageIDProperty.GetValue(syncCurrency);var cmdValue = (int)messageIDValue;NetMgr.Ins.EditorReceive_Test((uint)cmdValue, syncCurrency);}else{Debug.LogError("查查吧~1.DTO没写对? 2.协议不是最新的?");}}[VerticalGroup("Split/right")][Button("发送请求", ButtonSizes.Medium, ButtonHeight = 30), PropertyOrder(Order = 5)]public void SendNet(){int index = mDtoJsonTxt.IndexOf('{');string typeName = mDtoJsonTxt.Substring(0, index).Trim();string jsonContent = mDtoJsonTxt.Substring(index).Trim();if (string.IsNullOrEmpty(typeName) || string.IsNullOrEmpty(jsonContent)){Debug.LogError("数据格式 不对哦   dtoName{jsonString}   eg:SyncCurrency{  \"InfoLists\": [    {      \"Ntype\": 11,      \"Val\": 101660500    }  ]}");return;}if (mEntityPbClass.TryGetValue(typeName, out var itemClass)){var syncCurrency = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonContent, itemClass); // 使用非泛型的方法PropertyInfo messageIDProperty = itemClass.GetProperty("MessageID");object messageIDValue = messageIDProperty.GetValue(syncCurrency);var cmdValue = (int)messageIDValue;NetMgr.Ins.Send((uint)cmdValue, syncCurrency);//此行 调用 自己的业务 }else{Debug.LogError("查查吧~1.DTO没写对? 2.协议不是最新的?");}}
}

相关文章:

Unity使用反射进行Protobuf(CS/SC)协议,json格式

protobuf生成的协议,有挺多协议的.利用反射生成dto进行伪协议的响应 和 发送请求 应用场景: 请求(CS)_后端先写完了,前端还搞完时,可使用此请求,可自测 响应(SC)_可自行构建一个响应,对数据进行测试 // 请求 使用物品 CS message ReqUseItem{optional Opcodes MessageID1[def…...

初学 mybatis

前言 回顾之前 不使用 mybatis 框架&#xff0c;我们是怎么通过Java 操作数据库的 "jdbc" 前提&#xff1a;使用maven 构建的项目 1 添加 关于jdbc 的依赖&#xff0c;以及辅助操作数据库的 commons-dubli jar包 截取 前后端项目 2 添加配置文件里面内容有&…...

java.lang.IllegalArgumentException: 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义

Tomcat 屏蔽错误信息。java.lang.IllegalArgumentException: 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义 <h1>HTTP状态 400 - 错误的请求</h1><hr class"line" /><p><b>类型</b> 异常报告</p><p&…...

C语言进阶习题(4结构体)【1】通讯录的实现

目录 1.使用结构体实现通讯录功能2.思路3. 代码实现3.1 test.c3.2 contact.c3.3 contact.h 1.使用结构体实现通讯录功能 主要功能有&#xff1a;显示通讯录信息&#xff0c;增加通讯录中人的信息&#xff0c;删除通讯录中人的信息&#xff0c;查找通信录中信息&#xff0c;修改…...

释放你的元数据:使用 Elasticsearch 的自查询检索器

作者&#xff1a;来自 Elastic Josh Asres 了解如何使用 Elasticsearch 的 “self-quering” 检索器来通过结构化过滤器提高语义搜索的相关性。 在人工智能搜索的世界中&#xff0c;在海量的数据集中高效地找到正确的数据至关重要。传统的基于关键词的搜索在处理涉及自然语言的…...

【Python】如何在 Linux/Windows 系统中设置 PYTHONPATH 环境变量

什么是 PYTHONPATH&#xff1f; PYTHONPATH 是一个环境变量&#xff0c;它告诉 Python 解释器在哪些目录中查找要导入的模块。这对于包含不在标准目录中的自定义模块非常有用。 Linux 系统中设置 PYTHONPATH 环境变量 在 Python 开发环境中&#xff0c;正确设置 PYTHONPATH …...

1.14学习总结

日常刷题单 刷了题目后&#xff0c;对于排序方法更加熟练&#xff0c;手搓代码的速度也得到了提高。 感觉字符串还不熟练&#xff0c;高精度更是云里雾里&#xff0c;上升空间极大。 同时看见今晚有个入门难度的测试&#xff0c;去练了练手&#xff0c;想看看自己是什么成分&…...

【Prometheus】prometheus黑盒监控balckbox全面解析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...

游戏引擎学习第101天

回顾当前情况 昨天的进度基本上完成了所有内容&#xff0c;但我们还没有进行调试。虽然我们在运行时做的事情大致上是对的&#xff0c;但还是存在一些可能或者确定的bug。正如昨天最后提到的&#xff0c;既然现在时间晚了&#xff0c;就不太适合开始调试&#xff0c;所以今天我…...

海康摄像头IPV6模式,手动,自动,路由公告

海康摄像头DS-2DC7220IW-A 网络设置中的IPv6配置选项。IPv6是互联网协议&#xff08;IP&#xff09;的第六版&#xff0c;用于替代IPv4&#xff0c;提供更多的IP地址和改进的网络功能。图片中的选项允许用户选择如何配置设备的IPv6网络连接&#xff1a; 手动&#xff1a;用户可…...

架构设计系列(二):CI/CD

一、概述 CI/CD 是 持续集成&#xff08;Continuous Integration&#xff09; 和 持续交付/持续部署&#xff08;Continuous Delivery/Continuous Deployment&#xff09; 的缩写&#xff0c;是现代软件开发中的一套核心实践和工具链&#xff0c;旨在提高软件交付的效率、质量…...

执行js生成json文件并动态写入数据

项目中需要执行js后生成一个新的json文件&#xff0c;并在该文件内写入json数据&#xff0c; 示例&#xff1a;生成一个json文件&#xff0c;内含执行这个js的时间戳作为json文件中的数据。 新建一个js文件create.js&#xff0c;js代码如下&#xff1a; const fs require(fs)…...

DDoS技术解析

这里是Themberfue 今天我们不聊别的&#xff0c;我们聊聊著名的网络攻击手段之一的 DDoS&#xff0c;看看其背后的技术细节。 DoS 了解 DDoS 前&#xff0c;先来讲讲 DoS 是什么&#xff0c;此 DoS 而不是 DOS 操作系统啊。1996年9月6日&#xff0c;世界第三古老的网络服务提供…...

28 在可以控制 postgres 服务器, 不知道任何用户名的情况下怎 进入 postgres 服务器

前言 最近有这样的一个需求, 有一个 postgres 服务器 但是 不知道 他的任何的用户名密码, 但是我想要查询这台 postgres 服务器 然后 基于这个需求, 我们看一下 怎么来处理 pg_hba.conf 认证方式修改为 trust 首先将 postgres 服务器的认证方式修改为 trust 这时候 …...

《图解设计模式》笔记(十)用类来表现

二十二、Command模式:命令也是类 一个类调用某方法,虽然调用结果会反映在对象的状态中,但不会留下工作的历史记录。 若有一个类表示“请进行这项工作”的“命令”,每一项想做的工作就不再是“方法的调用”这种动态处理了,而是一个表示命令的类的实例,即可以用“物”来表…...

Kafka日志数据深度解析:从基础查看到高级操作全攻略

#作者&#xff1a;孙德新 文章目录 查看log日志文件(kafka-dump-log.sh)1、查看Log文件基本数据信息2、index文件健康性检查(--index-sanity-check)3、转储文件(--max-message-size)4、偏移量解码(--offsets-decoder)5、日志数据解析(--transaction-log-decoder)6、查询Log文件…...

docker容器部署jar应用导入文件时候报缺少字体错误解决

如题&#xff0c;在导入文件时候报错如下&#xff1a; Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11FontManager 经查是缺少对应字体&#xff0c;解决办法有两张&#xff1a; 第一种&#xff1a;…...

npm安装时无法访问github域名的解决方法

个人博客地址&#xff1a;npm安装时无法访问github域名的解决方法 | 一张假钞的真实世界 今天在用npm install的时候出现了github项目访问不了的异常&#xff1a; npm ERR! Error while executing: npm ERR! /bin/git ls-remote -h -t https://github.com/nhn/raphael.git np…...

APP端弱网模拟与网络测试:如何确保应用在各种网络环境下稳定运行

随着智能手机的普及&#xff0c;APP的网络性能成为用户体验的关键因素之一。尤其是在弱网环境下&#xff0c;应用的表现可能严重影响用户的满意度。因此&#xff0c;APP端的网络测试&#xff0c;尤其是弱网模拟&#xff0c;成为了提升产品质量和用户体验的重要环节。 当前APP网…...

从 ClickHouse 到 Apache Doris:在网易云音乐日增万亿日志数据场景下的落地

导读&#xff1a;日志数据已成为企业洞察系统状态、监控网络安全及分析业务动态的宝贵资源。网易云音乐引入 Apache Doris 作为日志库新方案&#xff0c;替换了 ClickHouse。解决了 ClickHouse 运维复杂、不支持倒排索引的问题。目前已经稳定运行 3 个季度&#xff0c;规模达到…...

wordpress模板文件结构超详解

wordpress网站建设中&#xff0c;主题的制作是最为核心的环节。了解模板文件结构是模板制作的第一步&#xff0c;本文所讲的模板文件结构包括两部分&#xff0c;一是指以文件名为概念的文件结构&#xff0c;二是指文件内容的代码结构。 一、如何使模板文件起作用 ↑ wordpres…...

BFS 走迷宫

#include<bits/stdc.h> using namespace std; int a[100][100],v[100][100];//访问数组 n,m<100 struct point {int x;int y;int step; }; queue<point> r;//申请队列 int dx[4]{0,1,0,-1};//四个方向 右下左上 int dy[4]{1,0,-1,0}; int main() { /* 5 4 1 …...

尚硅谷爬虫note005

一、编解码 1.get请求的quote方法 将汉字转为Unicode字符 # _*_ coding : utf-8 _*_ # Time : 2025/2/12 16:33 # Author : 20250206-里奥 # File : demo19_get请求的quote方法 # Project : PythonProject10-14# 景甜page # https://www.baidu.com/s?ieutf-8&f8&rsv…...

mysql中general_log日志详解

介绍 1.记录范围&#xff1a;这个log里面会记录MySQL所有的SQL语句&#xff0c;不管是查询语句&#xff0c;还是DML语句&#xff0c;还是DDL语句&#xff0c;还是DCL语句&#xff0c;这些语句统统都会被记录在general log文件中。就连我们连接和断开MySQL数据库的这些语句。 2…...

计算机毕业设计SpringBoot+Vue.js医院住院管理系统(源码+lw文档+PPT+讲解视频)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

MongoDB 7 分片副本集升级方案详解(下)

#作者&#xff1a;任少近 文章目录 1.4 分片升级1.5 升级shard11.6 升级shard2,shard31.7 升级mongos1.8重新启用负载均衡器1.9 推荐MongoDB Compass来验证数据 2 注意事项&#xff1a; 1.4 分片升级 使用“滚动”升级从 MongoDB 7.0 升级到 8.0&#xff0c;即在其他成员可用…...

AI技术未来趋势

AI技术未来趋势 目录 AI技术未来趋势第一,AGI(通用人工智能)发展步伐在放慢;第二,ChatGPT等问答式AI已接近极限,复杂推理的“慢思考”模式成为新方向;第三,除了少数科技巨头,大多数公司都专注于做专业大模型第四,模型越做越小,进入轻量化时代第五,高质量数据、合成数据使模型知…...

vue 文件下载(导出)excel的方法

目前有一个到处功能的需求&#xff0c;这是我用过DeepSeek生成的导出&#xff08;下载&#xff09;excel的一个方法。 1.excel的文件名是后端生成的&#xff0c;放在了响应头那里。 2.这里也可以自己制定文件名。 3.axios用的是原生的axios&#xff0c;不要用处理过的&#xff…...

Flask和Django相比哪个更适合新手?

Flask 与 Django:哪个更适合新手? 对于新手来说,选择 Flask 还是 Django 主要取决于你的具体需求和项目复杂度。以下是两者的详细对比,帮助你做出选择: 1. Flask 优点 简单易用:Flask 是一个轻量级的微框架,代码简洁,易于理解和上手。适合初学者快速入门。灵活性高:…...

【含开题报告+文档+PPT+源码】基于spring boot的固定资产管理系统

开题报告 本研究论文提出了一种基于SpringBoot框架构建的全面且高效的固定资产管理系统&#xff0c;旨在优化企业内部的固定资产全生命周期管理流程。该系统集成了员工权限管理、业务流程处理及数据分析于一体&#xff0c;实现了员工便捷的登录注册功能&#xff0c;并通过安全…...