命令行运行Unity脚本

来源:互联网 发布:java 静态变量 泛型 编辑:程序博客网 时间:2024/04/30 21:07

        想要运行一个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 offset UNITY_PATH=D:\Unity5\Editor\Unity.exeset PROJECT_PATH=D:\Projects\MyProjectset LOG_PATH=%cd%\unity_log.txtset 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呢?主要是为了实现一键打包这个功能,具体我会在后面的文章详细说明。

0 0
原创粉丝点击