一、创建unity项目
编写一个脚本,通过代码更改打包时所需要的一些设置(默认icon、包名等等)
using UnityEditor;
using UnityEngine;
using System.IO;
using System;
public class ProjectBuild
{
[MenuItem("Tool/BuildForAndroid(All)")]
static void BuildForAndroid()
{
//切换到Android平台
if (Application.platform != RuntimePlatform.Android)
EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Android, BuildTarget.Android);
SetupPlayerSettings("1.0.0");//设置版本号
string tempPath = Application.dataPath.Replace("Assets", "exe");
string path = tempPath + "/" + Function.projectName + ".apk";
//string path = Application.dataPath + "/" + Function.projectName + ".apk";
BuildPipeline.BuildPlayer(GetBuildScenes(), path, BuildTarget.Android, BuildOptions.None);
}
private static void SetupPlayerSettings(string sVersion)
{
try
{
Debug.Log("BuildAndroidProcess.SetupPlayerSettings start:" + DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss"));
if (!BuildPlayerHelper.UpdateResourceVersionFile(sVersion))
{
throw new Exception("BuildAndroidProcess.SetupPlayerSettings UpdateResourceVersionFile failed!");
}
// 设置公司名称
PlayerSettings.companyName = "Test";//填写你自己的
// 设置 Android 构建系统为 Gradle
EditorUserBuildSettings.androidBuildSystem = AndroidBuildSystem.Gradle;
// 设置应用版本号
PlayerSettings.bundleVersion = sVersion;
// 设置 Android 版本代码(内部版本号)
PlayerSettings.Android.bundleVersionCode = BuildPlayerHelper.GetVersionCode(sVersion);
SetIcon();
// 设置默认界面方向为自动旋转
PlayerSettings.defaultInterfaceOrientation = UIOrientation.AutoRotation;
// 隐藏状态栏
PlayerSettings.statusBarHidden = true;
// 使用 32 位显示缓冲区
PlayerSettings.use32BitDisplayBuffer = true;
// 禁用深度和模板缓冲区
PlayerSettings.Android.disableDepthAndStencilBuffers = true;
// 禁用加载时显示活动指示器
PlayerSettings.Android.showActivityIndicatorOnLoading = AndroidShowActivityIndicatorOnLoading.DontShow;
// 设置最低支持的 SDK 版本为 Android API Level 24
PlayerSettings.Android.minSdkVersion = AndroidSdkVersions.AndroidApiLevel24;
// 设置目标 SDK 版本为自动选择
PlayerSettings.Android.targetSdkVersion = AndroidSdkVersions.AndroidApiLevelAuto;
// 设置首选安装位置为自动
PlayerSettings.Android.preferredInstallLocation = AndroidPreferredInstallLocation.Auto;
// 强制需要网络权限
PlayerSettings.Android.forceInternetPermission = true;
// 强制需要 SD 卡权限
PlayerSettings.Android.forceSDCardPermission = true;
// 剥离未使用的网格组件
PlayerSettings.stripUnusedMeshComponents = true;
#if UNITY_ANDROID
// 在 Android 平台上禁用托管剥离级别
PlayerSettings.SetManagedStrippingLevel(BuildTargetGroup.Android, ManagedStrippingLevel.Disabled);
#endif
// 允许自动旋转到左横向模式
PlayerSettings.allowedAutorotateToLandscapeLeft = true;
// 允许自动旋转到右横向模式
PlayerSettings.allowedAutorotateToLandscapeRight = true;
Debug.Log("BuildAndroidProcess.SetupPlayerSettings end:" + DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss"));
}
catch (System.Exception ex)
{
Debug.LogError("BuildAndroidProcess.SetupPlayerSettings exception is: " + ex.Message);
}
}
/// <summary>
/// 设置默认图片
/// </summary>
static void SetIcon()
{
//Assets下默认图片的路径
string iconPath = "Assets/DemoFolder/Icon/Android/default.png";//填写你自己的
//加载texture
Texture2D icon = AssetDatabase.LoadAssetAtPath<Texture2D>(iconPath);
if (icon == null)
{
Debug.LogError("Icon not found at path: " + iconPath);
return;
}
// 设置默认平台的图标
PlayerSettings.SetIconsForTargetGroup(BuildTargetGroup.Unknown, new Texture2D[] { icon });
//你也可以为特定的平台设置图标,例如iOS, Android
//PlayerSettings.SetIconsForTargetGroup(BuildTargetGroup.iOS, new Texture2D[] { icon });
//PlayerSettings.SetIconsForTargetGroup(BuildTargetGroup.Android, new Texture2D[] { icon });
// 保存
AssetDatabase.SaveAssets();
Debug.Log("Default icon set successfully.");
}
//在这里找出你当前工程所有的场景文件,假设你只想把部分的scene文件打包 那么这里可以写你的条件判断 总之返回一个字符串数组。
public static string[] GetBuildScenes()
{
List<string> names = new List<string>();
foreach (EditorBuildSettingsScene e in EditorBuildSettings.scenes)
{
if (e == null)
continue;
if (e.enabled)
names.Add(e.path);
}
return names.ToArray();
}
}
二、编写shell文件
在项目目录下创建shell文件方便找到使用
#!/bin/sh
#参数判断,确保脚本接收到一个参数
if [ $# != 1 ];then
echo "com.myvision.myapp" # 如果参数数量不正确,输出默认的应用包名
exit 1
fi
#UNITY程序的路径#
UNITY_PATH=/d/Unity/Hub/Editor/2022.3.17f1c1/Editor/Unity.exe
#游戏程序路径#
PROJECT_PATH="你的unity项目路径"
#在Unity中构建apk#
$UNITY_PATH -projectPath "$PROJECT_PATH" -executeMethod ProjectBuild.BuildForAndroid -quit
echo "Apk生成完毕"
#!/bin/sh
: 声明脚本使用的解释器,这里是使用/bin/sh
,即 Bourne shell。if [ $# != 1 ]; then
: 开始条件判断语句,检查脚本是否接收到一个参数。echo "com.myvision.myapp"
: 如果没有接收到参数,输出默认的应用包名。exit 1
: 退出脚本并返回状态码 1,表示错误。$UNITY_PATH -projectPath "$PROJECT_PATH" -executeMethod ProjectBuild.BuildForAndroid -quit
: 使用设置的Unity路径和项目路径,在命令行中执行Unity的-executeMethod
参数指定的方法ProjectBuild.BuildForAndroid
来构建Android的APK,并使用-quit
参数在完成后自动退出Unity编辑器。
如果需要传参数
#!/bin/sh
# 参数判断,确保脚本接收到两个参数
if [ $# != 2 ]; then
echo "Usage: \$0 <parameter1> <parameter2>"
exit 1
fi
# Unity程序的安装路径
UNITY_PATH=/d/Unity/Hub/Editor/2022.3.17f1c1/Editor/Unity.exe
# 游戏项目的路径
PROJECT_PATH="你的unity项目路径"
# 参数1和参数2
PARAM1=\$1
PARAM2=\$2
# 使用Unity构建APK,并传递参数
$UNITY_PATH -projectPath "$PROJECT_PATH" -executeMethod ProjectBuild.BuildForAndroid "$PARAM1" "$PARAM2" -quit
echo "Apk生成完毕"
注意事项:!!!
1.路径格式:在Git Bash或WSL环境中,windows路径需要转换为Unix格式。E:\ 转换为 /e/。
2.引号:路径和参数包含空格时,应该使用引号包裹。
三、使用命令行执行
需要在关闭unity的情况下运行。
使用Git Bash运行脚本
1.导航到脚本所在目录
cd /项目所在路径/
2.赋予执行权限
chmod +x build.sh
3.运行脚本
使用WSL运行脚本
1.打开WSL(如Ubuntu)
2.导航到脚本所在目录
cd /mnt/项目所在路径/
3. 赋予执行权限
chmod +x build.sh
4.运行脚本
./build.sh 包名