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;
}







点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部