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

时间: 2024-12-09 20:21:57

Unity游戏开发之路上的那些坑——NullReferenceException的相关文章

C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二)

本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (一) 上个帖子主要是讲了如何读取Excel,本帖主要是讲述读取的Excel数据是如何序列化成二进制的,考虑到现在在手游中应用很广泛的序列化技术Google的ProtoBuf,所以本文也是按照ProtoBuf的方式来操作的.ProtoBuf是一个开源库,简单来说ProtoBuf就是一个能使序列化的数据变得更小的类库,当然这里指的更小是相对的.好了ProtBuf的东西就不在多说,以后会专门写一篇帖子的.本帖其实就相当于上

C# Unity游戏开发——Excel中的数据是如何到游戏中的 (三)

本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二) 前几天有点事情所以没有继续更新,今天我们接着说.上个帖子中我们看到已经把Excel数据生成了.bin的文件,不过其实这样到游戏中还是不能用的.主要有两个方面,1.bin文件的后缀使我们随便取的名字,但是这种文件Unity不买账.因为Unity中的二进制文件必须是以.bytes命名的.2.在写文件之前其实还可以对二进制进行压缩,这样可以最大化节省设备空间.也就是说我们在生成数据实例后还需要做以下几件事:序列化 -

Unity 游戏开发技巧集锦之使用cookie类型的纹理模拟云层的移动

Unity 游戏开发技巧集锦之使用cookie类型的纹理模拟云层的移动 使用cookie类型的纹理模拟云层的移动 现实生活中,当阳光直射大地,而天空中又有很多云时,云层的影子总是会投射在大地上,风吹着云层移动,影子也跟着运动,如图3-28所示. 图3-28  天空中的云朵与大地上的影子 要在游戏中,模拟与之类似的大气现象时,就需要使用cookie类型的纹理. 制作云层效果的纹理 本小节将使用PhotoShop绘制有云层效果的纹理图,然后为其添加透明度信息.具体操作过程如下: (1)使用Photo

Unity 游戏开发技巧集锦之创建透明的材质

Unity 游戏开发技巧集锦之创建透明的材质 Unity创建透明的材质 生活中不乏透明或者半透明的事物.例如,擦的十分干净的玻璃,看起来就是透明的:一些塑料卡片,看起来就是半透明的,如图3-23所示.在Unity中,可以创建模拟了透明效果的材质,这也是本节主要讲解的内容. 图3-23  半透明的卡片 Unity创建并配置材质 在Project视图里,创建一个材质,并命名为TransMaterial,选中它然后在Inspector视图里修改Shader属性为Transparent/Diffuse,

?Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果

Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果 使用忍者飞镖创建粒子效果 游戏中,诸如烟.火.水滴.落叶等粒子效果,都可以使用粒子系统(particle system)来实现.例如,<明朝传奇>中的篝火,如图2-32所示.粒子系统的最新版本也被称做忍者飞镖(Shuriken),因为场景中添加的粒子系统酷似忍者飞镖,如图2-33所示. 图2-32  游戏中的篝火               图2-33  粒子系统,也被称为忍者飞镖 unity中粒子基本属性 在使用粒子系统前,先了解一下它

unity游戏开发之自定义事件测试demo

上文中写了unity游戏开发自定义消息事件点击打开链接 下面是测试demo 第一,打卡unity,新建一个场景,然后新建一个空的游戏对象,如图中的EventObj 第二步,测试代码EventTest.as,直接拖拽给上面的空游戏对象EentObj 测试代码如下: using UnityEngine; using System.Collections; public class EventTest : MonoBehaviour { // Use this for initialization v

Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机

Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机 Unity中制作一个望远镜 本节制作的望远镜,在鼠标左键按下时,看到的视图会变大:当不再按下的时候,会慢慢缩小成原来的视图.游戏中时常出现的狙击手就是使用望远镜的一个例子,如图2-22所示.   图2-22  游戏中狙击手所看到的视图 制作望远镜的过程如下: (1)在Project视图里,创建一个C#脚本文件,命名为TelescopicView.打开这个脚本文件,并在里面添加下面的代码: 01     using UnityEngine

Unity游戏开发实战视频教程

Unity客户端架构设计与网络游戏关键技术(Avatar,热更新,Protobuf)课程分类:游戏开发适合人群:中级课时数量:20(42节)课时用到技术:Unity客户端,UI设计框架,Avatar换装,Protobuf-net等涉及项目:搭建Unity客户端 UI设计框架以及Avatar换装和移动端热更新技术实现以及Protobuf-net在Unity中运用咨询qq:1840215592 课程介绍:1.课程研发环境开发工具:Unity4.6和VS20082.内容简介本课程内容详细介绍了如何实现

Unity 游戏开发技巧集锦之材质的应用的创建反射材质

Unity 游戏开发技巧集锦之材质的应用的创建反射材质 Unity中材质的应用 游戏中,大多数材质的应用都离不开纹理,而纹理本身是图片.所以,在学习本章时,最好在电脑上安装一个可以编辑图片的功能强大的软件,如Photoshop和GIMP.本章使用的是前者.另外,有些纹理需要包含Transparents通道,所以图片最好保存成可以存储相应信息的格式,例如,PSD和TGA. unity中创建反射材质 生活中,反射材质(reflective material)的实例有很多.例如,水面.光滑的金属.镜子