我正在构建一种方法,该方法可在GameObjects数组中返回“ Type”。每个GameObject都附有一个组件,所以我正在尝试,但没有结果。
private Type GetComponentOfType(string name)
{
var component; // Error here
for (int i = 0; i < sceneObjectsLength; i++)
{
component = sceneObjects[i].GetComponent(Type.GetType(name));
}
return component;
}
显示想法的示例:
private Start()
{
Circle circle:
circle = GetComponentOfType("Circle");
Debug.Log(circle.Radius());
Square square;
square = GetComponentOfType("Square");
Debug.Log(square.Sides());
}
答案 0 :(得分:5)
Type
对象包含有关类型的信息。它不是类型本身。您想使用泛型
private T GetComponent<T>()
where T : Component
{
T component;
for (int i = 0; i < sceneObjectsLength; i++)
{
component = (T)sceneObjects[i].GetComponent(typeof(T));
}
return component;
}
您可以通过以下方式调用它:
Circle circle = GetComponent<Circle>();
但是,您遇到了地方问题。 return
仅返回单个组件,但是您尝试在循环中获取多个组件。如果您打算返回此类型的第一个组件,则应编写
private T GetComponent<T>()
where T : Component
{
return sceneObjects
.Select(obj => obj.GetComponent(typeof(T)))
.Where(obj => obj != null)
.FirstOrDefault();
}
您可以使用以下方法从所有游戏对象中获取所有类型的对象:
private IEnumerable<T> GetComponents<T>()
where T : Component
{
return sceneObjects
.SelectMany(obj => obj.GetComponents<T>());
}
您在var component;
中遇到错误,因为var
仅在编译器可以像var component = new Circle();
那样推断类型时才能使用。这里var
推断为Circle
。 var
不像可以接受任何类型值的基本Variant
类型。它只是使您无法像在Circle component = new Circle();