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







本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/767068.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

音视频开发35 FFmpeg 编码- 将YUV 和 pcm合成一个mp4文件

一 程序的目的 /*** *该程序的目的是: * 将 一个pcm文件 和 一个 yuv文件&#xff0c;合成为一个 0804_out.mp4文件 * pcm文件和yuv文件是从哪里来的呢&#xff1f;是从 sound_in_sync_test.mp4 文件中&#xff0c;使用ffmpeg命令 抽取出来的。 * 这样做的目的是为了对比前…

【C语言】文件的顺序读写

©作者:末央&#xff06; ©系列:C语言初阶(适合小白入门) ©说明:以凡人之笔墨&#xff0c;书写未来之大梦 目录 前言字符输入输出函数 - fgetc和fputc文本行输入输出函数 - fgets和fputs格式化输入输出函数 - fscanf和fprintf 前言 对文件数据的读写可以分为顺序…

【Elasticsearch】一、概述,安装

文章目录 概述全文搜索引擎概述ES&#xff08;7.x&#xff09; 安装ES&#xff08;Docker&#xff09;测试&#xff0c;是否启动成功 可视化工具配置中文 客户端Postman下载 概述 ES是开源的高扩展的分布式全文搜索引擎&#xff0c;实时的存储、检索数据&#xff1b;本身扩展性…

function-calling初体验

课程地址&#xff1a;https://learn.deeplearning.ai/courses/function-calling-and-data-extraction-with-llms/lesson/1/introduction github notebook地址&#xff1a;https://github.com/kingglory/LLMs-function-calling/tree/main Function-Calling 介绍 函数调用(Funct…

Linux Centos7部署Zookeeper

目录 一、下载zookeeper 二、单机部署 1、创建目录 2、解压 3、修改配置文件名 ​4、创建保存数据的文件夹 ​5、修改配置文件保存数据的地址 ​6、启动服务 7、api创建节点 一、下载zookeeper 地址&#xff1a;Index of /dist/zookeeper/zookeeper-3.5.7 (apache.org…

Python23 使用Tensorflow实现线性回归

TensorFlow 是一个开源的软件库&#xff0c;用于数值计算&#xff0c;特别适用于大规模的机器学习。它由 Google 的研究人员和工程师在 Google Brain 团队内部开发&#xff0c;并在 2015 年首次发布。TensorFlow 的核心是使用数据流图来组织计算&#xff0c;使得它可以轻松地利…

【Python画图-驯化seaborn】一文搞懂seaborn中的箱线图实践技巧

【Python画图-驯化seaborn】一文搞懂seaborn中的箱线图实践技巧 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档关注&a…

05 docker 镜像

目录 1. 镜像 2. 联合文件系统 3. docker镜像加载原理 4. 镜像分层 镜像分层的优势 5. 容器层 1. 镜像 镜像是一种轻量级、可执行的独立软件包&#xff0c;它包含运行某个软件所需的所有内容&#xff0c;我们把应用程序和配置依赖打包好行程一个可交付的运行环境&#xf…

每日一题 7月1日

1 设数组data[m]作为循环队列的存储空间,front为队头指针,rear为队尾指针,则执行出队操作后其头指针front值为____ 2 采用滑动窗口机制对两个相邻结点A(发送方)和B(接收方)的通信过程进行流量控制。假定帧的序号长度为3比特,发送窗口与接收窗口的大小均为7,当A发送了…

昇思25天学习打卡营第9天|MindSpore-Vision Transformer图像分类

Vision Transformer图像分类 Vision Transformer(ViT)简介 近些年,随着基于自注意(Self-Attention)结构的模型的发展,特别是Transformer模型的提出,极大地促进了自然语言处理模型的发展。由于Transformers的计算效率和可扩展性,它已经能够训练具有超过100B参数的空前…

传输线在阻抗匹配时串联端接电阻为什么要靠近发送端

传输线在阻抗匹配时串联端接电阻为什么要靠近发送端 在进行阻抗匹配的时候我们可以在电阻源端放置一个串联端接电阻&#xff0c;但是有时候受到空间的限制可能会把电阻摆的稍微远一点&#xff0c;那么这个时候大家可能会有疑问&#xff0c;电阻离发送端远一点或者电阻放置在接…

java+mysql教师管理系统

完整源码地址 教师信息管理系统使用命令行交互的方式及数据库连接实现教师信息管理系统&#xff0c;该系统旨在实现教师信息的管理&#xff0c;并根据需要进行教师信息展示。该软件的功能有如下功能 (1)基本信息管理(教师号、姓名、性别、出生年月、职称、学历、学位、教师类型…

【Git 学习笔记】1.3 Git 的三个阶段

1.3 Git 的三个阶段 由于远程代码库后续存在新的提交&#xff0c;因此实操过程中的结果与书中并不完全一致。根据书中 HEAD 指向的 SHA-1&#xff1a;34acc370b4d6ae53f051255680feaefaf7f7850d&#xff0c;可通过以下命令切换到对应版本&#xff0c;并新建一个 newdemo 分支来…

【STM32 RTC实时时钟如何配置!超详细的解析和超简单的配置,附上寄存器操作】

STM32 里面RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域&#xff0c;即在系统复位或从待机模式唤醒后&#xff0c;RTC的设置和时间维持不变。因为系统对后备寄存器和RTC相关寄存器有写保护&#xff0c;所以如果想要对后备寄存器和RTC进行访问&#xff0c;则需要通过操作…

社交媒体优化的智能顾问:Kompas.ai如何提升品牌社交表现

在社交媒体盛行的数字时代&#xff0c;品牌必须在社交平台上保持活跃和互动&#xff0c;以增强品牌社交互动和提升在线可见性。社交媒体优化不仅能够扩大品牌的影响力&#xff0c;还能够加深与消费者的联系。Kompas.ai&#xff0c;作为一款智能社交媒体顾问工具&#xff0c;能够…

【前端项目笔记】7 商品管理

商品管理 效果展示&#xff1a; 在功能开发之前&#xff0c;创建商品列表的子分支 git branch 查看所有分支 git checkout -b goods_list 创建并切换到新分支goods_list git push -u origin goods_list 将新分支goods_list推送到云端仓库origin并命名为goods_list保存 通过…

LLM学习记录

概述 语言模型的发展 语言模型经历过四个阶段的发展&#xff0c;依次从统计语言模型到神经网络语言模型&#xff08;NLM&#xff09;&#xff0c;到出现以 BERT 和 Transformer 架构为代表的预训练语言模型&#xff08;PLM&#xff09;&#xff0c;最终到大型语言模型阶段&am…

竞赛选题 交通目标检测-行人车辆检测流量计数 - 竞赛选题

文章目录 0 前言1\. 目标检测概况1.1 什么是目标检测&#xff1f;1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…

【Java环境配置过程详解(包括IDEA配置Java)】

目录 一、JDK下载安装 1. 官网下载JDK 2. 本地安装JDK 3. 配置环境变量 4. 验证是否安装成功 ​编辑二、IDEA进行安装下载 1. 官网下载 IDEA 2、IDEA进行Java开发 1. 创建Java项目 2. 程序测试 一、JDK下载安装 1. 官网下载JDK 1&#xff09;官网链接: https://www.o…

PTrade如何获取技术值班?如get_RSI - 相对强弱指标;PTrade量化软件如何获取?

get_RSI - 相对强弱指标 get_RSI(close, n6) 使用场景 该函数仅在回测、交易模块可用 接口说明 获取相对强弱指标RSI指标的计算结果 PTrade是恒生公司开发的一款专业量化软件&#xff0c;部分合作券商可提供&#xff0c;↑↑↑&#xff01; 参数 close&#xff1a;价格…