Как найти все игровые объекты Cube на сцене?

Я ищу способ найти все CubeGameObject в сцене. Я пытаюсь сделать это:

Cube[] ballsUp = FindObjectsOfType (typeof(Cube)) as Cube[];

Но куб, по-видимому, не является типом игрового объекта.

Я думаю, мне нужно использовать что-то, связанное с PrimitiveType, но я могу понять, что и как это использовать...

Спасибо


person Helixb    schedule 20.05.2015    source источник


Ответы (4)


Ваш куб примитивного типа. Объекты примитивного типа невозможно найти с помощью FindObjectsOfType. Есть много способов решить вышеуказанную проблему. Проще всего использовать теги. Когда вы создаете экземпляр своего кубического объекта, вы можете использовать тег «Куб».

GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
    cube.tag = "Cube";

Затем вы можете получить все объекты куба в сцене с тегами куба, используя

GameObject[] arrayofcubes = GameObject.FindGameObjectsWithTag("Cube");

Это даст весь массив кубов GameObject в сцене.

FindObjectsOfType можно использовать для поиска игровых объектов с присоединенными классовыми, а не примитивными типами.

Другой способ продолжить — найти все объекты с помощью MeshFilters и найти желаемое имя примитива в массивах фильтров сетки.

string[] meshNames = new string[5] {"Cube", "Sphere", "Capsule", "Cylinder", "Plane"};
MeshFilter[] allMeshFilters = FindObjectsOfType(typeof(MeshFilter)) as MeshFilter[];
foreach(MeshFilter thisMeshFilter in allMeshFilters)
{       
    foreach(string primName in meshNames)
    {           
        if (primName == thisMeshFilter.sharedMesh.name)
        {
            Debug.Log("Found a primitive of type: " + primName);                
        }           
    }       
}

Получение всех объектов по их примитивному типу (C#)

person killer_mech    schedule 20.05.2015

Можно попробовать использовать скрипт. Допустим, у ваших GameObjects есть скрипт MyScript, тогда вы могли бы FindObjectsofType GameObject и GetComponent Myscript.

Надеюсь это поможет. Хотя я знаю, что это не тот ответ, который вам нужен, это определенно идея, которую стоит попробовать в крайнем случае :)

person Augmented Jacob    schedule 20.05.2015
comment
Я уже сделал это, но это немного грязно, поэтому я искал другое решение :). Спасибо, в любом случае - person Helixb; 20.05.2015

Вы можете попробовать это. Если вы используете кубический примитив единства, сетка должна называться «Куб», а при запуске — «Экземпляр куба».

       var gameOjects =  GameObject.FindObjectsOfType<GameObject>();
        foreach (var gameOject in gameOjects)
        {
            var meshFilter = gameOject.GetComponent<MeshFilter>();
            if (meshFilter != null && meshFilter.mesh.name == "Cube Instance")
                Debug.Log(gameOject.name); 
        }

жесткий это не очень элегантно или надежно.

Более подходящим способом было бы пометить все кубики и получить их по «FindGameObjectsWithTag».

person Marius Junak    schedule 20.05.2015
comment
Спасибо, к сожалению, мои кубики уже помечены другим тегом, но я думаю, что это лучший способ сделать это: с. - person Helixb; 20.05.2015

Тогда рекомендуемый способ от Unity сделать это — создать тег, а затем использовать GameObject.FindGameObjectsWithTag, чтобы найти их все. GameObject.FindGameObjectsWithTag возвращает массив объектов в этом теге.

Например, создайте тег с именем «cubeTags», затем перейдите к каждому кубу и измените тег на cubeTags. Если вы хотите найти все кубики, вы можете просто сделать:

GameObject[] cubes = GameObject.FindGameObjectsWithTag ("cubeTags");
Cube[] ballsUp = new Cube[cubes.Length];
for(int i=0; i<cubes.Length; i++){
ballsUp = cubes[i].GetComponent<Cube>();
}
person Programmer    schedule 20.05.2015
comment
Упс. кто-то сказал о теге, пока я писал свой. В любом случае, сценарий здесь для тех, кому он может понадобиться в будущем. - person Programmer; 20.05.2015