標籤:

【代碼日誌】unity常用邏輯中一個個「靈異現象」的原理記錄

前言:自從開始一步步嘗試些代碼,unity著實給了自己一系列難以理解的困難問題,以及無數作為初學者抓破頭皮,有的甚至是查資料研究一整天也無法解釋的「靈異現象」。這些奇怪的問題有的連怎麼搜索都無從下手,國內的搜索引擎自然更加無能為力。為了便於以後跳過這些「坑」,我先一點點記錄下來。

/*—————————————2016/12/23———————————————*/

1.明明在Awake、Start中設定了某GameObject的Active為false,或者使用GameObject.Find ()函數及其他查詢設定GameObject狀態,但是在運行過程中怎麼都不生效,怎麼都找不到應該找到的對象;重新建一個新的場景,寫一個新的代碼文件就沒有問題。

答案:複雜的邏輯裡面如果出現一些與其他腳本、場景高耦合的代碼,如果當前無法生效(含多種情況,例如預留一些還沒有寫的對象位置卻沒有賦值,或者引用了一些值為null的參數/對象),那麼有時候在Log裡面會提醒空指針,但是有些時候卻不提醒,因為代碼的格式是對的,unity多數情況下是允許未賦值的對象存在在代碼文件里的。

然而這個時候,在Awake、Start的初始化時,往往就會卡到那些未賦值的變數處,不再向下進行,這時候自然就會出現很多邏輯空指針的情況。所以,盡量保證一份乾淨的代碼文件,不要提前預留不需要的變數,改變後暫時不需要的功能要麼注釋掉要麼刪掉。

2.手動在unity編輯模式下為Public的變數賦值,運行時出現報錯【UnassignedReferenceException: The variable xxxxxx(Public變數)of MainMenuUI has not been assigned.】

答案:未分配引用異常。 通常是腳本中的public 類型欄位,在遊戲運行過程中,沒有給予附加相對應的「預設」或者遊戲對象所造成的。 即: 沒有給腳本的公共欄位添加參數造成的。

以上是通用解釋,但是多數情況下即使是初學者也不會犯public欄位不賦值的錯誤,所以這個時候,一定是自己掛了兩個相同腳本在不同的組件上面導致出現了這個問題。所以有出現這個問題的童鞋,找找看看有沒有掛兩個一樣的腳本。

感謝:Unity 中常見錯誤之一UnassignedReferenceException: The variable button of CityScript has not been assigned.

3.使用通用輸入方法Input.GetKeyDown/GetMouseButtonDown等時,往往會出現同樣的操作進行了2次甚至更多的現象,而且此時判斷點擊後再次點擊的邏輯會無效。

答案:問題是出現在Update()的刷新頻率上,由於幀刷新頻率過快,鍵盤io相對較慢,所以會造成鍵盤按下的瞬間幀已然刷了多次,則GetKeyDown()自然會調用多次,出現上述情況。

解決之道:加個判別變數isButtonDown,這樣就不會連續調用了。

if (Input.GetKeyDown(KeyCode.anyKey) && !isButtonDown)

{ isButtonDown = true; }

else if (Input.GetKeyDown(KeyCode.anyKey) && isButtonDown)

{ isButtonDown = false; }

感謝:Unity3d的坑系列之一 Input.GetKeyDown

強調一下,在這裡的邏輯中,一定要使用if……else if的邏輯而不能使用if……if的邏輯。

4.使用NGUI的時候,當按下鍵盤按鍵的時候,滑鼠會每幀強制回到屏幕中間,造成操作不便。

答案:

UICamera會默認將AutoHideCursor打開,解決辦法是將UICamera腳本上的AutoHideCursor的Bool屬性設為false即可關閉此效果。

推薦閱讀:

如何精通C語言
使用subst命令快速跳轉到工作間
買西瓜的高級玩法,用好你的智能手機

TAG:編程 |