Unity命令行模式,也能「日誌實時輸出」

如果你使用過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 subprocesscmd = """/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, taildef 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命令行程序,外掛上了實時日誌輸出的功能啦。

以上,希望對你有幫助。

PS:

感謝評論@jayatubi 的提醒,其實在Mac和Linux下,可以直接-logfile /dev/stdout就能解決問題了。(尷尬,我用的是Windows)。

有一篇韓國文章,也說過這個方法:yokuarunanika.blogspot.kr

之所以寫本文,因為沒有網上找不到相關的方法,如果你有更好的方法,我還是希望,你除了心裡默默地罵「切」以外,也能留下評論,獨樂樂不如眾樂樂。

我是霖哥,一個商學院畢業的程序員,Unity3D遊戲開發工程師。

如果覺得有用請點贊,轉載請註明出處。

推薦閱讀:

利用GPU實現無盡草地的實時渲染

TAG:Unity游戏引擎 | DevOps | 游戏开发 |