unity3d:protobuf .java转.cs

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/luoyikun/article/details/82768776

服务器端定义好protobuf结构,放unity编辑器中生成.cs的结构

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
using System.Text;
public class JavaProtoToCs : EditorWindow
{

    [MenuItem("DoJavaToCs/DoProtoToCs")]
    static void DoProtoToCs()
    {
        string fullPath = "Assets/VirtualCity/ProtoDefine/Java";  //路径
        string toPath = "Assets/VirtualCity/ProtoDefine";
        //获取指定路径下面的所有资源文件  
        if (Directory.Exists(fullPath))
        {
            DirectoryInfo direction = new DirectoryInfo(fullPath);
            FileInfo[] files = direction.GetFiles("*", SearchOption.AllDirectories);

            for (int i = 0; i < files.Length; i++)
            {
                if (files[i].Name.EndsWith(".java"))
                {
                    string fileOnlyName = files[i].Name.Replace(".java", "");

                    StringBuilder tempBuilder = new StringBuilder();
                    tempBuilder.Append("using System.Collections.Generic;");
                    tempBuilder.AppendLine();
                    tempBuilder.Append("using ProtoBuf;");
                    tempBuilder.AppendLine();
                    tempBuilder.Append("namespace ProtoDefine {");
                    tempBuilder.AppendLine();
                    tempBuilder.Append("[ProtoContract]");
                    tempBuilder.AppendLine();
                    var strs = File.ReadAllLines(files[i].FullName);
                    int protoIdx = 1;
                    for (int lineIdx = 0; lineIdx < strs.Length; lineIdx++)
                    {
                        if (strs[lineIdx].Contains("import") || strs[lineIdx].Contains("package") || strs[lineIdx].Contains("MessageMeta"))
                        {
                            continue;
                        }

                        if (strs[lineIdx].Contains("Protobuf"))
                        {
                            string sAdd = "[ProtoMember(" + protoIdx + ")]";
                            protoIdx++;

                            tempBuilder.Append(sAdd);
                            tempBuilder.AppendLine();
                            continue;

                        }

                        if (strs[lineIdx].Contains("class"))
                        {
                            string[] bufStr = strs[lineIdx].Split(' ');
                            string sClass = bufStr[0] + " " +  bufStr[1] + " "+ bufStr[2] + "{";

                            tempBuilder.Append(sClass);
                            tempBuilder.AppendLine();
                            continue;
                        }
                        strs[lineIdx] = strs[lineIdx].Replace("Long", "long?");
                        strs[lineIdx] = strs[lineIdx].Replace("Double", "double?");
                        strs[lineIdx] = strs[lineIdx].Replace("String", "string");
                        strs[lineIdx] = strs[lineIdx].Replace("Integer", "int?");
                        strs[lineIdx] = strs[lineIdx].Replace("Short", "short?");
                        strs[lineIdx] = strs[lineIdx].Replace("Map", "Dictionary");
    
                        tempBuilder.Append(strs[lineIdx]);
                      
                        tempBuilder.AppendLine();
                    }
                    tempBuilder.Append("}");

                    string tempFilePath = string.Format("{0}/{1}.cs", toPath, fileOnlyName);
                    if (File.Exists(tempFilePath))
                    {
                        File.Delete(tempFilePath);
                    }
                    File.WriteAllText(tempFilePath, tempBuilder.ToString());
                }
            }


        }

        Debug.Log("ProtoToCs转换完成");
        AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
    }
}

猜你喜欢

转载自blog.csdn.net/luoyikun/article/details/82768776