Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

(SOLUCIONADO)¿Existe Funcion para recuperar GameObjects desactivados en escena?

Iniciado por ftejada, Julio 29, 2018, 04:56:02 PM

Tema anterior - Siguiente tema
Hola a todos!!! una pregunta rapida... ¿Existe alguna funcion de Unity para poder recuperar GameObjects que estén desactivados en la jerarquia de la escena? Necesito hacer esto en modo editor. He buscado en la Api pero no he podido encontrar nada...
 
Lo que quiero conseguir es en el modo editor, buscar entre todos los gameobjects de la escena (activados y desactivados), para ver si tienen cierto script y en funcion de que lo tengan o no, hacer algunas tareas...
 
Seria con un bucle for, rellenando una lista con todos los gameObjects de la jerarquia...
 
El problema es que los que están desactivados no suele detectarlos y no se como encontrarlos para mani***rlos...
 
 
 
Saludos y gracias por adelantado.

hola
 
tendrias que tener prebiamente en un array todos los gameObject que quiera comprobar.... 
 
si un gameObject esta desactivado no lo encontraras con un "Find"... pero si esta en un array da igual que este desactivado o no, siempre podras tener acceso a el desde el array

Hola, hacelo "mejor", es decir, para los objetos seleccionados, es que no vas a estar atado a todos los objetos, nada más alcanza con un Ctrl+A (seleccionar todo) y ejecutas tu script.
 
Si buscas Editor window ( https://docs.unity3d.com/ScriptReference/EditorWindow.html ) y Selection, ( https://docs.unity3d.com/ScriptReference/Selection-gameObjects.html ) ya tenés como hacerlo, el resto es verificar lo que tengas que verificar igual que en runtime.
 
Ahí puse un editor window pero podés hacerlo sin ventana, solo con un script, incluso derivar de Editor:
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unit***itor;
public class TuTool : Editor {
[MenuItem("Window/Imprimir Seleccionados")]
    static void PrintGOs()
    {
        Debug.Log("Objetos seleccionados : ");
   foreach(GameObject go in Selection.gameObjects)
      Debug.Log(go.name);
    }
}

 
Un poco a modo de "estructura", dentro de este método hacés lo que quieras.
 
PD: detecta inactivos :)

Gracias a ambos por la ayuda. He probado lo que dice @lightbug y funciona de maravilla. Es exactamente lo que necesitaba.
 
Aunque aun tengo un pequeño inconveniente, en la escena hay una cantidad inmensa de gameobjects y que están metidos(como hijos) de otros gameobjects y resulta tremendamente tedioso el hecho de tener que señalar a todos esos hijos si los padres no los dejan ver en la jerarquia, por no decir del tiempo que se pierde si lo tienes que hacer en muchas escenas tambien.
 
Ctrl +A no soluciona esto. ¿Hay alguna manera de que se señale todo los gameobjects de la jerarquia aunque no sean visibles por estar dentro de sus padres? Se me ocurre una forma mediante script pero es muy ineficiente pq cada objeto puede tener hijos y estos hijos a su vez otros hijos, y estos nuevos hijos tener otros hijos.... y asi sucesivamente en un bucle infinito. Por lo que nunca haría un codigo perfecto en el sentido de poder abarcar y señalar a todos los gameobjects que haya en la jerarquia.
 
Existe alguna manera más sencilla de poder señalar todos los GO de la jerarquia (mediante script o inpector)???.
 
Saludos y gracias de nuevo.

Cita de: ftejada date=1532929279Ctrl +A no soluciona esto. ¿Hay alguna manera de que se señale todo los gameobjects de la jerarquia aunque no sean visibles por estar dentro de sus padres?
   


Bueno si te interesan todos los hijos no es necesario señalarlos en la escena, acordate que al final del asunto la idea es tenerlos "seleccionados en C#", no se si se entiende, es decir recorrerlos en código como bien decías, lo que podés hacer es una busqueda recursiva gameObject a gameObject e ir seleccionando toda la jerarquía. Para esto estoy seguro que existe un montón de ejemplos, incluso yo postee algo hace un tiempo en una respuesta ... mmm creo que era este:

 
Entonces si lo acomodas un poco:
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unit***itor;
public class TuTool : Editor {
 
[MenuItem("Window/Viejo")]
    static void ViejoMetodo()
    {
   Debug.Log("Usando el método Viejo : " + Selection.gameObjects.Length + " objetos");
    }
[MenuItem("Window/Nuevo")]
    static void NuevoMetodo()
    {
   
        int count = 0;
   //La primera "tirada" la tenés que crear vos, como acá abajo, para cada hijo (Top-Level)
        foreach(Transform child in Selection.transforms){      
      Action(child,ref count);   //Aca en cada hijo se recorren nietos, luego bisnietos, y así      
   }
   
   Debug.Log("Usando el método Nuevo : " + count + " objetos");
    }
    //Action es recursiva, se refiere a sí misma
    static void Action(Transform target , ref int targetVar)
    {
        //Hacer lo que se tenga que hacer con el padre, en este caso simplemente sumar count
        targetVar++;
       
        //Hacer este método con los hijos
        foreach(Transform child in target)
            Action(child , ref targetVar);
    }
}
 
 

 
y probando:
 

 
De acá vas adaptando tu herramienta, con distintas versiones o incluso una UI (Editor Window) que te permita seleccionar la jerarquía o solamente los tops. Igual estoy seguro que debe de haber alguna herramienta de Untiy q te permita hacerlo sin recursividad (?), la verdad no lo se.
 
 
 
Saludos
 
PD: acá pasé de usar GameObjects a transforms simplemente por facilidad a la hora de manejar hijos, pero pasar de uno a otro no es más que acceder a .gameObject o .transform como siempre.
 
 

Lo he estado probando y funciona muy bien, no se como se comportará en escenas muy pesadas donde las cosas a hacer sean más complejas, pero al hacerse todo en el editor supongo que ira todo perfecto. Lo probaré en estos dias en diferentes escenas.
 
 
 
Muchas gracias. Saludos

Etiquetas: