为什么我的Rigidbody!=看到它为空后立即为null?

时间:2015-06-06 15:30:17

标签: c# generics unity3d null

我正在检查“我的游戏对象”是否有一个Rigidbody。它不是。但是对Rigidbody进行空检查的条件失败了,尽管事实证明它是空的。

为什么会这样?如何让条件阻止运行?

using UnityEngine;
using System.Collections;

public class NullChecker : MonoBehaviour
{

    void Start()
    {
        GameObject go = GameObject.Find("My Game Object");
        CheckIfNull<Rigidbody>(go);
    }

    public void CheckIfNull<ComponentType>(GameObject gameObject)
    {
        ComponentType component = gameObject.GetComponent<ComponentType>();
        Debug.Log("Component is " + component); //"Component is null"
        if (component == null)
        {
            Debug.Log("Inside null check"); //Never prints
        }
        Debug.Log("Finished null check"); //Does print
    }

}

3 个答案:

答案 0 :(得分:1)

null对象引用未格式化为"null"。它们格式化为空字符串。 component不是空的。它的ToString输出为"null"

答案 1 :(得分:0)

从其他研究(Equals(item, null) or item == nullUnity Forums)中详细阐述了usr的答案:

我需要保证在CheckIfNull标头中传递了一个Component。更新后的代码如下所示:

using UnityEngine;
using System.Collections;

public class NullChecker : MonoBehaviour
{

    void Start()
    {
        GameObject go = GameObject.Find("My Game Object");
        CheckIfNull<Rigidbody>(go);
    }

    public void CheckIfNull<ComponentType>(GameObject gameObject) where ComponentType : Component
    {
        ComponentType component = gameObject.GetComponent<ComponentType>();
        Debug.Log("Component is " + component); //"Component is null"
        if (component == null)
        {
            Debug.Log("Inside null check"); //Never prints
        }
        Debug.Log("Finished null check"); //Does print
    }

}

答案 2 :(得分:0)

非常确定gameObject.GetComponent()不会返回null。它必须返回一个具有返回“null”的.ToString()方法的对象。 如果它实际上是null

的结果
"Component is " + component 

将是“Component is”,因为null将是字符串连接中的空字符串。

您可以调试代码并设置断点以查看GetComponent返回的内容吗?在立即窗口或本地窗口中查看它。