NullReferenceException 這是什么意思,原諒我英語不好,看來要好好學學英語了,一門讓我又愛又恨的學科。
空引用異常,暫且就這樣翻譯吧,不要在意,這都不是事,今天要說的這個才是重點,也是我在碼代碼過程中遇到的一些坑吧,哎,就想當年犯下的錯,暫且一記,給以后留個紀念,哈哈,說的有點煽情了,都是廢話,現在進入正題:
開始我想先來一個圖,如下:


東西做的有點low,勉強能看吧,主要是屏幕上的兩個按鈕,button1就是創建一個Cube,button2就是為這個物體創建一個Rigidbody,讓物體下落, 其實這都不是主要的,主要的是看看下面的報錯吧,代碼部分如下:
void OnGUI() { GameObject obj=null; if (GUILayout.Button ("Button1")) { obj = GameObject.CreatePrimitive (PrimitiveType.Cube); } if (GUILayout.Button ("Button2")) { obj.AddComponent<Rigidbody> ().useGravity = false; } }
然后分別點擊button1,button2,錯誤就這么突如其來的出現了,就想哪位讓我等了好久的菇涼,哈哈,雖說沒什么好期待的,現在我們就來分析一下錯誤出現的原因究竟在那個地方,注意重點來了;

其實,這里我犯了一個在別人看來很是簡單的錯誤,從Console上面理解就是我在代碼里面引用了不該引用或者壓根就不存在的東西,由於自己是個小白,所以沒能當即就找出原因所在,然后我就不斷的設置斷點調試,最后發現是這個obj 的鍋,我為這個物體添加了一個Rigidbody組件,但是這個obj壓根就不存在,所以會報錯了,究其原因主要是有以下幾點造成的:
1.代碼寫的不夠嚴密
2.對OnGUI 函數調用的理解不到位,
3.經常犯錯不知道總結
針對以上的三點,特作出下面的解釋
part1.當我們在引用一個對象或者為這個對象添加某個組件的時候,一定要先冷靜下來想一想這個對象是否存在,或者說當游戲開始運行后是否存在,這是兩個不同的概念,也是我犯錯的原因所在,感想,以后在針對這種問題的時候可以先添加一個if語句判斷一下這個obj 是否是null,這樣我們的代碼就嚴密了許多。
part2.OnGUI()函數的調用 規律,一般在每一幀中OnGUI函數都會調用一次,當然還有一些版本說每一幀會調用兩次,反正就是每一幀都會調用就行了,然后我就犯了一個錯誤,把GameObject obj=null;這個語句用在了OnGUI()函數里面了,然后每一幀掉用的過程中,相當於就重新執行了這個語句,最終我按下button1產生的Cube就這樣唄覆蓋了一個null,綜上所敘,以后在聲明變量的過程中最后將一下一次賦值的變量放在那些不是按每一幀(像Update(),FixedUpdate(),OnDUI等等)進行更新的函數里面。然后我就重新做了一下,吧GameObject obj=null;這段語句放在了外面,運行就沒什么問題了。
part3,這個才是本文的重點,也是本文的結束點,為了吸取教訓,特發此記,謹記!!!;
