gameObject.GetComponent<T> != null 始终为真。如何?

gameObject.GetComponent<T> != null is always true. How?

  1. 我有一个包含 3 个游戏对象的列表。只有一个游戏对象附加了 Light 组件。

  2. 我正在像这样遍历所有游戏对象的列表

      foreach (var eachGameObject in objs) //eachGamObject represents one of the three game objects in a list. 
    
  3. 在 foreach 中,我正在检查每个游戏对象是否附加了 T 类型的组件,就像这样

if(eachGameObject.GetComponent<T>() != null)

  1. “T”是泛型。它可以是任何组件。在我的例子中,我试图找到一个在场景中附加了 Light 组件的 GameObject。

问题:

即使只有一个游戏对象附加了一个 Light 组件,第 3 点中的“if”总是会执行并且它永远不会为 NULL。

怎么样?我总是将“Light”作为“T”传递,显然只有一个游戏对象附加了 Light 组件。

快把我逼疯了,非常感谢任何帮助!

这是完整的功能:

 public List<T> FindInScene<T>()
    {
        var objs = FindObjectsOfType<GameObject>();
        List<T> list = new List<T>();

        foreach (var eachGameObject in objs)
        {
            if (eachGameObject.GetComponent<T>() != null)
            {
                list.Add(eachGameObject.GetComponent<T>());
            }

        }

        return list;
    }

并且在同一个(Monobehaviour class)中,我正在这样测试它:

private void Start() { List lights = FindInScene(); Debug.Log(lights.Count); }

“计数”始终为 3(等于场景中的游戏对象)。

检查是否有效:

private void Start()
{
    List<Light> lights = FindInScene<Light>();
    Debug.Log(lights.Count);
}

public List<T> FindInScene<T>()
{
    var objs = FindObjectsOfType<GameObject>();
    List<T> list = new List<T>();
    if(objs != null && objs.Length > 0)
    {
        for (int i = 0; i < objs.Length; i++)
        {
            if (objs[i].GetComponent<T>() != null)
            {
                list.Add(objs[i].GetComponent<T>());
            }
        }
    }
    return list;
}

尝试添加where(泛型约束),像这样:

   public List<T> FindInScene<T>() where T :Component
    {
        var objs = FindObjectsOfType<GameObject>();
        List<T> list = new List<T>();
        foreach (var eachGameObject in objs)
        {
            if (eachGameObject.GetComponent<T>() != null)
            {
                list.Add(eachGameObject.GetComponent<T>());
            }

        }
        return list;
    }