栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > Unity3D

【解决】NullReferenceException: Object reference not set to an instance of an object XXXX

Unity3D 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【解决】NullReferenceException: Object reference not set to an instance of an object XXXX

游戏引擎:Unity
版本:2019.4.6f1 【2017版本以上均可】
编译平台:Visual Studio 2019

问题描述
描述
原 文[报错] NullReferenceException: Object reference not set to an instance of an object XXX
中 译空引用异常:对象引用未设置为对象的实例XXXX


  注意:这是一个逻辑层错误所导致的 Error 类型警告。

解决方案

方案一:脚本内部的变量、属性未被赋值(抛出Null引用)

  1. 未对 Component/GameObject 对象赋值。
    解决方法:需使用GetComponent<>(),FindObjectsOfType()等方法来赋值对象。
  2. 未对内部 属性、字段 进行开辟空间。
    解决方法:初始化阶段进行例如 public List objects = new List();

  注意:赋值操作可以是脚本内部逻辑赋值 或 外部Inspector面板拖拽赋值。在进入Runtime后,对字段属性调用时,仍然显示为Null。需根据实际需求,在保持调用时新建该对象或查询该对象(有则赋予,无则创建)思想。


方案二:检查实例化对象是否为抽象
  抽象类无法实例化,导致这一过程是Null。


方案三:Unity 重编译不及时
  有时候代码的修改内容并不会被 Unity 同步。多次尝试修改保存后会解决这类问题。


方案四:其他情况
  存在部分情况下,双击 Unity Conslon(控制台),不会直接弹出问题处的情况,根据其提供的脚本对象逐一使用 Debug.Log() 排查,或配合Visual Studio提供的 “附加到Unity”调试功能,进行排查代码逻辑是否有误。

情景参考

情景一
疑问:在脚本声明了获取Rigidbody组件的方法?却找不到?
回答:但实际上并没有给该脚本附加的对象上添加Rigidbody组件。

private void Method() { Rigidbody n_rig = transform.GetComponent();}

情景二
疑问:我在 情景一 中做了查询,确认了有这一组件。却还是找不到?
回答:好家伙!这个查询方法没有被调用!

private void Awake() { Method(); }

情景三
疑问:资源为什么没有加载出来?
回答:…哦!Sorry,这个资源的名字不是XXXX,而是xxxx。

void Method() {
	GameObject object = 
		Insitance(Resource.Load("Prefabs/xxxx") as GameObject, transform.position);
	object.transform.AddComponent();
}

情景四
疑问:都没问题,却还是报错!
回答:检查空引用报错信息,有明确指明具体空应用信息【学会如何使用控制台将更高效解决】。括弧笑


情景五
  参考报错信息:Object reference not set to an instance of an objectSoundManager.ChangeBgmVolume (System.Single value)
  错误信息指明问题出自于AudioManager.cs脚本内的ChangeBgmVolume()方法,如下图所示为ChangeBgmVolume()方法:

  其中 soundVO:声音配置文件,bgm:游戏中的AudioSource组件。soudVO声音文件在初始化时已经配置。经排查后,发现AudioManager.cs中仅声明了AudioSource类型的存储变量bgm,但并未具体赋值。在Unity编译中出null,现如下图所示:

  正因为导致Unity不清楚这个AudioSource是谁。所以我们需要拖拽一个AudioSource组件给上图,或通过代码GetComponent()来在Start()获取组件。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/897928.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号