5. CLASE OBJECT (y III)






Continuamos con las funciones de clase de la clase Object. Recordemos que las funciones de clase, como su nombre indica, no van vinculadas a objetos o instancias de una clase, sino a la clase en sí, esto es, no se utiliza el operador punto entre el nombre del objeto/instancia y el de la función, como sucedería en una función normal (o método) dentro de una clase.


FindObjectOfType

static function FindObjectOfType (type : Type) : Object


Esta función devuelve el primer objeto activo que Unity encuentre que sea del tipo que le pasamos como parámetro.

Veámoslo en un ejemplo. Recuperamos una vez más nuestro script, borramos todo y tipeamos lo siguiente:

var dameAlgo : Object;

dameAlgo = FindObjectOfType(Camera);
Debug.Log("Deberia haber encontrado 1 " + dameAlgo);

Salvamos, le damos al play y observamos que Unity ha encontrado nuestra cámara principal.

Nos advierte el manual de referencia que esta función puede ser un poco lenta y costosa en términos de rendimiento, por lo que se recomienda no usarla a su vez como parte de una función que se actualice cada frame (como por ejemplo la función Update, que estudiaremos a no mucho tardar)


FindObjectsOfType

static function FindObjectsOfType (type : Type) : Object[]


No hace falta ser muy perspicaz para darse cuenta de que esta función es idéntica a la anterior, con la diferencia de que aquí lo que se devuelve no es el primer objeto activo de tipo Type, sino que se devuelven en un array todos los objetos activos cuyo tipo coincide con el que solicitamos.

Veamos la diferencia rehaciendo nuestro script:

var dameAlgo : Object[];
var chivato : String;

dameAlgo = FindObjectsOfType(GameObject);
chivato = "He encontrado " + dameAlgo.Length + " objetos: ";

for(var contador = 0; contador < dameAlgo.Length; contador++)
chivato += dameAlgo[contador].name + "  ";

Debug.Log(chivato);
Lo que hemos hecho aquí es lo siguiente: primero hemos reconvertido nuestra variable dameAlgo en un array de Objects. Declaramos después una variable de tipo string para que vaya recopilando toda la información que al final imprimiremos. Inicializamos luego nuestro array con todos los objetos de tipo GameObject que Unity encuentre en nuestra escena. A partir de ahí,montamos un bucle for para ir añadiendo a nuestro string "chivato" el nombre de todos los objetos encontrados. Finalmente, imprimimos. Si todo ha salido bien, el resultado tendría que ser este al darle al play: DontDestroyOnLoad static function DontDestroyOnLoad (target : Object) : void
Con esta función conseguimos que el objeto que colocamos como parámetro no se destruya cuando se cargue una nueva escena. Por defecto, cuando el jugador cambia de escena o nivel, todos los objetos de la escena que abandona se destruyen antes de crear los que corresponden al nuevo nivel. Con esta función, conseguimos que los objetos que queramos pervivan al cambio de escena.

Dado que aún no sabemos cargar escenas nuevas, no vamos a realizar ningún ejemplo. Ya lo haremos cuando expliquemos las oporunas funciones.


Y con esto acabamos el análisis de nuestra primera clase. Espero que os hayan quedado los conceptos más o menos claros (al principio cuesta un poquillo, así que no desesperéis). Y por supuesto, si hay alguna duda, queja (educada) o corrección que hacer, sentiros libres de comentar.

Hasta pronto.

POSTED BY UnityScripts
POSTED IN
DISCUSSION 6 Comments

6 Responses to : 5. CLASE OBJECT (y III)

  1. Canochaba says:

    Hola, estoy probando la función FindObjectsOfType tal y como nos muestras y me falla porque name no es un miembro del objeto 'dameAlgo', en su lugar he eliminado directamente la variable name pasando directamente el valor del array y parece que así si funciona correcto.

    Muchas gracias por el aporte que estás haciendo con tu blog, me está resultando interesantísimo y muy fácil de entender. Un abrazo!

  2. Jordi says:

    Bueno, ya llevo 5 entradas y de momento está genial. Gracias por compartir tu esfuerzo!!

  3. Anónimo says:

    Muchas gracias, estoy leyendo esta guia y no he encontrado nada tan bien explicado por ningun otro lado, me viene genial, espero que se mantenga. Muchas gracias!

  4. Saludos, en C# se escribiría de la siguiente manera:

    using UnityEngine;
    using System.Collections;

    public class BuscarObjetos : MonoBehaviour {

    Object[] objetos;
    string mensaje;

    void Start ()
    {
    objetos = FindObjectsOfType(typeof(GameObject)) as Object[];
    mensaje = "He encontrado " + objetos.Length + " objetos: ";
    for (int i=0; i < objetos.Length; i++)
    mensaje += objetos[i].name + " ";

    Debug.Log (mensaje);
    }

    void Update () {}
    }

  5. Anónimo says:

    que buenos tutoriales muchas gracias

  6. Anónimo says:

    oye disculpa una pregunta que tal ves no vaya aun con lo que se trato en este tema pero como podrias identificar dos boxcollider que puse como componente en un solo gameobject que sirven como triggers en un personage le puse 2 uno a la derecha y otro a la izquierda y quiero que cuando entre un enemigo el personaje gire a la derecha o izquierda dependiendo por donde le llegue el enemigo el detalle esta en que no encuentro la forma para ponerle un nombre a cada collider que le puse al personaje y por lo tanto no hace lo deseado solo lo toma como si fuera uno sin importar si es izquierda o derecha hace lo mismo se va a un solo lado no al otro entiendo bien las funciones del collider como la de trigger pero no se como podria nombrar cada collider que le agregre espero puedas ayudarme

Leave a Reply

Con la tecnología de Blogger.