Unity命令行模式,也能「日志实时输出」
2017-03-28 09:34
387 查看
如果你使用过Unity命令行模式(
batchmode),来实现Unity自动化编译构建,你肯定会遇到过这样的问题:
在这种情况下,我们执行Unity命令行程序,只知道了,Unity正在工作,但是,工作到什么进度,从它的Unity命令行程序的进程控制台日志,是看不出来的。
对于我,折衷的办法,会在自动化的编译脚本里,在Unity命令行执行完毕以后,手动的使用文件打印命令(
cat),把日志给打印出来。类似这样...
# 执行Unity /Applications/Unity/Unity.app/Contents/MacOS/Unity -batchmode -projectPath ~/UnityProjectPath -nographics -executeMethod GameEditor.BuildApp -logFile ~/UnityProjectPath/__kellylog.txt # 打印最终输出的日志 cat ~/UnityProjectPath/__kellylog.txt
要想在Unity命令行模式工作的时候,查看它的编译进度,霖哥一般会远程跑进执行编译工作的机器,然后用tail -f命令,把它的日志实时输出来...
tail -F ~/UnityProjectPath/__kellylog.txt
嗯,这相当的不科学啊。
那有没有更好的方法?可以实时地,在执行Unity命令行后台程序的同时,进行日志输出?
Python多线程
就像我们前面所说的:Unity命令行模式,日志输出到文件中;同时,我平时使用tail -f命令,进行日志查看;
所以解决方法,很简单,遵循这个思路,做一个小脚本:
这个脚本,调用Unity命令行模式执行,同时,实现类似tail命令的功能,实时打印日志
脚本语言的选择,想要轻便、支持多线程、跨平台,Python自然是最佳的选择了。用Python的subprocess子进程模块,就能轻松实现这样的功能。
首先,使用subprocess调用Unity进程,并且实时输出进程控制台标准输出的日志。
# 执行命令,子进程,并把进程控制台日志,实时输出 import subprocess cmd = """ /Applications/Unity/Unity.app/Contents/MacOS/Unity -batchmode -projectPath ~/UnityProjectPath -nographics -executeMethod GameEditor.BuildApp -logFile ~/UnityProjectPath/__kellylog.txt """ process = subprocess.Popen( cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=project_path ) while True: out = process.stdout.read(1) if out == '' and process.poll() != None: break if out != '': sys.stdout.write("[Unity process console output]: " + out) sys.stdout.flush()
然后,发起一个线程,使用python-tail模块,实时把日志文件,进行抓取输出。
import thread, tail def tail_thread(tail_file): t = tail.Tail(tail_file) t.register_callback(unity_log_tail) t.follow(s=1) thread.start_new_thread(tail_thread, ('~/UnityProjectPath/__kellylog.txt', ))
你看,其实很简单的脚本,动动脑、动动手,就能实现达到目的,就一个子进程,加一个线程嘛。
源码
上面的只是不完整的一小段脚本技巧,完整的代码可以直接使用,开源在GitHub:你可以跨平台使用这个脚本,制定Unity的路径(
-unity),工程路径(
-project),和需要执行的C#方法(
-method)。
Windows:
unity_realtime_log.bat -unity C:\Unity\Unity.exe -project C:\UnityProjectPath -method GameEditor.BuildMethod
Mac:
unity_realtime_log.sh -unity /Applications/Unity/Unity.app/Contents/MacOS/Unity -project ~/UnityProjectPath -method GameEditor.BuildMethod
或者直接执行Python:
python unity_realtime_log.py -unity C:\Unity\Unity.exe -project C:\UnityProjectPath -method GameEditor.BuildMethod
这样简单的Python脚本,却能够支持跨平台,相比使用make / Ant / NAnt等常见的编译工具,撸那些领域特定语言(如XML),会来得更加的灵活可靠。我个人,也推荐使用Python脚本,作为主力的任务自动化管理工具。
以上,希望对你有帮助。
我是霖哥,一个商学院毕业的程序员,一个Unity3D游戏开发工程师。
如果觉得有用请点赞,转载请注明出处。
如果在了解或学习编程的过程中有迷惘、或对一些生涩的科技概念的不解,评论里留下你的疑惑!
相关文章推荐
- Unity命令行模式,也能「日志实时输出」
- JMeter学习-023-JMeter 命令行(非GUI)模式详解(一)-执行、输出结果及日志、简单分布执行脚本
- Unity 通过 adb logcat 命令行 输出 日志
- Python使用logging结合decorator模式实现优化日志输出的方法
- Java实时监控日志文件并输出(已进行修改,运行没问题)
- cmd命令行中logcat输出日志中文乱码(转载)
- 【Python】logging结合decorator模式实优化日志输出
- logcat日志在网页上的实时输出(环形日志缓冲区的实现)
- Python篇----命令行调用、输出log日志并打包的脚本
- 装饰模式(Decorator pattern)应用----日志信息输出
- 如何把tomcat的日志实时输出到web页面上
- Unity 实现Log实时输出到屏幕或控制台上<一>
- cmd 命令行模式下不能输入中文或输出中文时显示乱码的解决方案
- Unity 实现Log实时输出到屏幕或控制台上<二>
- Unity 实现Log实时输出到屏幕或控制台上<二>
- DEBUG模式 输出日志
- cmd 命令行模式下输出中文时显示乱码的解决方案
- C# 调用带参数的控制台程序 并将命令行输出的内容实时输出至窗体中的显示控件
- 20140422工作日志:命令行单斜杠,命令行输出变量
- Unity 实现Log实时输出到屏幕或控制台上<一>