Unity - 特殊文件夹【作用与是否会被打包到build中】
Unity编辑器工具—版本控制与自动化打包工具:
- 面板显示:工具包含一个面板,用于展示软件的不同版本信息。
- 版本信息:面板上显示主版本号、当前版本号和子版本号。
- 版本控制功能:有一个布尔值选项,用于决定是否要升级子版本。
- 打包功能:工具支持两种打包方式:
- 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;
}