Diferencia entre revisiones de «Unity Detección de colisiones. Colliders»
| Línea 72: | Línea 72: | ||
* Existe un collider denominado '''Mesh Collider''' que se 'adapta' completamente a la forma del modelo, pero que lleva asociado un coste computacional elevado por lo que su uso debería estar limitado a situaciones muy concretas. | * Existe un collider denominado '''Mesh Collider''' que se 'adapta' completamente a la forma del modelo, pero que lleva asociado un coste computacional elevado por lo que su uso debería estar limitado a situaciones muy concretas. | ||
| + | |||
| + | |||
<br /> | <br /> | ||
| + | =Colliders y RigidBody= | ||
| + | |||
| + | * Como comenté antes, los dos están íntimamente relacionados. | ||
| + | |||
| + | * Cuando añadimos un Collider sin un RigidBody asociado, realmente estamos haciendo uso de un RigidBody denominado '''Static RigidBody'''. | ||
| + | : Este tipo de RigidBody está pensado para ser utilizado en escenarios en los que el GameObject '''no va a moverse ni a rotarse'''. | ||
| + | |||
| + | : Lo que hace Unity es 'juntar' todos los GameObjects con Collider sin RigidBody y va a calcular sus RigidBody/Collider en una sección de memoria separada la cual no va a tocar una vez calculado, ya que parte de que dichos GameObjects son estáticos. | ||
| + | |||
| + | |||
| + | * '''<u>NOTA IMPORTANTE:</u>''' Si asociáis un Collider sin RigidBody, el GameObject no debe moverse ni rotarse en la escena. | ||
| + | |||
| + | |||
| + | |||
| + | * Veamos un ejemplo: | ||
| + | <gallery caption="Static RigidBody" widths="350" heights="300px" perrow="2"> | ||
| + | Image:Unity3d_collider_10.jpg| Creamos la siguiente escena. Un camión con un RigidBody y Collider creado y un componente 'Constant Force' con una fuerza de 20 en el eje X (en este caso no hemos creado un EmptyGameObject para que el eje Z se corresponda con la parte delantera del camión, por eso ponemos la fuerza en el eje X). | ||
| + | Image:Unity3d_collider_11.jpg| Creamos un Cubo con un Collider asociado '''pero sin RigidBody'''. | ||
| + | Image:Unity3d_collider_12.jpg| Creamos otro Cubo en la parte de atrás con un Collider y un RigidBody asociado. | ||
| + | Image:Unity3d_collider_13.jpg| Ejecutamos el juego y vemos como el autobús choca con el muro '''pero no lo mueve'''. | ||
| + | Image:Unity3d_collider_14.jpg| Cambiamos en ejecución al valor -20 en la fuerza y ahora vemos como el muro rojo sí que se desplaza. | ||
| + | </gallery> | ||
| + | |||
| + | |||
| + | |||
| + | <br /> | ||
| + | =Propiedad Is Kinematic del RigidBody= | ||
| + | |||
| + | * Cuando [http://wiki.cifprodolfoucha.es/index.php?title=Unity_Gravedad._RigidBody#Par.C3.A1metros_del_RigidBody hablé del RigidBody en esta Wiki] ya comenté la propiedad '''Is Kinematic'''. | ||
| + | : Lo que hace dicha propiedad si se activa es hacer que el GameObject se vea afectado por la gravedad y por el motor de físicas y pasa a comportarse como un GameObject de los vistos hasta ahora, haciendo que los movimientos y rotaciones se gestionen a través de su componente Transform. | ||
| + | |||
| + | |||
| + | * '''<u>NOTA IMPORTANTE:</u>''' Siempre que queramos utilizar GameObject con Collider para detectar colisiones, pero que no nos importa ni queremos hacer uso del motor de físicas, <u>debemos de marcar la opción Is Kinematic'. Recordar que si no tenemos un RigidBody asociado, es como si lo tuviéramos creado, siendo este de tipo 'Static'. | ||
| + | |||
| + | |||
| + | * Un uso de esta propiedad es cuando queramos que un objeto se 'mueva' temporalmente pero que normalmente se encuentre en un estado de 'quieto'. | ||
| + | : Por ejemplo, cuando en un juego abrimos una puerta. | ||
| + | : Veamos un ejemplo aplicado a una animación (las animaciones [http://wiki.cifprodolfoucha.es/index.php?title=Unity_Animaciones#Creando_animaciones_propias las vimos en este punto de la Wiki]). | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
Revisión del 21:17 3 feb 2019
Sumario
Introducción
- Más información en:
- En los juegos vamos a necesitar disponer de algún mecanismo que nos diga cuando dos objetos 'chocan'.
- Ejemplo de uso:
- Proyectiles de todo tipo (balas, misiles, láser,...)
- Enemigos que van tras el protagonista
- Abrir o cerrar puertas al acercarse / alejarse
- Unity da solución a esto mediante el uso de Colliders.
- Disponemos de varios tipos de 'colliders', pero los que consumen menos CPU para realizar cálculos son los denominados Primitives Colliders:
- Esfera
- Caja
- Cápsula
- Otro aspecto a tener en cuenta es que los Collider están íntimamente relacionados con los RigidBody, ya que el RigidBody hace uso de los Collider como base para producir los 'efectos' físicos, como choques, rotaciones,...
Creando Colliders
- El Collider es un componente de un GameObject, por lo tanto sólo tenemos que escribir 'Collider' para ver todos los disponibles:
- El collider tiene un tamaño y una posición la cual puede ser modificada de forma gráfica:
- Creando un Collider y ajustando el tamaño y posición
En la ventana Inspector podemos cambiar la posición y tamaño del Collider. Al igual que en la componente Transform, si mantenemos presionado el botón izquierdo del ratón encima de cualquiera de dichas propiedades (de su etiqueta, es decir, sobre la letra X, Y,Z) y movemos a izquierda-derecha el ratón sin soltar el botón, los valores cambiarán.
Otra forma mucho más fácil de modificar su tamaño es presionando el icono indicado en la imagen. Al hacerlo aparecerán varios puntos (en el caso del cubo 6, uno por cada cara). Si ahora presionamos con el ratón cualquiera de dichos puntos y lo movemos, podemos cambiar gráficamente el tamaño del Collider.
La forma importa
- Como comenté antes, el Collider va a ser empleado tanto para determinar cuando dos GameObjects 'chocan' como para ser utilizad por el RigidBody para determinar el comportamiento físico del GameObject.
- Dependiendo de nuestras necesidades, el Collider se tendrá que ajustar de forma lo más precisa al GameObject o no.
- Por ejemplo, podría tener un Collider en forma de esfera con un tamaño más grande que el GameObject para determinar cuando un enemigo ataca al jugador. Sería su radio de acción.
- Sin embargo, a nivel de el comportamiento físico, por ejemplo, al caer, querremos que los Collider se ajusten lo más posible al GameObject.
- Veamos un ejemplo de esto segundo.
- Ajustando el tamaño del Collider
Descargamos de Unity si no lo hemos hecho antes algún prefab nuevo, por ejemplo estos coches.
- Existe un collider denominado Mesh Collider que se 'adapta' completamente a la forma del modelo, pero que lleva asociado un coste computacional elevado por lo que su uso debería estar limitado a situaciones muy concretas.
Colliders y RigidBody
- Como comenté antes, los dos están íntimamente relacionados.
- Cuando añadimos un Collider sin un RigidBody asociado, realmente estamos haciendo uso de un RigidBody denominado Static RigidBody.
- Este tipo de RigidBody está pensado para ser utilizado en escenarios en los que el GameObject no va a moverse ni a rotarse.
- Lo que hace Unity es 'juntar' todos los GameObjects con Collider sin RigidBody y va a calcular sus RigidBody/Collider en una sección de memoria separada la cual no va a tocar una vez calculado, ya que parte de que dichos GameObjects son estáticos.
- NOTA IMPORTANTE: Si asociáis un Collider sin RigidBody, el GameObject no debe moverse ni rotarse en la escena.
- Veamos un ejemplo:
- Static RigidBody
Propiedad Is Kinematic del RigidBody
- Cuando hablé del RigidBody en esta Wiki ya comenté la propiedad Is Kinematic.
- Lo que hace dicha propiedad si se activa es hacer que el GameObject se vea afectado por la gravedad y por el motor de físicas y pasa a comportarse como un GameObject de los vistos hasta ahora, haciendo que los movimientos y rotaciones se gestionen a través de su componente Transform.
- NOTA IMPORTANTE: Siempre que queramos utilizar GameObject con Collider para detectar colisiones, pero que no nos importa ni queremos hacer uso del motor de físicas, debemos de marcar la opción Is Kinematic'. Recordar que si no tenemos un RigidBody asociado, es como si lo tuviéramos creado, siendo este de tipo 'Static'.
- Un uso de esta propiedad es cuando queramos que un objeto se 'mueva' temporalmente pero que normalmente se encuentre en un estado de 'quieto'.
- Por ejemplo, cuando en un juego abrimos una puerta.
- Veamos un ejemplo aplicado a una animación (las animaciones las vimos en este punto de la Wiki).
-- Ángel D. Fernández González -- (2018).

