想要运行一个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呢?主要是为了实现一键打包这个功能,具体我会在后面的文章详细说明。