首页 > 代码库 > Unity游戏开发之路上的那些坑——NullReferenceException

Unity游戏开发之路上的那些坑——NullReferenceException

 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,这个才是本文的重点,也是本文的结束点,为了吸取教训,特发此记,谨记!!!;

Unity游戏开发之路上的那些坑——NullReferenceException