Unity 编辑器开发实战【Editor Window】- 关于提高Proto通信协议文件生成效率的考虑

举报
CoderZ1010 发表于 2022/09/25 05:16:54 2022/09/25
【摘要】 在项目中使用Protobuf作为通信协议时,需要用到protogen.exe程序将.proto文件编译成.cs文件再导入Unity工程中使用: 例如我们创建一个ProtoTest.proto文件: 然后编辑run.bat文件中的内容,根据.proto文件名称输入编译指令: 编辑完成后,运行run.bat文件,可见编译好...

在项目中使用Protobuf作为通信协议时,需要用到protogen.exe程序将.proto文件编译成.cs文件再导入Unity工程中使用:

例如我们创建一个ProtoTest.proto文件:

然后编辑run.bat文件中的内容,根据.proto文件名称输入编译指令:

编辑完成后,运行run.bat文件,可见编译好的ProtoTest.cs文件已经生成到指定位置:

当我们有大量的.proto文件需要编译时,手动输入这些编译指令费时费力,而且容易出错,基于这样的情况,博主在Unity中编写了一个便利的工具:

只需要指定protogen.exe所在的文件夹路径,点击Create .bat按钮,工具会根据proto文件夹内所有.proto文件的名称拼接编译指令,写入run.bat文件,代码如下:


  
  1. using System.IO;
  2. using UnityEngine;
  3. using UnityEditor;
  4. using System.Text;
  5. using System.Diagnostics;
  6. namespace SK.Framework
  7. {
  8. /// <summary>
  9. /// Proto通信协议类编译工具
  10. /// </summary>
  11. public class Protogen : EditorWindow
  12. {
  13. [MenuItem("SKFramework/Protogen")]
  14. private static void Open()
  15. {
  16. GetWindow<Protogen>("Protogen").Show();
  17. }
  18. //根路径
  19. private string rootPath;
  20. private void OnGUI()
  21. {
  22. GUILayout.Label("protogen.exe所在路径:");
  23. GUILayout.BeginHorizontal();
  24. {
  25. rootPath = GUILayout.TextField(rootPath);
  26. if (GUILayout.Button("Browse", GUILayout.Width(50f)))
  27. {
  28. rootPath = EditorUtility.OpenFolderPanel("选择路径", rootPath, null);
  29. }
  30. }
  31. GUILayout.EndHorizontal();
  32. GUILayout.FlexibleSpace();
  33. if (GUILayout.Button("Create .bat", GUILayout.Height(30f)))
  34. {
  35. string protoPath = rootPath + "/proto";
  36. if (!Directory.Exists(protoPath))
  37. {
  38. UnityEngine.Debug.Log($"<color=red>文件夹不存在</color> {protoPath}");
  39. return;
  40. }
  41. string csPath = rootPath + "/cs";
  42. //如果cs文件夹不存在则创建
  43. if (!Directory.Exists(csPath))
  44. {
  45. Directory.CreateDirectory(csPath);
  46. }
  47. DirectoryInfo di = new DirectoryInfo(protoPath);
  48. //获取所有.proto文件信息
  49. FileInfo[] protos = di.GetFiles("*.proto");
  50. //使用StringBuilder拼接字符串
  51. StringBuilder sb = new StringBuilder();
  52. //遍历
  53. for (int i = 0; i < protos.Length; i++)
  54. {
  55. string proto = protos[i].Name;
  56. //拼接编译指令
  57. sb.Append(rootPath + @"/protogen.exe -i:proto\" + proto + @" -o:cs\" + proto.Replace(".proto", ".cs") + "\r\n");
  58. }
  59. sb.Append("pause");
  60. //生成".bat文件"
  61. string batPath = $"{rootPath}/run.bat";
  62. File.WriteAllText(batPath, sb.ToString());
  63. //打开该文件夹
  64. Process.Start(rootPath);
  65. }
  66. }
  67. }
  68. }

测试:

文章来源: coderz.blog.csdn.net,作者:CoderZ1010,版权归原作者所有,如需转载,请联系作者。

原文链接:coderz.blog.csdn.net/article/details/124121884

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。