Unity命令列模式,也能 日誌實時輸出

2022-03-22 09:25:05 字數 2523 閱讀 6874

如果你使用過unity命令列模式(batchmode),來實現unity自動化編譯構建,你肯定會遇到過這樣的問題:

unity的命令列模式,它只提供了乙個-logfile引數,用於把日誌輸出到日誌檔案,但卻沒有提供實時的日誌輸出功能。

《點選參考官方命令列文件》

在這種情況下,我們執行unity命令列程式,只知道了,unity正在工作,但是,工作到什麼進度,從它的unity命令列程式的程序控制台日誌,是看不出來的。

對於我,折衷的辦法,會在自動化的編譯指令碼裡,在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 會如下改變 ...