• Unity编辑器工具---版本控制与自动化打包工具


    Unity - 特殊文件夹【作用与是否会被打包到build中】

    在这里插入图片描述
    Unity编辑器工具—版本控制与自动化打包工具:

    1. 面板显示:工具包含一个面板,用于展示软件的不同版本信息。
    2. 版本信息:面板上显示主版本号、当前版本号和子版本号。
    3. 版本控制功能:有一个布尔值选项,用于决定是否要升级子版本。
    4. 打包功能:工具支持两种打包方式:
      • APK打包:生成的APK包名将包含主版本号和子版本号。
      • Windows打包:在打包过程中,会将版本信息写入到StreamingAssets目录中的某个文件里。

    这个Unity编辑器工具的目的是简化Unity项目的版本管理和打包流程。

    使用时要把UnityPackager.cs放在Assets下面的Editor文件夹
    打包路径是工程所在目录中的Builds文件夹

    using Newtonsoft.Json;
    using System.IO;
    using Unity.VisualScripting;
    using UnityEditor; 
    using UnityEngine;
    
    public class UnityPackager : EditorWindow // 声明一个名为UnityPackager的编辑器窗口类,继承自EditorWindow
    {
        string mainVersion = Application.unityVersion;
        string currentVersion = "1"; // 当前版本号,默认为"1"
        string subVersion = "0"; // 子版本号,默认为"0"
        bool increaseSubVersion = false; // 是否自动增加子版本号,默认不增加
        string apkPath = Application.dataPath + "/../Builds/Apk/";
        string winPath = Application.dataPath + "/../Builds/Windows/MyGame.exe";
        string apkName;
        string filePath;
        JsonData jsonData;
       
    
        [MenuItem("Tools/Unity Packager")] // 在Unity的菜单栏中添加一个名为Unity Packager的菜单项
        public static void ShowWindow() // 显示此编辑器窗口的方法
        {
            EditorWindow.GetWindow(typeof(UnityPackager)); // 获取UnityPackager窗口实例,并显示出来
        }
    
    
      
        private void OnEnable()
        {
            Init();
        }
        void OnGUI() // Unity的图形用户界面方法,用于绘制和处理图形用户界面事件
        {
           
            GUILayout.Label("Package Settings", EditorStyles.boldLabel); // 绘制一个加粗的标签,显示"Package Settings"
            mainVersion = EditorGUILayout.TextField("Main Version", mainVersion);// 绘制一个文本字段,用于输入主版本号
            currentVersion = EditorGUILayout.TextField("Current Version", currentVersion); 
            subVersion = EditorGUILayout.TextField("Sub Version", subVersion);
            increaseSubVersion = EditorGUILayout.Toggle("Increase Sub Version", increaseSubVersion); // 绘制一个切换按钮,用于选择是否自动增加子版本号
    
            if (GUILayout.Button("Package APK")) // 绘制一个按钮,点击后会打包APK
            {
                PackageAPK(); 
    
            }
    
            if (GUILayout.Button("Package Win")) // 绘制一个按钮,点击后会打包Windows版本
            {
    
                PackageWin(); 
            }
        }
    
        void PackageAPK() // 打包APK的方法
        {
    
            if (increaseSubVersion) // 如果选择了自动增加子版本号
            {
                int subVersionInt = int.Parse(subVersion);
                subVersionInt++;
                subVersion = subVersionInt.ToString();
            }
            if (jsonData != null)
            {
                jsonData.mainVersion = mainVersion;
                jsonData.currentVersion = currentVersion;
                jsonData.subVersion = subVersion;
            }
            WriteJsonFile(jsonData);
            apkName = "MyGame_V" + mainVersion + "." + subVersion + ".apk"; // 定义APK文件的名称
            BuildPipeline.BuildPlayer(GetScenePaths(), apkPath+apkName, BuildTarget.Android, BuildOptions.None); // 打包APK
        }
    
        void PackageWin() // 打包Windows版本的方法
        {
            
            if (increaseSubVersion) // 如果选择了自动增加子版本号
            {
                int subVersionInt = int.Parse(subVersion);
                subVersionInt++; 
                subVersion = subVersionInt.ToString();
            }
            if (jsonData != null)
            {
                jsonData.mainVersion = mainVersion;
                jsonData.currentVersion = currentVersion;
                jsonData.subVersion = subVersion;
            } 
    
            WriteJsonFile(jsonData);
    
            BuildPipeline.BuildPlayer(GetScenePaths(), winPath, BuildTarget.StandaloneWindows, BuildOptions.None); // 打包Windows版本
        }
    
        string[] GetScenePaths() // 获取所有场景路径的方法
        {
            string[] scenes = new string[EditorBuildSettings.scenes.Length];
    
            for (int i = 0; i < scenes.Length; i++)
            {
                scenes[i] = EditorBuildSettings.scenes[i].path; // 将场景的路径赋值给字符串数组
            }
    
            return scenes; 
        }
    
        //初始化json
        void Init()
        {
            filePath = Application.streamingAssetsPath + "/version.json";
            CreateAndWriteJsonFile(mainVersion, currentVersion, subVersion);
            jsonData = ReadJsonFile();
        }
        //创建json文件并赋值
        void CreateAndWriteJsonFile(string data1, string data2, string data3)
        {
            if (File.Exists(filePath))
            {
         
                return;
            }
            // 创建一个包含三个字符串数据的对象
            var jsonData = new
            {
                mainVersion = data1,
                currentVersion = data2,
                subVersion = data3
            };
    
            // 将对象序列化为JSON字符串
            string jsonString = JsonConvert.SerializeObject(jsonData, Formatting.Indented);
    
            // 检查StreamingAssets文件夹是否存在,如果不存在则创建
            if (!Directory.Exists(Application.streamingAssetsPath))
            {
                Directory.CreateDirectory(Application.streamingAssetsPath);
            }
    
            // 将JSON字符串写入文件
            File.WriteAllText(filePath, jsonString);
    
            Debug.Log("JSON file created and written successfully at: " + filePath);
        }
    
        //读json
        JsonData ReadJsonFile()
        {
            if (File.Exists(filePath))
            {
                // 读取文件内容
                string jsonString = File.ReadAllText(filePath);
    
                // 反序列化JSON字符串为对象
                var jsonData = JsonConvert.DeserializeObject<JsonData>(jsonString);
                //读取json数据
                mainVersion = jsonData.mainVersion;
                currentVersion = jsonData.currentVersion;
                subVersion = jsonData.subVersion;
    
                return jsonData;
            }
            else
            {
                Debug.LogError("JSON file not found at: " + filePath);
                return null;
            }
        }
    
        //写入json
        void WriteJsonFile(JsonData jsonData)
        {
            string jsonString = JsonConvert.SerializeObject(jsonData, Formatting.Indented);
            File.WriteAllText(filePath, jsonString);
           
        }
    }
    
    public class JsonData
    {
        public string mainVersion;
        public string currentVersion;
        public string subVersion;
    }
    
    
    
    
    
    
    
    
  • 相关阅读:
    聊聊电商系统架构演进
    带你深入了解队列(c/cpp双版本模拟实现)
    【数据结构与算法】万字顺序表与OJ题
    事物的隔离性和MVCC
    SQL Server详细使用教程
    树莓派4B开机自动发微信报告ip地址
    怎样做音乐相册?这篇文章教会你
    电视盒子/投影仪是怎么看电视的?安利两款软件教程教会你
    计算机网络
    如何部署一个高可用高并发的电商平台
  • 原文地址:https://blog.csdn.net/qq_19605587/article/details/139982741