轉自本身的簡書:http://www.jianshu.com/p/bd97cb8042a9html
若是你使用過Unity命令行模式(batchmode
),來實現Unity自動化編譯構建,你確定會遇到過這樣的問題:python
Unity的命令行模式,它只提供了一個
-logfile
參數,用於把日誌輸出到日誌文件,但卻沒有提供實時的日誌輸出功能。git
在這種狀況下,咱們執行Unity命令行程序,只知道了,Unity正在工做,可是,工做到什麼進度,從它的Unity命令行程序的進程控制檯日誌,是看不出來的。github
對於我,折衷的辦法,會在自動化的編譯腳本里,在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
嗯,這至關的不科學啊。app
那有沒有更好的方法?能夠實時地,在執行Unity命令行後臺程序的同時,進行日誌輸出?工具
就像咱們前面所說的: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:\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遊戲開發工程師。若是以爲有用請點贊,轉載請註明出處。若是在瞭解或學習編程的過程當中有迷惘、或對一些生澀的科技概念的不解,評論裏留下你的疑惑!