资讯专栏INFORMATION COLUMN

Unity命令行模式,也能「日志实时输出」

whjin / 2226人阅读

摘要:类似这样执行打印最终输出的日志要想在命令行模式工作的时候,查看它的编译进度,霖哥一般会远程跑进执行编译工作的机器,然后用命令,把它的日志实时输出来嗯,这相当的不科学啊。我是霖哥,一个商学院毕业的程序员,一个游戏开发工程师。

如果你使用过Unity命令行模式(batchmode),来实现Unity自动化编译构建,你肯定会踩过这样的问题:

Unity的命令行模式,它只提供了一个-logfile参数,用于把日志输出到日志文件,但却没有提供实时的日志输出功能。

《点击参考官方命令行文档》

在这种情况下,我们执行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

嗯,这相当的不科学啊。

当类似的情况一而再再而三地出现的时候,你可曾回想起,那作为软件开发人员的最初梦想?——Don"t Repeat Yourself,消灭重复。

那有没有更好的方法?可以实时地,在执行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_realtime_log | https://github.com/mr-kelly/unity_realtime_log

你可以跨平台使用这个脚本,制定Unity的路径(-unity),工程路径(-project),和需要执行的C#方法(-method)。

Windows:

unity_realtime_log.bat -unity C:UnityUnity.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:UnityUnity.exe -project C:UnityProjectPath -method GameEditor.BuildMethod

这样用,就相当于给Unity命令行程序,外挂上了实时日志输出的功能啦。

以上,希望对你有帮助。

我是霖哥,一个商学院毕业的程序员,一个Unity3D游戏开发工程师。
如果觉得有用请点赞,转载请注明出处。
如果在了解或学习编程的过程中有迷惘、或对一些生涩的科技概念的不解,评论里留下你的疑惑!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38555.html

相关文章

  • Linux 下 4 种实时监控日志文件方法

    摘要:通常服务器上的日志都是轮转日志。下面例子演示了如何同时显示两个日志文件。另一个类似的命令是,也能实时监控多个文件。使用同时查看两个日志的方法如下最后你可以用命令查看日志文件,然后按下也能实时查看日志内容。在 Linux 下如何才能实时查看日志内容呢?有很多工具可以帮助我们在文件持续修改的同时输出文件内容,最常用的莫过于 tail 命令 了。1. tail Command – Monitor ...

    Tecode 评论0 收藏0
  • 游戏开发

    摘要:工欲善其事必先利其器游戏环境对比发表算法在游戏上超过人类之后,游戏研究迅速成为了研究热点。当然这不是网络游戏服务器架构概述一架构模型现代电子游戏,基本上都会使用一定的网络功能。 每个程序员都需要知道一些游戏网络知识 本文主要针对游戏的网络设计,在文章中目前主流的网络游戏实现方案都有讲解。从Peer-to-Peer 帧同步,客户端/服务器(c/s架构),客户端预测(Client-Side...

    Enlightenment 评论0 收藏0
  • 推荐一款阿里开源的 Java 诊断工具,好用到爆!

    摘要:是什么鬼是一款阿里巴巴开源的线上诊断工具,功能非常强大,可以解决很多线上不方便解决的问题。诊断使用的是命令行交互模式,支持,操作系统,命令还支持使用键对各种信息的自动补全,诊断起来非常利索。显示当前系统的实时数据面板,按即可退出。 Arthas是什么鬼? Arthas是一款阿里巴巴开源的 Java 线上诊断工具,功能非常强大,可以解决很多线上不方便解决的问题。 Arthas诊断使用的是...

    Rango 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<