gameObject.GetComponent<T> != null 始终为真。如何?
gameObject.GetComponent<T> != null is always true. How?
我有一个包含 3 个游戏对象的列表。只有一个游戏对象附加了 Light 组件。
我正在像这样遍历所有游戏对象的列表
foreach (var eachGameObject in objs) //eachGamObject represents one of the three game objects in a list.
在 foreach 中,我正在检查每个游戏对象是否附加了 T 类型的组件,就像这样
if(eachGameObject.GetComponent<T>() != null)
- “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;
}
我有一个包含 3 个游戏对象的列表。只有一个游戏对象附加了 Light 组件。
我正在像这样遍历所有游戏对象的列表
foreach (var eachGameObject in objs) //eachGamObject represents one of the three game objects in a list.
在 foreach 中,我正在检查每个游戏对象是否附加了 T 类型的组件,就像这样
if(eachGameObject.GetComponent<T>() != null)
- “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;
}