Unity3D: разница в результатах между GetComponent (строка) и GetComponent (тип)? - PullRequest
0 голосов
/ 17 января 2019

У меня есть скрипт со следующим кодом, который вызывается в Start()

GameObject newTerrain = Instantiate(terrainPrefab);
if (newTerrain.GetComponent<Terrain>()) // Returns true
    Debug.Log("I am type");
if (newTerrain.GetComponent("Terrain")) // Returns false
    Debug.Log("I am string");

Хотя Debug.Log показывает мне вывод I am type, он не показывает второй. Мне нужно использовать GetComponent(string) позже в моем коде, но он не работает.

Что является причиной этой разницы и есть ли решение / обходной путь для этого?

Edit:

Так что после прочтения некоторых комментариев и предложений я попробовал как newTerrain.GetComponent("Terrain") != null, так и newTerrain.GetComponent("Terrain") as Terrain в операторе if, но оба все еще возвращают false.

Единственная причина, по которой я пытаюсь использовать GetComponent (string), заключается в том, что я пытаюсь изучить пул объектов, а учебник предоставляет следующий код:

public GameObject GetPooledObject(string type)
{
    for (int i = 0; i < pooledObjects.Count; i++)
    {
        Debug.Log(pooledObjects[i].GetComponent(type));
        if (!pooledObjects[i].activeInHierarchy && pooledObjects[i].GetComponent(type))
        {
            return pooledObjects[i];
        }
    }

    foreach (ObjectPoolItem item in itemsToPool)
    {
        if (item.objectToPool.GetComponent(type))
        {
            if (item.shouldExpand)
            {
                // Create 5 for shits and giggles
                for (int i = 0; i < 5; i++)
                {
                    GameObject obj = Instantiate(item.objectToPool);
                    obj.SetActive(false);
                    pooledObjects.Add(obj);
                }

                return pooledObjects[pooledObjects.Count - 1];
            }
        }
    }

    return null;
}

Я изменил некоторые вещи, но основная часть их осталась прежней. Функция Debug.Log in this также возвращает null, даже когда я вижу буквально в инспекторе, к которому подключен компонент Terrain

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Фактический ответ на заголовок «Какая разница» будет:

newTerrain.GetComponent("Terrain")

возвращает ссылку Component, а

newTerrain.GetComponent<Terrain>()

возвращает ссылку Terrain.

Так что для фактического использования ссылки вам нужно будет ввести первый тип, например

(Terrain) newTerrain.GetComponent("Terrain")

Однако оба имеют оператор bool (поскольку Terrain наследует от Behaviour, который наследует от Component, который наследует от Object), поэтому для простой проверки существования оба должны точно вести себя одинаково .. за исключением того, что string версия медленнее.

Так что остается странным, что перегрузка, принимающая string, не работает должным образом.


В качестве альтернативы вы также можете использовать либо перегрузку с Type в качестве параметра, например

public GameObject GetPooledObject(Type type)
{
    ... GetComponent(type)
}

и используйте

GameObject newTerrain = ObjectPool.Instance.GetPooledObject(typeof(Terrain));

или снова сделайте общий метод объединения объектов, как

public GameObject GetPooledObject<T>() where T : Component 
{
    ... GetCompoment<T>()
}

и используйте

GameObject newTerrain = ObjectPool.Instance.GetPooledObject<Terrain>();
0 голосов
/ 17 января 2019

Я не вижу GameObject.GetComponent (строковый компонент) в документации. Думаю, это устарело. Я предлагаю вам использовать отражение вместо этого.

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