版本:Unity 6 (6000.0)
语言:English
Gizmos 和 Handles
Unity 属性

空引用

在 C# 中,当您尝试访问值为 null 的类型的成员时,就会发生 NullReferenceException。运行时出现的 NullReferenceException 通常意味着您忘记在使用对象引用变量之前对其进行初始化。有关产生空引用的常见编码错误的完整说明,请参阅Microsoft 文档

空引用错误消息类似于

NullReferenceException: Object reference not set to an instance of an object
    at Example.Start () [0x0000b] in /Unity/projects/nre/Assets/Example.cs:10 

此错误消息表明在脚本文件 Example.cs 的第 10 行发生了 NullReferenceException,并且异常发生在 Start() 函数内部。这使得空引用异常易于查找和修复。在此示例中,代码为

using UnityEngine;
using System.Collections;

public class Example : MonoBehaviour {

    // Use this for initialization
    void Start () {
        GameObject myGameObject = GameObject.Find("exampleGameObject");
        Debug.Log(myGameObject.name);
    }
    
}

代码查找名为“exampleGameObject”的GameObjectUnity 场景中的基本对象,可以表示角色、道具、场景、摄像机、路点等。GameObject 的功能由附加到它的组件定义。 更多信息
参见 术语表
。在此示例中,没有名为该名称的 GameObject,因此 Find() 函数返回 null。在下一行(第 9 行),脚本使用 myGameObject 变量打印出它引用的 GameObject 的名称。由于它试图访问不存在的 GameObject,因此 Unity 返回 NullReferenceException

空值检查

在此示例中的解决方案是在给定名称的 GameObject 不存在的情况下包含一个结果。以下脚本检查 go 变量是否返回 null,如果返回则显示一条消息

using UnityEngine;
using System.Collections;

public class Example : MonoBehaviour {

    void Start () {
        GameObject myGameObject = GameObject.Find("exampleGameObject");
        if (myGameObject == null) {
            Debug.Log("No GameObject called exampleGameObject found");
        } else {
            Debug.Log(myGameObject.name);
        }
    }
        
}

自定义 == 运算符

对于继承自 UnityEngine.Object 的类型,Unity 使用 C# 相等和不等运算符 的自定义版本。这意味着先前示例中的空值检查(myGameObject == null)即使 myGameObject 在技术上持有有效的 C# 对象引用,也可以评估为 true(反之,myGameObject != null 可以评估为 false)。这发生在两种情况下

  1. 该对象可以是所谓的“伪空”或占位符对象,Unity 仅在编辑器中使用它来填充未初始化的 MonoBehaviour 字段。这些对象存储有用的调试信息,以帮助您在尝试引用这些字段时找到其来源。
  2. 该对象可以是尚未被垃圾回收的托管(C#)对象,但应被视为 null,因为非托管(C++)对应对象已被销毁。

Try/Catch 块

如果您使用需要在Inspector一个 Unity 窗口,显示有关当前选定的 GameObject、资源或项目设置的信息,允许您检查和编辑值。 更多信息
参见 术语表
窗口中初始化的变量,Unity 也会调用 NullReferenceException。如果您忘记执行此操作,则该变量为 null。处理 NullReferenceException 的另一种方法是使用 try/catch 块。例如

using UnityEngine;
using System;
using System.Collections;

public class Example2 : MonoBehaviour {

    public Light myLight; // set in the inspector
    
    void Start () {
        try {
            myLight.color = Color.yellow;
        }       
        catch (NullReferenceException ex) {
            Debug.Log("myLight was not set in the inspector");
        }
    }
    
}

在此代码示例中,名为 myLight 的变量是一个 Light,您需要在 Inspector 窗口中设置它。如果未设置此变量,则默认为 null

尝试在 try 块中更改灯光颜色会导致 NullReferenceException。如果发生这种情况,catch 块代码将显示一条消息,提醒您在 Inspector 中设置灯光。

其他资源

Gizmos 和 Handles
Unity 属性