104. CLASE COLLISION




Clase que obtiene diferente información de una colisión.

La información de la collision es pasada a los eventos Collider.OnCollisionEnter, Collider.OnCollisionStay y Collider.OnCollisionExit.


VARIABLES:

relativeVelocity:


Variable de sólo lectura que devuelve la velocidad lineal relativa de los dos objetos que colisionan.

Para realizar un ejemplo, recoloquemos antes la esfera en (2,0,0). Luego escribamos nuestro script:


function OnCollisionEnter(colision : Collision) {
var velCol: Vector3 = colision.relativeVelocity;
Debug.Log(velCol.magnitude);
}

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


Expliquemos el script de abajo arriba. En la función FixedUpdate lo único que hacemos es aplicar una fuerza de cuatro unidades hacia la izquierda a la esfera, forzándola a colisionar con el cubo. En el momento en que la esfera topa con el cubo, los datos de la colisión son almacenados en el parámetro colision. Uno de dichos datos es, como estamos estudiando, la velocidad relativa a la que aquélla se produce, velocidad que almacenamos en la variable velCol, de tipo Vector3. Ya sólo nos queda imprimir la fuerza o longitud de dicho vector, que como recordaremos se hace a través de la variable magnitude.

Pulsamos play y observamos que la magnitud de la colisión es de algo menos de 4 (fruto de descontar el rozamiento y la resistencia respecto de la fuerza aplicada)


rigidbody:

var rigidbody : Rigidbody


Variable de sólo lectura que hace referencia al rigidbody que golpeamos. Es nulo si el objeto que golpeamos es un collider sin rigidbody vinculado.

Es fácil de ilustrar con un ejemplo:


function OnCollisionEnter(colision : Collision) {
if(colision.rigidbody){
Debug.Log("He topado con el rigidbody del objeto " + colision.rigidbody.name);
}
}

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


No hay mucho que explicar. Si el collider con el que topa nuestra esfera tiene un rigidbody, se nos imprime un texto que además incluye el nombre del objeto al que dicho rigidbody pertenece.


collider:

var collider : Collider


El collider que golpeamos (sólo lectura).

Para determinar la parte concreta que golpeamos de cada collider deberemos iterar a través de los puntos de contacto con la propiedad contacts.


transform:

var transform : Transform


El transform del objeto que golpeamos (read only). Si chocamos contra un collider con un rigidbody, el transform será el vinculado al rigidbody. Si colisionamos contra un collider sin rigidbody, el transform será el vinculado al collider.


gameObject:

var gameObject : GameObject


Variable de sólo lectura que devuelve el objeto con el que chocamos.


contacts:

var contacts : ContactPoint[]


El punto de contacto generado por el engine de físicas.

Cada contacto implica un punto de contacto, un normal y dos colliders que colisionan (ver ContactPoint). A través de OnCollisionStay o OnCollisionEnter puedes siempre estar seguro de que el contacto tiene al menos un elemento.

ContactPoint es una estructura que tiene estas variables:


1) point: el punto de contacto. Por ejemplo:


function OnCollisionEnter(colision : Collision) {
if(colision.relativeVelocity.magnitude > 2){
print("Puntos de colision: " + colision.contacts.Length);
print("Primer punto de colision: " + colision.contacts[0].point);
}
}

function FixedUpdate(){
rigidbody.AddForce(Vector3(-8,0,0));
}


Una breve explicación del script: Como en el anterior aplicamos una fuerza a la esfera que la obliga a colisionar con el cubo. Si dicha colisión tiene una fuerza superior a 2 unidades se imprimen dos mensajes: uno que indica el número de colisiones que se ha producido y otro el punto exacto de la primera colisión. Si no hubiéramos establecido una fuerza mínima del contacto para que aparecieran los mensajes, el propio contacto de la esfera con el suelo habría disparado dichos mensajes. Pulsamos play y veremos uno de los mensajes, y si hacemos click sobre dicho mensaje para que nos aparezca el popup de la consola, encontraremos el segundo, tal como muestro en esta captura:




2) normal: El normal del punto de contacto.

3) thisCollider: El primer collider en contacto, o sea, el vinculado al script.


function OnCollisionEnter(colision : Collision) {
if (colision.relativeVelocity.magnitude > 2){
print("This collider is named: " + colision.contacts[0].thisCollider.name);
}
}

function FixedUpdate(){
rigidbody.AddForce(Vector3(-8,0,0));
}


En este sencillo script observamos que thisCollider se corresponde a la esfera.

4) otherCollider: El otro collider en contacto. Para comprobar que hace referencia al cubo, meramente sustituir en el script anterior thisCollider por otherCollider.

POSTED BY UnityScripts
POSTED IN
DISCUSSION 0 Comments

Leave a Reply

Con la tecnología de Blogger.