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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值