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

上篇文章
与此家公司的protobuf有点小差异,记录一下咯

在这里插入图片描述

#if UNITY_EDITOR
using System;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using System.Reflection;
using Google.Protobuf;
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).ToList();
            foreach (var itemClass in entityValues)
            {
                var key = itemClass.FullName;
                mEntityPbClass[key] = itemClass;
            }
        }
        Debug.LogError($"初始化__总条数{mEntityPbClass.Count}");
    }

    [LabelText("只知道【接口】名字"), HorizontalGroup("module"), PropertyOrder(Order = 1), Space(5)]
    public string mDtoNameTxt = "CFight_C2GSFightReq";

    [Button("先 生成一个Json_Dto,然后手动自行修改赋值", ButtonSizes.Medium, ButtonHeight = 30), HorizontalGroup("module",Width= 0.38f), PropertyOrder(Order = 2)]
    public void GenOneDto()
    {
        var c2s_interface = mDtoNameTxt.Split("_");
        if (c2s_interface.Length != 2)
        {
            Debug.LogError($"理论上 接口名 {mDtoNameTxt} 含有一个下划线  _");
            return;
        }

        if (mEntityPbClass.TryGetValue(c2s_interface[1], out var itemClass))
        {
            var properties = itemClass.GetProperties();
            var defaultValues = new Dictionary<string, object>();
            foreach (var property in properties)
            {
                if (property.Name.Contains("Parser") || property.Name.Contains("Descriptor"))
                {
                    //过滤掉 Parser Descriptor
                }
                else 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;
                }
            }

            if (Enum.TryParse(mDtoNameTxt, out Protobuf.ProtoIdDefinedGS2C protoSCId))
            {
                var jsonContent = Newtonsoft.Json.JsonConvert.SerializeObject(defaultValues);
                mDtoJsonTxt = mDtoNameTxt + "\n" + jsonContent.ToString();
            }

            if (Enum.TryParse(mDtoNameTxt, out Protobuf.ProtoIdDefinedC2GS protoCSId))
            {
                var jsonContent = Newtonsoft.Json.JsonConvert.SerializeObject(defaultValues);
                mDtoJsonTxt = mDtoNameTxt + "\n" + jsonContent.ToString();
            }
        }
        else
        {
            Debug.LogError("确定左边 输入正确了?");
        }
    }

    [TextArea(20, 50), HideLabel, Space(30), PropertyOrder(Order = 3), InfoBox("应用场景: \r\n请求(CS)_后端先写完了(有proto接口了),前端还没搞完时(暂还没接入proto),可使用此请求,可自测\r\n响应(SC)_可自行构建一个响应(有些特殊数据后端下发不了的),对数据进行测试\r\nPS:Console面板的Log可以直接copy内容,再对内容进行小修改")]
    public string mDtoJsonTxt = @"Formation_GS2CFormationDefaultUpdate{  ""DefaultTeam"": {    ""FormationId"": 10020,    ""TeamId"": 4  }}";

    [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(@"数据格式 不对哦  eg:  Formation_GS2CFormationDefaultUpdate{  ""DefaultTeam"": {    ""FormationId"": 10020,    ""TeamId"": 4  }}");
            return;
        }

        if (Enum.TryParse(typeName, out Protobuf.ProtoIdDefinedGS2C protoSCId) == false)
        {
            Debug.LogError($"ProtoIdDefinedGS2C的枚举 转义不了 typeName={typeName}");
            return;
        }

        var c2s_interface = typeName.Split("_");
        if (c2s_interface.Length != 2)
        {
            Debug.LogError($"理论上 接口名 {typeName} 含有一个下划线  _");
            return;
        }

        if (mEntityPbClass.TryGetValue(c2s_interface[1], out var itemClass))
        {
            var dtoMsg = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonContent, itemClass); // 使用非泛型的方法
            Nikke.hotUpdate.NikkeEntryHotupdate.WebSocket.ReceiveFakeSCPacket(protoSCId, (IMessage)dtoMsg);
        }
        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(@"数据格式 不对哦  eg:  CFormation_C2GSFormationDefaultTeamUpdate{  ""DefaultTeam"": {    ""FormationId"": 10020,    ""TeamId"": 2  }}");
            return;
        }

        if (Enum.TryParse(typeName, out Protobuf.ProtoIdDefinedC2GS protoCSId) == false)
        {
            Debug.LogError($"ProtoIdDefinedC2GS的枚举 转义不了 typeName={typeName}");
            return;
        }

        var c2s_interface = typeName.Split("_");
        if (c2s_interface.Length != 2)
        {
            Debug.LogError($"理论上 接口名 {typeName} 含有一个下划线  _");
            return;
        }

        if (mEntityPbClass.TryGetValue(c2s_interface[1], out var itemClass))
        {
            var dtoMsg = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonContent, itemClass); // 使用非泛型的方法
            Debug.Log($"发送协议:{protoCSId}");
            Nikke.hotUpdate.NikkeEntryHotupdate.WebSocket.Send(protoCSId, (IMessage)dtoMsg);
        }
        else
        {
            Debug.LogError("查查吧~1.DTO没写对? 2.协议不是最新的?");
        }
    }
}
#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值