【Unity实战】Jenkins与自定义命令行参数

Unity是一款功能强大的游戏开发引擎,它提供了许多方便开发者使用的功能和工具。其中一个非常有用的功能是Unity命令行参数。通过使用命令行参数,开发者可以在启动Unity时自定义一些行为和设置,从而更好地管理和调试项目。

使用Unity命令行参数的好处是,它可以帮助开发者更好地管理和调试项目。通过在命令行中指定参数,我们可以自动化一些常见的任务,例如构建项目、执行测试、导出资源等。这不仅可以提高开发效率,还可以减少人为错误的发生。

当然有些时候我们需要自己定义一个或者多个命令行参数,比如我们要启动一个服务器构建、接入一个CI/CD,人手动操作肯定费时费力,而且不熟悉Unity编辑器的新手难免会出错。

自带参数

首先,在自定义参数前,我们先看一下自带的命令行参数是否就能满足我们的要求。在启动Unity编辑器时,我们可以在命令行中添加参数来改变Unity的行为。这可以通过在命令行中输入"Unity.exe -参数名 参数值"来实现。下面是一些常见的Unity命令行参数的示例:

1. -batchmode:这个参数可以让Unity在无需用户交互的情况下启动并执行指定的任务。这对于自动化构建和持续集成非常有用。

2. -quit:这个参数可以让Unity在启动后立即退出,适用于需要在启动时执行某些任务但不需要打开Unity编辑器的情况。

3. -projectPath:这个参数可以指定Unity项目的路径。通过在命令行中指定项目路径,我们可以直接打开指定的项目而不需要手动选择。

4. -executeMethod:这个参数可以指定在Unity启动后立即执行的方法。我们可以通过这个参数来自动运行一些脚本或者执行一些特定的操作。

5. -nographics:这个参数可以让Unity在无需图形界面的情况下启动。这对于一些服务器或者非图形环境下的使用非常有用。

除了上述示例外,Unity还提供了许多其他的命令行参数,用于控制和定制Unity的行为。开发者可以根据自己的需求来选择和使用这些参数。更多自带参数请访问:

Unity - Manual: Command-line arguments

一般来说,-executeMethod就能满足很多人的要求,这块可以执行一个静态类的静态函数或者方法,发挥空间很足够。当然唯独问题是如果函数方法里有参数需要传递,那么这肯定歇菜。如果你有这个需求,那么就往下看吧!

自定义参数

老规矩,情景教学!当然还是基于我之前的一个公共repo去讲

GitHub - Shepherd0619/JenkinsBuildUnity: A little script that connect Unity (with HybridCLR hot update) and Jenkins together.

假设你要自定义要打的场景及其顺序、打包目标地址,但是我们的Jenkins打包机不可能自己会打开Unity编辑器图形界面修改BuildSettings里的场景设置对吧。

首先先在你的打包脚本(或者另起一个脚本放在Editor文件夹下),我们先获取一下传递进来的参数

// 获取命令行参数
string[] args = Environment.GetCommandLineArgs();

拿到array以后,我们需要筛选出我们的自定义参数,你可以写一个方法

/// <summary>
/// 获取某个参数
/// </summary>
/// <param name="args">全部的命令行参数</param>
/// <param name="name">要获取的参数名称</param>
/// <returns>所求参数</returns>
private static string[] GetArgument(string[] args, string name)
{
	int start = Array.FindIndex(args, arg => arg == $"-{name}");
	if (start < 0)
	{
		Console.WriteLine($"[JenkinsBuild.GetArgument] Can not find argument: {name}");
		return null;
	}
	start++;
	int end = Array.FindIndex(args, start, arg => arg[0] == '-');
	if (end < 0) end = args.Length;
	int count = end - start;
	if (count <= 0)
	{
		Console.WriteLine($"[JenkinsBuild.GetArgument] Can not find argument value: {name}, Count: {count}, Start: {start}, End: {end}");
		return null;
	}

	string[] result = args.Skip(start).Take(count).ToArray();
	return result;
}

 用法可参考如下

        // 获取scenes参数
        string[] scenes = GetArgument(args, "scenes");
        if (scenes == null || scenes.Length <= 0) return;

		// 获取targetPath参数
        string[] targetPath = GetArgument(args, "targetPath");
		if (targetPath == null || targetPath.Length <= 0) return;

		BuildPlayerOptions options = new BuildPlayerOptions();
		options.target = BuildTarget.StandaloneLinux64;
		options.subtarget = (int)StandaloneBuildSubtarget.Server;
		options.scenes = scenes;
		options.locationPathName = targetPath[0];

如代码所示,至于怎么校验参数的有效性,要么判断是否为空,要么看长度,两项只要有一个有问题,那么直接return。 

Jenkins侧

你可以在你Jenkins现有的Job上勾上This project is parameterized来配置参数。

然后在拉起Unity编辑器那块引用上面的参数,如${上面在Jenkins定义的参数名}

保存设置后,以后执行job都会让你配置参数了

总结

总结起来,Unity命令行参数是一种非常有用的工具,可以帮助开发者更好地管理和调试项目。通过使用命令行参数,我们可以在启动Unity时自定义一些行为和设置,从而提高开发效率和减少错误。希望本文对大家了解和使用Unity命令行参数以及如何自定义有所帮助。

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值