命令行运行Unity脚本

        想要运行一个Unity项目里的某个脚本方法,正常的方法是打开Unity编辑器,然后通过各种Unity提供的调用方法调用它(帧事件、UI事件、编辑器菜单事件等),今天要说的是通过批处理调用Unity方法。

        打开Unity随便创建一个项目,先添加一个TestClass脚本:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class TestClass : MonoBehaviour
{
	static void TestFunc()
	{
		Debug.Log("Call TestClass.TestFunc !");
	}
}
        TestClass.TestFunc()就是我们想要运行的方法,我们希望在某个地方看到它输出的“Call TestClass.TestFunc !”这段文字。

        我这里展示的是windows平台的批处理方法,至于用Mac下的,请自行修改调整为shell脚本,道理是一样的 。

        先创建一个文本文件,写入如下内容并改后缀为bat,这样我们就有了一个批处理脚本:

@echo off
set UNITY_PATH=D:\Unity5\Editor\Unity.exe
set PROJECT_PATH=D:\Projects\MyProject
set LOG_PATH=%cd%\unity_log.txt
set METHOD_NAME=TestClass.TestFunc

%UNITY_PATH% -quit -batchmode -logFile %UNITY_LOG_PATH% -projectPath %UNITY_PROJECT_PATH% -executeMethod %UNITY_METHOD_NAME%

if %errorlevel% == 0 (echo 调用成功) else (echo 调用失败,请查看unity_log.txt)
        这个批处理一共有4个参数,分别是Unity.exe的路径、项目路径、日志路径、方法名。把这些参数都配置好。启动Unity.exe(%UNITY_PATH%)这一行有很多参数,各自有其功能,可以参考Unity圣典翻译的手册文章: http://www.ceeger.com/Manual/CommandLineArguments.html

        确保关闭Unity编辑器,然后运行bat文件,等一会就会显示“调用成功”,然后打开unity_log.txt会找到“Call TestClass.TestFunc !”这句话,说明TesstFunc()确实被执行了。 如果“调用失败”,请仔细查看log获取Unity调用失败的原因并修复问题。

        可是光执行方法不能满足我们的需要,如果我想传入我的名字作为参数告诉Unity,让log打印出来。那么调用有参数的方法可以吗?比如TestFunc(string myName)。可惜答案是否定的,但是我们有代替办法,就是用启动参数的形式传递数据进去。

        我们稍微改一下批处理文件,加点东西进去:

%UNITY_PATH% -quit -batchmode -logFile %UNITY_LOG_PATH% -projectPath %UNITY_PROJECT_PATH% -executeMethod %UNITY_METHOD_NAME% -myName LZ

        在这行脚本的最后面,我们添加了“-myName LZ”这段信息,它会以启动参数形式发送给Unity.exe(从-quit开始都是启动参数,以空格分割)。接下来修改TestClass.TestFunc()的内容来解析参数:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class TestClass : MonoBehaviour
{
	static void TestFunc()
	{
		string myName = string.Empty;
		string[] ss = System.Environment.GetCommandLineArgs();
		for (int i = 0; i < ss.Length; i++)
		{
			if (ss[i] == "-myName")
			{
				myName = ss[i + 1];
			}
		}
		Debug.Log("Call TestClass.TestFunc by " + myName);
	}
}
        别忘了打开Unity让代码编译,然后再关闭Unity运行bat脚本。此时的输出就会变为“Call TestClass.TestFunc by LZ”,我想告诉Unity的信息成功的被Unity获取了。

        说一下System.Environment.GetCommandLineArgs()这个方法,功能是获取当前进程的启动参数,并以数组形式返回,因为TestFunc本质上是由unity.exe执行的,所以在TestFunc内就会取得我们提供的参数。

        那么为什么我们要用命令行去运行Unity呢?主要是为了实现一键打包这个功能,具体我会在后面的文章详细说明。

Unity提供了一些命令行工具来支持自动化构建,例如Unity编辑器的批处理模式和Unity命令行工具。Jenkins是一种流行的自动化构建工具,可以通过编写脚本来自动化Unity项目的构建和部署。以下是一个简单的Jenkins脚本示例: ``` stage('Build Unity Project') { steps { sh "unity -batchmode -quit -projectPath /path/to/project -executeMethod BuildScript.PerformBuild -logFile /path/to/logfile.log" } } ``` 在这个脚本中,我们使用Unity批处理模式来构建Unity项目。`-batchmode`参数告诉Unity批处理模式运行,`-quit`参数告诉Unity在完成操作后关闭编辑器,`-projectPath`参数指定项目路径,`-executeMethod`参数指定要执行的方法,`-logFile`参数指定日志文件路径。 在你的Unity项目中,你需要编写一个自定义的编辑器脚本来实现构建逻辑。这个脚本需要继承自`EditorWindow`或`Editor`类,并实现一个名为`PerformBuild`的静态方法。在这个方法中,你可以使用Unity的API来自定义构建流程,例如导出游戏包或生成可执行文件。 ``` public static void PerformBuild() { BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions(); buildPlayerOptions.scenes = new[] { "Assets/Scenes/Main.unity" }; buildPlayerOptions.locationPathName = "/path/to/build"; buildPlayerOptions.target = BuildTarget.StandaloneWindows64; buildPlayerOptions.options = BuildOptions.None; BuildPipeline.BuildPlayer(buildPlayerOptions); } ``` 在这个示例中,我们使用BuildPipeline类来构建游戏包。我们指定了要打包的场景、输出路径、目标平台和构建选项。 在Jenkins中,你可以将以上脚本复制到一个新的构建步骤中,并配置好Unity的安装路径、项目路径和日志文件路径。当你运行Jenkins构建时,它将自动构建你的Unity项目,并将日志输出到指定的文件。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值