什么是空引用异常
对于新手来说,Unity
90%
的运行时错误都是NullReferenceException
,这里就不放chatGpt
的废话了,其就是字面意思,因为各种各样的原因造成了没有引用任何东西的情况。
调试的4个步骤
- 找到报错位置
- 分析哪些造成对象可能为
null
的原因 - 找到这个出问题的对象(
断点、Debug.Log(),Console.WriteLine()
) - 根据你的判断,决定如何处理这个对象。
例子1:一般错误
public class TestNullRef : MonoBehaviour
{
private object myObject;
void Start()
{
Debug.Log(myObject);//null
myObject.ToString();
}
}
根据上面的报错提示,先找到错误的位置,接着理清问题后,就该如何规避了:
- 设个条件判断
- 让类实例,从而实现分配
void Start(){
myObject=new TestObject();
Debug.Log(myObject);
myObject.ToString();
}
private class TestObject{}
例子2:移动物体
一开始我先不设变量的值。
//代码无误的
public class MoveToTarget : MonoBehaviour
{
[SerializeField] private Transform targetTransform;
void Update()
{
Vector3 moveDir = (targetTransform.position - transform.position).normalized;
float moveSpeed = 1f;
transform.position += moveDir * moveSpeed * Time.deltaTime;
//朝相反的方向移动,远离
//targetTransform.position += moveDir * moveSpeed * Time.deltaTime;
}
}
报错:未获取变量。
如果去掉[SerializeField]
改为
private Transform targetTransform;
那么,我们想解决问题,先找到错误的位置了,使用Debug.Log()
查找
void Update()
{
Debug.Log(targetTransform);
Debug.Log(transform);
Vector3 moveDir = (targetTransform.position - transform.position).normalized;
float moveSpeed = 1f;
transform.position += moveDir * moveSpeed * Time.deltaTime;
}
无论是上述哪个错误,就是没写targetTransform
变量的值,补上相应的GameObject
就好了。
我们除了解决这个特定的问题,我们还可以获得什么?
其实存在很多原因造成空引用异常,比如找不到你设置的变量(当然也可能你没设),或者是局部变量与全局变量有冲突等等。
所以我们更应该要培养自己debug的能力,也不要太过依赖chatGpt
,因为它有时挺不靠谱的。文章来源:https://www.toymoban.com/news/detail-500830.html
额外的方法
- 如果是抄别人的教程和代码,遇到null情况,可以选择重启Unity再次运行游戏即可,因为别人都敢出教程了,基本不太可能遇到问题。
- 我写有限状态机时,选择把游戏对象的数据与逻辑进行分层,当inspector显示数据信息,我又运行游戏时,也会报这个错误,总之有些空错误不是自己的问题。
插件方法
https://assetstore.unity.com/packages/tools/game-toolkits/missing-reference-finder-257205文章来源地址https://www.toymoban.com/news/detail-500830.html
到了这里,关于【Unity Debug篇】如何解决空引用异常(NullReferenceException)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!