如果你使用過unity命令列模式(batchmode
),來實現unity自動化編譯構建,你肯定會遇到過這樣的問題:
unity的命令列模式,它只提供了乙個在這種情況下,我們執行unity命令列程式,只知道了,unity正在工作,但是,工作到什麼進度,從它的unity命令列程式的程序控制台日誌,是看不出來的。-logfile
引數,用於把日誌輸出到日誌檔案,但卻沒有提供實時的日誌輸出功能。《點選參考官方命令列文件》
對於我,折衷的辦法,會在自動化的編譯指令碼裡,在unity命令列執行完畢以後,手動的使用檔案列印命令(cat
),把日誌給列印出來。類似這樣...
# 執行unity
# 列印最終輸出的日誌
cat ~/unityprojectpath/__kellylog.txt
要想在unity命令列模式工作的時候,檢視它的編譯進度,霖哥一般會遠端跑進執行編譯工作的機器,然後用tail -f命令,把它的日誌實時輸出來...
tail -f ~/unityprojectpath/__kellylog.txt
嗯,這相當的不科學啊。
那有沒有更好的方法?可以實時地,在執行unity命令列後台程式的同時,進行日誌輸出?
就像我們前面所說的:unity命令列模式,日誌輸出到檔案中;同時,我平時使用tail -f
命令,進行日誌檢視;
所以解決方法,很簡單,遵循這個思路,做乙個小指令碼:
這個指令碼,呼叫unity命令列模式執行,同時,實現類似tail命令的功能,實時列印日誌指令碼語言的選擇,想要輕便、支援多執行緒、跨平台,python自然是最佳的選擇了。用python的subprocess子程序模組,就能輕鬆實現這樣的功能。
首先,使用subprocess呼叫unity程序,並且實時輸出程序控制台標準輸出的日誌。
# 執行命令,子程序,並把程序控制台日誌,實時輸出
import subprocess
cmd = """
"""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 |你可以跨平台使用這個指令碼,制定unity的路徑(
-unity
),工程路徑(-project
),和需要執行的c#方法(-method
)。
windows:
unity_realtime_log.bat -unity c:\unity\unity.exe -project c:\unityprojectpath -method gameeditor.buildmethod
mac:
或者直接執行python:
python unity_realtime_log.py -unity c:\unity\unity.exe -project c:\unityprojectpath -method gameeditor.buildmethod
這樣簡單的python指令碼,卻能夠支援跨平台,相比使用make / ant / nant等常見的編譯工具,擼那些領域特定語言(如xml),會來得更加的靈活可靠。我個人,也推薦使用python指令碼,作為主力的任務自動化管理工具。
以上,希望對你有幫助。
Unity 命令列打包
在寫文章之前先說下unity已經自帶了視覺化打包,我為什麼要多此一舉進行命令列打包,估計剛接觸unity的小夥伴都會有這樣的疑惑,當你遊戲要發布到android平台你就會知道,需要接不通平台的sdk,甚至有些平台還需要改包名。而遊戲從接完平台sdk,到發布還需要經過無數次的測試,發布後甚至還需若干次...
Unity命令列打包
補充unity編輯器端獲取打包命令列自定義引數,這個可以獲取到所有打包時的引數 string runargs system.environment.getcommandlineargs 一 在assets editor目錄下放個指令碼 using unityengine using unityedi...
突然發現在命令列下面也能執行算術運算
所用到的命令是set 下面是cmd自帶的幫助內容 顯示 設定或刪除 cmd.exe 環境變數。set variable string variable 指定環境變數名。string 指定要指派給變數的一系列字串。要顯示當前環境變數,鍵入不帶引數的 set。如果命令擴充套件被啟用,set 會如下改變 ...