關於 web service, unity, blogger 等軟體工程筆記

Unity Debug Case

Edit icon 沒有留言
Unity Debug Case

這篇起因來自於 Facebook 遊戲開發者社團的這篇求助文

先搞清楚作者在問什麼吧

這是錯誤訊息,導致我無法鍵入 1234 去改變動畫的動作,我應該怎麼排解呢?

錯誤?經過這麼多年寫程式經驗,對於錯誤這關鍵字太敏感了,第一個冒出的想法疑問是「是什麼錯誤?」「有沒有 Error Log?」。有錯誤沒有附上 Error Log,是沒有辦法隔空抓藥。先請作者上傳 Unity Console 上的訊息來看看。當然也先釐清是否是編譯錯誤(Compile Error)。

Assets/UnityChan/Scripts/UnityChanControlScriptWithRgidBody.cs(178,43): warning CS0618: `UnityEngine.AnimatorStateInfo.nameHash' is obsolete: `Use AnimatorStateInfo.fullPathHash instead.'

看到作者所貼上的 Console 訊息,這些都是編譯器的警告,警告有些程式碼使用 Unity 過時(Obsolete)的功能,雖說現在還可以正常使用,但隨著 Unity 版本更新,這些過時的功能將不在被維護,可能會造成執行錯誤。

為什麼作者說執行錯誤是跟著寫警告有關係?想想應該是作者應該還是英文初學者,還不太了解改警告的說明,或是還沒養成習慣,查詢該警告是什麼意思。

當下想說若作者安裝該 Demo 所使用的 Unity 版本,這些過時的警告訊息應該都不會出現。從作者給的參考專案連結,找到 Project settings/ProjectVersion.txt 的內容,得知其專案使用的 Unity 版本。

之後想想不太對,這警告應該不會造成什麼錯誤,重新翻一遍留言紀錄,恍然大悟。原以為錯誤是指編譯錯誤(Compile Errors)或是執行錯誤(Runtime Errors),原來是自己當時想錯了方向,作者是詢問結果錯誤(Result Errors)。

既然是結果錯誤,從留言知道事主希望,當按下數字鍵 1,2,3,或是 4 時切換角色動畫。從作者提供的程式碼中,理解不是 Update 沒有呼叫,或是 if 判斷式沒滿足,不然就是 Animator Play 內部出了錯,所以導致沒能切換角色動畫。

void Update ()
{
if (Input.GetKeyDown("1"))
{
anim.Play("WAIT01", -1, 0f);
}
// Others...
}

先假設 Update 會被呼叫。以經驗來說,Animator 呼叫 Play 失敗時,應該會有執行錯誤訊息,但從作者貼的 Console Log 沒有看到,那麼八成就是 if 調整沒有滿足。速查 Unity 關於 Input.GetKeyDown 的使用文件,應該是作者沒有設定 Input Setting 的按鍵對應,所以 if 永遠不會滿足。

直接請作者改成以下程式,經過修改就解決了作者的問題。

void Update ()
{
if (Input.GetKeyDown(KeyCode.Keypad1) || Input.GetKeyDown(KeyCode.Alpha1))
{
anim.Play("WAIT01", -1, 0f);
}
// Others...
}

關於錯誤的求助文

遇到因為錯誤需要隔空抓藥來解決問題的詢問,先看有沒有提供程式碼,有沒有怎麼發生錯誤的描敘,以及程式回報的錯誤訊息。通常沒有程式碼,沒有錯誤訊息就直接略過不讀了,因為這根本是浪費時間,當然有些網友會引導詢問者,一步步協助解決,但這機會可遇不可求,大家時間都很寶貴。

至於常詢問的 Unity 錯誤分類,有些人問問題比較沒有經驗,還沒有辦法精準描敘是什麼錯誤,因此大致上用兩個問題可以分個大概,如下圖的詢問架構。

Unity 簡易錯誤分類法

編譯錯誤(Compile Error)通常會是程式碼陳敘式(Syntax)不正確。執行錯誤(Run-time Error),就要看執行階段的錯誤訊息是什麼。以上兩個錯誤都很好解決,因為 Console 通常會都會詳盡的錯誤訊息。最難解決的是結果錯誤(Result Error),這種問題要了解需求,以及執行階段的環境,需要仔細看過程式碼,去推敲猜測問題出在哪裡。

沒有留言: