使用命令行运行unity并执行某个静态函数(运用于命令行打包和批量打包)

这个bat批处理首先判断Unity是否运行中,如果运行中,则先杀掉Unity,然后启动Unity并执行某个Editor的静态函数

bat脚本例子:

::判断Unity是否运行中
TASKLIST /V /S localhost /U %username%>tmp_process_list.txt
TYPE tmp_process_list.txt |FIND "Unity.exe"

IF ERRORLEVEL 0 (GOTO UNITY_IS_RUNNING)
ELSE (GOTO START_UNITY)

:UNITY_IS_RUNNING
::杀掉Unity
TASKKILL /F /IM Unity.exe
::停1秒
PING 127.0.0.1 -n 1 >NUL
GOTO START_UNITY

:START_UNITY
C:
CD C:\Program Files\Unity\Editor
.\Unity.exe -projectPath E:\my_project\testProject -quit -batchmode -executeMethod BuildTools.BuildApp

PAUSE

py脚本例子:

(把下面的python脚本保存为unity_call.py,放在工程目录中,即Assets的外层目录)

import os
import sys
import time
 
# 设置你本地的Unity安装目录
unity_exe = 'D:/software/Unity/Editor/Unity.exe'
# unity工程目录,当前脚本放在unity工程根目录中
project_path = 'E:/UnityProject/test1'
# 日志
log_file = os.getcwd() + '/unity_log.log'

static_func = 'BuildTools.BuildApp'

# 杀掉unity进程
def kill_unity():
    os.system('taskkill /IM Unity.exe /F')
 
def clear_log():
    if os.path.exists(log_file):
        os.remove(log_file)

# 调用unity中我们封装的静态函数
def call_unity_static_func(func):
    kill_unity()
    time.sleep(1)
    clear_log()
    time.sleep(1)
    cmd = 'start "窗口名" "%s" -projectPath %s -logFile %s -executeMethod %s'%(unity_exe,project_path,log_file,func)
    print('run cmd:  ' + cmd)
    os.system(cmd)

    
 
# 实时监测unity的log, 参数target_log是我们要监测的目标log, 如果检测到了, 则跳出while循环    
def monitor_unity_log(target_log):
    while True:
        if os.path.exists(log_file):
            break
        else:
            time.sleep(0.1) 

    fd = open(log_file, 'r')

    while True:
        line = fd.readline()
        pos = pos + len(line)
        if target_log in line:
            print(u'监测到unity输出了目标log: ' + target_log)
            fd.close()
            break
        if line.strip():
            print(line)

    fd.close()
 
if __name__ == '__main__':
    call_unity_static_func(static_func)
    monitor_unity_log('end build')
    print('done')

在Unity中的Editor目录中新建一个MyEditorScript.cs脚本,如下

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


public class BuildTools 
{
    [MenuItem("Pack/BuildApp")]
    public static void BuildApp()
    {
        var levels  = new string[] { "Assets/Scenes/SampleScene.unity" };
        BuildPipeline.BuildPlayer(levels, "Build/test.apk" + appName, BuildTarget.Android, BuildOptions.None);
        Debug.Log("end build");
    }
}

MAC

mac的话,杀掉Unity进程的命令

ps -ef|grep Unity|grep -v grep|cut -c 9-15|xargs kill -9

也可能是

ps -ef|grep Unity|grep -v grep|cut -c 8-12|xargs kill -9

说明:

“cut -c 9-15”是截取输入行的第9个字符到第15个字符,而这正好是进程号PID。 

“xargs kill -15”中的xargs命令是用来把前面命令的输出结果(PID)作为“kill -15”命令的参数,并执行该令。

另外,我们也可以使用python的osutil库来获取进程信息,并通关os.kill来杀掉进程,例:

import os
import psutil
import signal

for proc in psutil.process_iter():
    pinfo = proc.as_dict(attrs=['pid', 'name'])
    if 'Unity' in pinfo['name']:
        print(pinfo)
        os.kill(pinfo["pid"], signal.SIGINT)

启动Unity的命令(具体路径根据你的安装目录)

/Applications/Unity/Unity.app/Contents/MacOS/Unity


Unity命令行参数解释:

-batchmode
   在 批处理模式下运行Unity。应始终与其他命令行参数一起使用,因为它确保不会弹出窗口,无需任何人为的干预。当脚本代码在执行过程中发生异常,资源服务 器更新失败或其他操作失败时Unity将立即退出,并返回代码为1。请注意,在批处理模式下, Unity将向控制台发送输出版本最小的日志。当然,日志文件将包含完整的日志信息。
-quit
   其他命令执行完毕后将退出Unity编辑器。请注意,这可能会导致错误消息被隐藏(但他们将显示在Editor.log文件)
-buildWindowsPlayer <pathname>
   建立一个单独的Windows游戏(例如:-buildWindowsPlayer path/to/your/build.exe)
-buildOSXPlayer <pathname>   建立Mac游戏(例如:-buildOSXPlayer path/to/your/build.app)-importPackage <pathname>
   导入提供的package,不会显示导入对话框
-createProject <pathname>
   根据提供的路径建立一个空项目
-projectPath <pathname>
   打开指定路径的项目
-logFile <pathname>
   指定将要被写入编辑的log文件
-assetServerUpdate <IP[:port] projectName username password [r <revision>]>
   可 通过ip端口强制更新资源服务器的项目。端口是可选的,如果不是的话可以假定一个标准端口(10733)。最好使用此命令配合- projectpath参数确保你在正确的项目里工作。如果没有提供项目名字是那么就是最后一个Unity打开的项目。如果没有选择项目的路径则由- projectpath自动创建。
-exportPackage <exportAssetPath exportFileName>
   根 据路径导出package。exportAssetPath是一个文件夹(相对Unity项目的根目录)为了导出Unity项目并且 exportFileName是package的名称。目前,此选项只能在同一个时间导出整个文件夹。这个命令通常需要使用- projectpath参数
-nographics (Windows only)
   当运行在批处理模式,不会初始化显卡设备。这使得它可以在你的机器上自动按工作流程运行,甚至它没有GPU。
-executeMethod <ClassName.MethodName>
   在 Unity启动的同时会执行静态方法,该项目是开放的并且是在可选资源服务器更新完成之后。这可以用来不断的整合,进行单元测试,制作模型,准备一些数据 等。如果你想通过命令行返回一个错误,你可以抛出一个异常,会引发代码为1的Unity关闭或其他引发EditorApplication.Exit非零 代码。使用executeMethod,你需要在编辑文件夹有一个脚本并且类里有一个静态函数。
-batchmode
   在"headless"模式下运行游戏。游戏将不显示任何内容,或接受用户输入。这对运行网络游戏的服务器有很大的作用的。
-force-opengl (Windows only)
   让游戏使用OpenGL进行渲染,即使有可用的Direct3D。通常情况是使用Direct3D,但如果是Direct3D 9.0c的不可用的话则会选用OpenGL。
-single-instance (Windows only)
   在同一时候只允许一个游戏实例运行。如果另一个实例已在运行,然后再次通过 -single-instance启动它的话会调节到现有的这个实例。
-nolog (Windows only)
   不产生输出日志。 通常output_log.txt被写在游戏输出目录下的*_Data文件夹中 ,在debug.log中打印输出的地方。
-force-d3d9-ref (Windows only)
   使游戏运行在Direct3D的"Reference"软件渲染模式,必须要安装DirectX SDK才能使其工作。这主要是用于建立自动化测试对象,这样您可以确保不管是使用什么显卡,其渲染效果是完全一样的。
-adapter N (Windows only)
   允许游戏全屏运行在另一台显示器上,其中N表示显示的号码。
-popupwindow (Windows only)
   这个窗口将以弹出的方式创建(没有框架)

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Unity 提供了自动化构建的命令行工具,可以用来打包和编译 Il2Cpp。以下是在 Windows 系统上的操作步骤: 1. 打开 Unity 编辑器,打开需要构建的 Android 项目。 2. 进入 File -> Build Settings 菜单,选择 Android 平台,并点击 Switch Platform 按钮。 3. 设置好需要构建的场景,并在右侧的 Player Settings 中设置好相应的 Android 构建选项。 4. 点击 Build 按钮,选择需要导出的文件夹,并导出项目。 5. 在导出的文件夹中,会生成一个名为 build.xml 的文件。这个文件包含了项目构建的所有信息。 6. 打开命令行窗口,进入到 Android SDK 的 build-tools 目录下。 7. 执行以下命令,开始构建 APK 文件: ``` ./android create project --target <target> --name <name> --path <path> --activity <activity> --package <package> ``` 其中,`<target>` 是 Android 平台的版本号,例如 `android-28`;`<name>` 是项目的名称;`<path>` 是项目的路径;`<activity>` 是项目的启动 Activity;`<package>` 是项目的包名。 8. 执行以下命令,开始编译 Il2Cpp: ``` ./il2cpp.exe --compile-cpp --platform=Android --architecture=<arch> --configuration=Release --outputdir=<outputdir> --cachedirectory=<cachedirectory> --additional-include-directories=<additional-include-directories> --additional-libraries=<additional-libraries> --output-name=<output-name> ``` 其中,`<arch>` 是目标架构的名称,例如 `arm64-v8a`;`<outputdir>` 是输出目录;`<cachedirectory>` 是缓存目录;`<additional-include-directories>` 是需要包含的头文件目录;`<additional-libraries>` 是需要包含的库文件目录;`<output-name>` 是输出的库文件名称。 9. 等待编译完成后,就可以在输出目录中找到生成的库文件了。 以上是在 Windows 系统上的操作步骤,如果你使用的是其他操作系统,则需要相应的调整命令。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林新发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值