如何返回特定类型

Lob*_*ite 0 c# unity-game-engine

我正在构建一个方法,在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;
}
Run Code Online (Sandbox Code Playgroud)

举例说明了这个想法:

private Start()
{
    Circle circle:
    circle = GetComponentOfType("Circle");
    Debug.Log(circle.Radius());

    Square square;
    square = GetComponentOfType("Square");
    Debug.Log(square.Sides());
}
Run Code Online (Sandbox Code Playgroud)

Oli*_*bes 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;
}
Run Code Online (Sandbox Code Playgroud)

你可以用以下方式调用它:

Circle circle = GetComponent<Circle>();
Run Code Online (Sandbox Code Playgroud)

但是,您有一个局部问题.return只返回一个组件,但是你试图在循环中获得几个组件.如果你打算返回这种类型的第一个组件,那么你应该写

private T GetComponent<T>()
    where T : Component
{
    return sceneObjects
        .Select(obj => obj.GetComponent(typeof(T)))
        .Where(obj => obj != null)
        .FirstOrDefault();
}
Run Code Online (Sandbox Code Playgroud)

您可以从所有游戏对象中获取所有类型的对象

private IEnumerable<T> GetComponents<T>()
    where T : Component
{
    return sceneObjects
        .SelectMany(obj => obj.GetComponents<T>());
}
Run Code Online (Sandbox Code Playgroud)

您收到错误,var component;因为var只有在编译器可以推断类型时才能使用var component = new Circle();.这里var推断是Circle.var不像Variant可以接受任何类型值的Basic 类型.它只是阻止你两次写入类型名称Circle component = new Circle();