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

news2024/11/17 11:43:55

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







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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Socket——向FTP服务器发送消息并获得响应

1、简介 Socket&#xff08;套接字&#xff09;是网络编程中用于描述IP地址和端口的一个抽象概念&#xff0c;通过它可以实现不同主机间的通信。套接字可以分为几种不同的类型&#xff0c;每种类型对应不同的协议和传输模式。 1.1、基本概念 IP地址&#xff1a;用于标识网络…

智能语音抽油烟机:置入WTK6900L离线语音识别芯片 掌控厨房新风尚

一、抽油烟机语音识别芯片开发背景 在繁忙的现代生活中&#xff0c;人们对于家居生活的便捷性和舒适性要求越来越高。传统的抽油烟机操作方式往往需要用户手动调节风速、开关等功能&#xff0c;不仅操作繁琐&#xff0c;而且在烹饪过程中容易分散注意力&#xff0c;增加安全隐…

梅雨季要祛湿,更要养阳气!用好这2招,补足阳气,祛湿排寒,助你体质越来越好~

梅雨季祛湿正当时&#xff0c;但是很多人疑惑不断祛湿&#xff0c;可为什么湿气一直源源不断呢&#xff1f;除了不良生活方式没有改变外&#xff0c;很多人祛湿只是解决“标”的问题&#xff0c;没有解决“本”的问题。 中医有一句话叫“无阳难以化湿”&#xff01; 我们可以简…

前端 CSS 经典:模拟 material 文本框

效果 思路 定义三个元素&#xff0c;文本框&#xff0c;下划线&#xff0c;占位文字。input 聚焦时通过 ~ 选中兄弟元素&#xff0c;利用 required 属性 css 中的 valid 验证&#xff0c;判断 input 中是否有输入。写入过渡效果。 实现代码 <!DOCTYPE html> <htm…

基于 JuiceFS 构建高校 AI 存储方案:高并发、系统稳定、运维简单

中山大学的 iSEE 实验室&#xff08;Intelligence Science and System) Lab&#xff09;在进行深度学习任务时&#xff0c;需要处理大量小文件读取。在高并发读写场景下&#xff0c;原先使用的 NFS 性能较低&#xff0c;常在高峰期导致数据节点卡死。此外&#xff0c;NFS 系统的…

203.回溯算法:N皇后(力扣)

class Solution { public:vector<vector<string>> result; // 用于存储所有合法的 N 皇后放置方案// 判断当前位置 (row, col) 是否可以放置皇后bool isValid(int row, int col, vector<string>& chess, int n) {// 检查当前列是否有皇后for (int i 0;…

锐起RDV5高性能云桌面

锐起是上海锐起信息技术有限公司旗下品牌。该公司创立于 2001 年&#xff0c;是桌面虚拟化产品和解决方案提供商&#xff0c;专注于桌面管理系统和私有云存储系统的系列软件产品研发&#xff0c;致力于简化 IT 管理、增强系统安全&#xff0c;提供简单、易用、稳定、安全的产品…

视觉与运动控制6

基于驱动器的控制功能 驱动器的系统性能和运算能力有限需要单独的运动控制器。 V/F恒压频比控制 开环控制方法&#xff0c;应用最广泛、最简单&#xff0c;只需要电机数据即可。适用于控制精度和动态响应要求不高的应用。控制原理&#xff1a;保持点击内磁通量恒定&#xff…

Android10 Settings系列(六)Settings中toolbar 的基本流程,和Activity如何关联,这可能是比较详细的分析

一、前言 写在前面:一个快捷栏,音量浮窗快捷进入设置界面,点击左上角返回键拉起设置首页问题引发的思考和解决方法 事情的起因是测试报了一个问题。在Android9的一个设备在点击音量键时,在弹出的弹框中,点击设置图标快速进入音量设置中,点击左上角返回按钮是,退出当前界…

【深度学习】基于因果表示学习的CITRIS模型原理和实验

1.引言 1.1.本文的主要内容 理解动态系统中的潜在因果因素&#xff0c;对于智能代理在复杂环境中进行有效推理至关重要。本文将深入介绍CITRIS&#xff0c;这是一种基于变分自编码器&#xff08;VAE&#xff09;的框架&#xff0c;它能够从时间序列图像中提取并学习因果表示&…

WebSocket 连接失败的原因及解决方法

WebSocket 目前已经成为了一项极为重要的技术&#xff0c;其允许客户端和服务器之间进行实时、全双工的通信。然而&#xff0c;在实际项目中&#xff0c;开发者时常会遇到 WebSocket 连接失败的情况。这不仅影响了用户体验&#xff0c;还可能导致不可预见的系统错误或数据丢失。…

PMP®项目管理国际认证——管理者的必备证书

北京青蓝智慧科技从2010年起专注于PMP认证的考前培训。 凭借十余年的研究与多位行业专家的合作探讨&#xff0c;我们推出了高效的“PMP通关四步法”。 这一方法经过多年实践检验&#xff0c;显著提升了考生的通过率&#xff0c;为众多学员带来了实质的学习成果。 第一阶段&am…

超低排放标准

据朗观视觉小编了解发现&#xff0c;超低排放标准作为衡量一个行业或企业环保水平的重要指标&#xff0c;越来越受到社会各界的关注。本文将深入探讨超低排放标准的内涵、实施意义以及未来展望。 一、超低排放标准的定义 超低排放标准&#xff0c;是指在特定工业生产过程中&am…

Mac 微信能上网但浏览器打不开网页

文章目录 推荐 DNSMac 设置 DNS 推荐 DNS 名称首选 DNS备用 DNSGoogle8.8.8.88.8.4.4114 DNS114.114.114.114114.114.115.115阿里223.5.5.5百度180.76.76.76腾讯119.29.29.29电信101.226.4.6联通123.125.81.6移动101.226.4.6铁通101.226.4.68福建电信218.85.152.99218.85.157.…

【STM32】USART串口通讯

1.USART简介 STM32芯片具有多个USART外设用于串口通讯&#xff0c;它是 Universal Synchronous Asynchronous Receiver and Transmitter的缩写&#xff0c; 即通用同步异步收发器可以灵活地与外部设备进行全双工数据交换。有别于USART&#xff0c; 它还有具有UART外设(Univers…

C#1.0-11.0所有历史版本主要特性总结

文章目录 前言名词解释主要版本一览表各版本主要特性一句话总结 C# 1.0 (Visual Studio 2002, .Net Framework 1.0)C# 2.0 (Visual Studio 2005, .Net Framework 2.0)C# 3.0 (Visual Studio 2008, .Net Framework 3.0)C# 4.0 (Visual Studio 2010, .Net Framework 4)C# 5.0 (V…

抖音集团基于 Apache Doris 的实时数据仓库实践

作者&#xff1a;字节跳动数据平台 在直播、电商等业务场景中存在着大量实时数据&#xff0c;这些数据对业务发展至关重要。而在处理实时数据时&#xff0c;我们也遇到了诸多挑战&#xff0c;比如实时数据开发门槛高、运维成本高以及资源浪费等。 此外&#xff0c;实时数据处…

掌握Scrum:敏捷开发中的短期迭代与定期会议

目录 前言1. Scrum概述1.1 什么是Scrum1.2 Scrum的三大支柱 2. 短期迭代&#xff08;Sprint&#xff09;2.1 Sprint规划2.1.1 确定Sprint目标2.1.2 创建Sprint待办列表 2.2 Sprint执行2.2.1 每日站会 2.3 Sprint回顾2.3.1 Sprint评审2.3.2 Sprint回顾 3. 定期会议3.1 产品待办列…

LINUX操作系统:Mx Linux,用虚拟机VMware Workstation安装体验

需求说明&#xff1a; 操作系统目前流行有Windows、Linux、Unix等&#xff0c;中国人应该要知道国有操作系统&#xff0c;也要支持国产操作系统&#xff0c;为了更好支持国产操作系统&#xff0c;我们也要知己知彼&#xff0c;那么今天就来体验一把操作系统Mx_Linux_23.2的安装…

Verilog刷题笔记49——Fsm1同步复位

题目&#xff1a; 解题&#xff1a; module top_module(clk,reset,in,out);input clk;input reset;input in;output out;parameter A0,B1;reg [1:0]current_state,next_state;always(posedge clk)beginif(reset)current_stateB;elsecurrent_statenext_state;endalways(*)beg…