Как вернуть определенный тип - PullRequest
0 голосов
/ 20 декабря 2018

Я создаю метод, который возвращает «Type» среди массива GameObjects.К каждому 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 голосов
/ 20 декабря 2018

A 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();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...