26. CLASE COLLIDER (II)









FUNCIONES:

ClosestPointOfBounds:

function ClosestPointOnBounds (position : Vector3) : Vector3


Devuelve el punto más cercano de nuestro Collider con respecto a un punto dado. Esto puede ser usado para calcular puntos de choque cuando se aplique daño derivado de una explosión.


Raycast:

function Raycast (ray : Ray, hitInfo : RaycastHit, distance : float) : boolean


Proyecta un rayo que devuelve true si tropieza con algún collider en la dirección y distancia indicadas.

Consta de varios parámetros. El primero es de tipo Ray, y nos vamos a detener un momento en él.

La estructura Ray nos permite crear una línea con un origen y una dirección. Consta de dos variables -de nombre origin y direction- que no son sino sendos Vector3 para representar el inicio y la dirección de dicha linea. Para verlo gráficamente, tecleamos el siguiente script:


function Update(){
var rayo : Ray;
rayo.origin = transform.position;
rayo.direction = transform.right;
Debug.DrawLine(rayo.origin, rayo.direction);
}


Al darle al play, observamos en la ventana de escena el rayo saliendo del cubo. Si queremos ver el mismo efecto en la ventana del juego, hemos de activar el botón gizmo que aparece encima de ésta, a su derecha:




El segundo parámetro de la función Raycast -HitInfo- contendrá información sobre aquello con lo que golpeó el collider para el caso de que la función devuelva true, esto es, tropiece con algo.

El tercer parámetro -distance- es obviamente la longitud del rayo.


OnTriggerEnter:

function OnTriggerEnter (other : Collider) : void


Esta función y las que restan forman parte de la categoría de "mensajes enviados".

Al estudiar la variable isTrigger decíamos que si nuestro collider habilitaba dicha variable, se convertía en un trigger (disparador) y dejaba de colisionar con otros rigidbodies, y que en lugar de responder a las físicas, al entrar en contacto (o dejar de tenerlo) con ellos lanzaba una serie de mensajes.

OnTriggerEnter, así, es llamada cuando nuestro trigger entra en contacto con otros colliders, de tal manera que podemos escribir dentro de dicha función el código que defina lo que queramos que ocurra cuando se produce dicho contacto.

Para explicarlo gráficamente, vamos a intentar hacer un script progresivo. Empecemos por eliminar el script que tenemos vinculado al cubo. Después, abrimos MiPrimerScript en Proyecto. Tecleamos lo siguiente:


function FixedUpdate(){
rigidbody.AddForce(4,0,0);
}


Salvamos y arrastramos el script a la esfera. Tal como es de esperar, ésta recibe una fuerza hacia la derecha que le lleva a chocar con el cubo.

¿Qué sucede si nuestra esfera es convertida en trigger?. Probémoslo:


collider.isTrigger =true;
function FixedUpdate(){
rigidbody.AddForce(4,0,0);
}


Le damos al play y observamos que la esfera ha perdido toda solidez, de tal suerte que atraviesa el suelo y cae. Tenemos que evitar para nuestros fines que la esfera se mueva en el eje Y, evitando que caiga. Una variable que ya hemos estudiado viene en nuestra ayuda:


collider.isTrigger =true;
rigidbody.constraints = RigidbodyConstraints.FreezePositionY;
function FixedUpdate(){
rigidbody.AddForce(4,0,0);
}


Ahora hemos preparado el terreno para lo que quería demostrar. De momento observamos que la esfera, en efecto, ya no cae (no puede operar en el eje Y), pero atraviesa -tal como era de esperar- el cubo. Vamos ahora a diseñarle un comportamiento específico a la esfera para cuando entre en contacto con el cubo.


collider.isTrigger =true;
rigidbody.constraints = RigidbodyConstraints.FreezePositionY;

function FixedUpdate(){
rigidbody.AddForce(4,0,0);
}

function OnTriggerEnter(loPrimeroQuePille) {
loPrimeroQuePille.gameObject.renderer.material.color = Color.red;
}


Démosle al play y luego la explicamos.

Efectivamente, en el momento en que nuestro trigger/esfera topa con otro collider, lo valores del mismo son asignados al parámetro de la función OnTriggerEnter y podemos acceder a ellos para, como es el caso, por ejemplo cambiarle el color al cubo. Puede parecer un poco tortuoso todo el camino que nos lleva del collider loPrimeroQuePille hasta el color, pero con un poco de práctica y/o una guia rápida a mano, y conociendo el principio y el final del path, el resto es bastante sencillo.

Fijémonos por otro lado en que este tipo de funciones no pertenecen propiamente a la clase, no usan un operador punto para vincularse a un objeto de una clase, sino que se usan de manera independiente, aunque para su activación requieren que efectivamente un collider con el trigger habilitado entre en contacto con algo. Es decir, su inclusión en la clase collider es más por "afinidad" que porque realmente formen parte de aquella.


OnTriggerExit:

function OnTriggerExit (other : Collider) : void


Es llamada cuando el collider "other" deja de tocar con nuestro trigger.


OnTriggerStay:

function OnTriggerStay (other : Collider) : void

Es llamada casi todos los frames que el collider other esté tocando nuestro trigger.


OnCollisionEnter:

function OnCollisionEnter (collisionInfo : Collision) : void


Es llamada cuando nuestro collider/rigidbody empiece a tocar otro rigidbody/collider.


OnCollisionExit:

function OnCollisionExit (collisionInfo : Collision) : void

Es llamada cuando nuestro collider/rigidbody deja de tocar otro rigidbody/collider.


OnCollisionStay:

function OnCollisionStay (collisionInfo : Collision) : void

Es llamada una vez por frame por cada collider/rigidbody que esté tocando nuestro rigidbody/collider.

POSTED BY UnityScripts
POSTED IN
DISCUSSION 5 Comments

5 Responses to : 26. CLASE COLLIDER (II)

  1. Anónimo says:

    Gracias por toda la información.

    un saludo

  2. Anónimo says:

    al tratar de usar el priemr ejemplo me sale este error me podrias ayudar
    NullReferenceException: Object reference not set to an instance of an object
    Boo.Lang.Runtime.RuntimeServices.GetDispatcher (System.Object target, System.String cacheKeyName, System.Type[] cacheKeyTypes, Boo.Lang.Runtime.DynamicDispatching.DispatcherFactory factory)
    Boo.Lang.Runtime.RuntimeServices.GetDispatcher (System.Object target, System.Object[] args, System.String cacheKeyName, Boo.Lang.Runtime.DynamicDispatching.DispatcherFactory factory)
    Boo.Lang.Runtime.RuntimeServices.SetProperty (System.Object target, System.String name, System.Object value)
    Ray.Update () (at Assets/Ray.js:3)

  3. Anónimo says:

    ya pude solucionar el problema

    el error estava en que habia llamado al script Ray al cambiar el nombre todo quedo funcionando me di cuenta dos segundos despues de haber publicado XD

  4. Unknown says:
    Este comentario ha sido eliminado por el autor.
  5. Unknown says:

    function OnTriggerEnter(loPrimeroQuePille)
    Esta funciona no va bien despues de buscar un rato llegue a la conclusion esta
    function OnTriggerEnter(loPrimeroQuePille : Collider)
    Asi si funciona.
    Muy bueno el curso, muchas gracias.

Leave a Reply

Con la tecnología de Blogger.