如何返回特定类型

时间:2018-12-19 22:37:00

标签: c# unity3d

我正在构建一种方法,该方法可在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());
}

1 个答案:

答案 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推断为Circlevar不像可以接受任何类型值的基本Variant类型。它只是使您无法像在Circle component = new Circle();

中那样写两次类型名称。