命令行运行Unity脚本
2016-12-13 10:06
211 查看
想要运行一个Unity项目里的某个脚本方法,正常的方法是打开Unity编辑器,然后通过各种Unity提供的调用方法调用它(帧事件、UI事件、编辑器菜单事件等),今天要说的是通过批处理调用Unity方法。
打开Unity随便创建一个项目,先添加一个TestClass脚本:
我这里展示的是windows平台的批处理方法,至于用Mac下的,请自行修改调整为shell脚本,道理是一样的 。
先创建一个文本文件,写入如下内容并改后缀为bat,这样我们就有了一个批处理脚本:
确保关闭Unity编辑器,然后运行bat文件,等一会就会显示“调用成功”,然后打开unity_log.txt会找到“Call TestClass.TestFunc !”这句话,说明TesstFunc()确实被执行了。 如果“调用失败”,请仔细查看log获取Unity调用失败的原因并修复问题。
可是光执行方法不能满足我们的需要,如果我想传入我的名字作为参数告诉Unity,让log打印出来。那么调用有参数的方法可以吗?比如TestFunc(string myName)。可惜答案是否定的,但是我们有代替办法,就是用启动参数的形式传递数据进去。
我们稍微改一下批处理文件,加点东西进去:
在这行脚本的最后面,我们添加了“-myName LZ”这段信息,它会以启动参数形式发送给Unity.exe(从-quit开始都是启动参数,以空格分割)。接下来修改TestClass.TestFunc()的内容来解析参数:
说一下System.Environment.GetCommandLineArgs()这个方法,功能是获取当前进程的启动参数,并以数组形式返回,因为TestFunc本质上是由unity.exe执行的,所以在TestFunc内就会取得我们提供的参数。
那么为什么我们要用命令行去运行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呢?主要是为了实现一键打包这个功能,具体我会在后面的文章详细说明。
相关文章推荐
- 命令行方式运行PHP脚本
- 使用命令行方式运行 JMeter 脚本
- 命令行运行zend framwork脚本
- Mac OS X 启动自动运行脚本 VS 命令行下连接windows共享
- 命令行方式运行PHP脚本
- 使用命令行方式运行 JMeter 脚本
- 用于建立后台管理与前端应用的虚拟目录链接,请注意以下命令行脚本只限运行于win7系列操作系统
- 命令行运行vbs脚本并传参数给vbs中的变量简单示例
- 如何在命令行下运行PHP脚本[带参数]
- 如何在CLI命令行下运行PHP脚本,同时向PHP脚本传递参数?
- 使用命令行方式运行 JMeter 脚本
- 如何在CLI命令行下运行PHP脚本,同时向PHP脚本传递参数?
- 在命令行下运行PHP脚本[带参数]的方法
- LINUX命令行下如何附带参数运行PHP脚本实例详解
- ccl命令行运行lisp脚本
- UNIX-判断程序是否已经运行的脚本在crontab与命令行下的不同
- 在命令行下运行PHP脚本[带参数]的方法
- 从命令行中运行Ant脚本
- 从终端命令行运行 AppleScript 脚本
- 如何在Windows的命令行cmd中运行vbs和js脚本文件