Está en la página 1de 65

Taller de Física 3D en Unity

Clase 1

fernando@invadelab.cl
Planificación

Clase 1 Clase 2 Clase 3 Clase 4

1. Colisionadores 1. Collisions 1. Rigidbody 1. Joints

2. Character Controller 2. Triggers 2. Materiales físicos 2. Raycast

3. Interacción de 3. Fuerzas 3. Overlap


colisionadores
Proyecto

• Al finalizar las 4 semanas deberán haber


creado un videojuego en donde se observen
todos los contenidos vistos en clase.

• El proyecto debe ser un shooter o un juego


de aventura en primera o en tercera persona.

• Para su desarrollo son libres de usar todos


los assets necesarios del Asset Store de
Unity.
1. Colisionadores

• El componente que define la forma o superficie de un


objeto para propósitos de colisiones físicas es el
Collider; el cual, al ser un elemento físico y no gráfico
significa que no es visible en el juego, y por lo tanto
puede no tener la misma apariencia que la malla del
objeto, pero debe aproximarse a ser lo más similar
posible, dependiendo de los propósitos del elemento
en el juego.
Box Collider

• El BoxCollider es utilizado por objetos


rectangulares 3D, tales como cajas, puertas,
edificios, entre otros.
Sphere Collider

• El SphereCollider es utilizado por objetos


esféricos, tales como bolas de billar, pelotas
de fútbol, bolitas, planetas u objetos que se
quiera hacer rodar por una superficie.
Capsule Collider

• El Capsule Collider es utilizado


generalmente como colisionador principal
de un personaje, para las extremidades de
personajes (brazos y piernas) y también
para ser unido con otros colisionadores.
Colliders compuestos

• Para representar físicamente mejor la


apariencia gráfica de un objeto 3D, se
puede utilizar más de un colisionador
primitivo a la vez, esto es lo que se
denomina como Compound Colliders o
colisionadores compuestos, los cuales
actúan colectivamente como un solo
colisionador.
Colliders compuestos
Mesh Collider

• En caso de que se necesite mayor precisión


para la colisión, Unity nos ofrece el
colisionador MeshCollider, el cual se
construye a partir de un Mesh (una malla
3D), idealmente de la misma malla 3D del
objeto que contiene el colisionador.
Mesh Collider

• Al convertir un Mesh Collider como


convexo, se va a generar un figura sin
huecos u hoyos.

• Un Mesh Collider marcado como convexo


podrá colisionar con otro Mesh Collider, a
diferencia de un Mesh Collider no convexo.
Mesh Collider
Wheel Collider
Terrain Collider

• El Terrain Collider implementa una


superficie física con la misma forma del
objeto Terrain al cual está atachado.
Terrain Collider
Asset: Concave Collider

• Crea colisionadores con geometrías


cóncavas, permitiendo que puedan
colisionar con otros colisionadores con
geometrías cóncavas, el cual como se
mencionó es una limitación del Mesh
Collider.

https://www.assetstore.unity3d.com/en/#!/content/4596
Asset: Compound Collider
Generator

• Facilita la creación de mallas colisionadoras


para formas complejas y cóncavas.

• Utiliza colisionadores compuestos y crea


automáticamente objetos secundarios con
componentes Collider en el GameObject
seleccionado.

https://www.assetstore.unity3d.com/en/#!/content/62611
Actividad 1

• Utilizando el “Standard Asset” la sección de


“Prototyping”.

• Crear una escena que contenga: un piso,


escaleras unidas con superficies (segundo
piso), cubos y esferas.

• Agregar a la escena un personaje en tercera


persona, que pueda moverse por el
escenario creado.

https://assetstore.unity.com/packages/essentials/asset-
packs/standard-assets-32351
2. Character Controller

• Character Controller no hace uso de la física del


Rigidbody, esto debido a que en la mayoría de los
videojuegos en primera persona estilo Doom o Quake,
un personaje no es físicamente real, por ejemplo:
corre a velocidades muy altas, al chocar contra una
pared su cuerpo no se desestabiliza, al colisionar con
otros objetos o personajes siempre permanece de pie,
al caer de alturas muy altas también permanece de
pie.
Slope Limit

• Este valor se refiere al ángulo máximo (en


grados) de las pendientes que el personaje
puede subir.

• Se debe tener en cuenta que si se está


caminando por un plano inclinado, la fuerza
de la gravedad actuará sobre el personaje, y
dependiendo de la inclinación podría
empujarlo hacia abajo.
Step Offset

• Corresponde al valor en metros de la altura


máxima de los escalones de una escalera
que puede subir el personaje.

• Unity nos aconseja que para un Character


de una altura de 2 metros, este valor
debería estar entre 0.1 y 0.4.
Step Offset

• Si se está usando un personaje humanoide


para subir escaleras, hay que tener
precaución en cómo dar los pasos, ya que
visualmente podría verse que el personaje
está flotando sobre los escalones.

• La solución de esto es manejar el IK de los


pies en las animaciones, pero éste ya es un
tema de animaciones y no de física.
Skin width

• Esto es el ancho de la piel del personaje, y


corresponde a un borde adicional al
colisionador o bien un borde entre el
controlador y los objetos que colisiona.

• Unity recomienda que este valor sea mayor


que 0,01 y mayor que el 10% del tamaño
del radio, y que en caso de que el personaje
se quede atrapado al colisionar con objetos,
es mejor aumentar este valor.
Min Move Distance

• Indica la distancia mínima que puede


moverse el personaje, de esta manera si el
personaje intenta moverse debajo de este
valor, en realidad no se moverá.

• Unity recomienda que este valor sea mayor


que 0.
Capsule Collider (interno)

• En caso de cambiar la altura del


colisionador, ésta se escalará a lo largo del
eje Y en ambas direcciones.
Ejemplo: Cambiar tamaño
del colisionador.

• Pensemos que controlamos un personaje


que tiene 2 estados: quieto (idle) y
agachado (crouch). En este caso, el
colisionador debería tener un tamaño
distinto dependiendo de la animación, y
éste debería achicarse cuando el personaje
esté en la animación agachado..
Ejemplo: Cambiar tamaño
del colisionador.
• Configuramos la ubicación y tamaño del
colisionador por defecto. Esta configuración
se utilizará en la animación de estar quieto.
Ejemplo: Cambiar tamaño
del colisionador.

• Para tener distintas configuraciones del


colisionador, creamos en código una
estructura (struct) para almacenar dichos
valores. Por lo general, lo que se modifica
es la posición Y del centro y la altura.

• Creamos 2 variables públicas del tipo de


dato de la estructura, para guardar las
configuraciones del colisionador cuando el
personaje está quieto y cuando está
agachado.
Ejemplo: Cambiar tamaño
del colisionador.

• Verificamos la configuración del


colisionador cuando éste se encuentra
agachado.

• Asignamos los datos de ambos


colisionadores en el Inspector:
Ejemplo: Cambiar tamaño
del colisionador.
• Para cambiar de animación, en el código de
ejemplo se usará la tecla S, de tal manera
que si se presiona la tecla S (evento
GetKeyDown) el personaje se agacha y
cambia la configuración de su colisionador a
la de agachado, y luego si se suelta la tecla S
(evento GetKeyUp) el personaje vuelve a la
animación de quieto y cambia la
configuración de su colisionador con la de
quieto.
Movimiento

• El script Character Controller cuenta con 2


métodos muy simples de utilizar: Move y
SimpleMove.

• En la práctica: SimpleMove es más sencilla


de utilizar y Move se utiliza si se desea
tener más control del movimiento.

• SimpleMove mueve el character utilizando


un vector de velocidad (en metros por
segundos), aplica automáticamente la
gravedad y retorna true si está sobre el
piso.
Ejemplo: Mover un personaje
en primera persona.

• Controlaremos a un Character con una


cámara en primera persona utilizando el
método SimpleMove.

• El GameObject del personaje tiene como


componente un Character Controller y
como objeto hijo contiene a la cámara,
generando la vista en primera persona.
Ejemplo: Mover un personaje
en primera persona.

• Para mover al personaje hacia adelante y


atrás utilizamos los eventos del teclado, con
el Input del eje Vertical (teclas W y S o bien
teclas Arrow Up o Arrow Down).

• El personaje deberá moverse hacia <su>


adelante, el cual es relativo a su rotación
actual. Para obtener el vector de dirección
hacia delante usamos transform.forward.
Ejemplo: Mover un personaje
en primera persona.

• Ahora movemos al personaje hacia los lados


utilizando el eje Horizontal del Input (teclas
A y D o bien teclas Arrow Left o Arrow
Right), y hacemos el mismo procedimiento
descrito anteriormente, pero para el vector
de movimiento final debemos sumar lo
obtenido del movimiento vertical con el
movimiento horizontal.
Ejemplo: Mover un personaje
en primera persona.

• Dado que estamos construyendo un


personaje en primera persona, deberíamos
poder girarlo en el eje de rotación Y
utilizando el input del mouse. Esta rotación
no es necesaria que sea comunicada al
Character Controller, y sólo se rota
utilizando el transform.
Ejemplo: Mover un personaje
en primera persona.
Movimiento con gravedad

• El método Move mueve el character


utilizando un vector de movimiento (en
metros), no aplica la gravedad por lo que
este valor debe ir junto con el vector de
movimiento.
Ejemplo: Mover un
personaje con salto.
• Lo primero que veremos es detectar si
estamos sobre el piso, ya que solamente
nos moveremos y saltaremos si estamos en
el piso, en caso contrario (de estar en el
aire) aplicaremos la gravedad.

• Para detectar si estamos sobre el piso,


Character Controller cuenta con una
variable de nombre isGrounded, de tipo
booleana, que indica true si está sobre el
piso y false en caso contrario.
Ejemplo: Mover un
personaje con salto.

• En caso de estar sobre el piso podremos


mover al personaje y además añadiremos
un salto, de tal manera que si presionamos
la tecla asociada a Jump el personaje
saltará. Para implementar el salto, sólo
debemos aplicar un desplazamiento en la
dirección Y del vector de movimiento.
Ejemplo: Mover un
personaje con salto.

• En caso de no estar sobre el piso


aplicaremos gravedad, este es un valor que
se lo asignaremos al vector de movimiento.

• Y finalmente movemos al personaje


utilizando el método Move del Character
Controller, recordemos que dicho método
utiliza como parámetro un vector de
movimiento y no de velocidad, por lo tanto
para simular la velocidad sólo multiplicamos
por Time.deltaTime.
Ejemplo: Mover un
personaje con salto.
Ejemplo: Mover un
personaje con salto.
Collision Flag

• El componente Character Controller


además de indicarnos si el personaje está
sobre el piso, a través de su variable
isGrounded, también nos puede indicar qué
parte de su Capsule Collider está tocando el
escenario del juego (según la última
llamada al método Move), y esto lo hace a
través de la variable collisionFlags.
Ejemplo: Detectar colisiones
por CollisionFlags.
Collider Hit

• MonoBehaviour contiene un evento de


nombre OnControllerColliderHit que es
llamado cuando el objeto con componente
CharacterController entra en contacto con
un colisionador mientras se está moviendo
(mientras ejecuta su método Move).

• El evento tiene como parámetro un objeto


de tipo ControllerColliderHit , en donde
recibe toda la información de la colisión.
Collider Hit
• El objeto ControllerColliderHit tiene la
siguiente información de la colisión:
collider The collider that was hit by the controller.
controller The controller that hit the collider.

gameObject The game object that was hit by the controller.

moveDirection The direction the CharacterController was moving in when the collision occured.

moveLength How far the character has travelled until it hit the collider.

normal The normal of the surface we collided with in world space.

point The impact point in world space.


rigidbody The rigidbody that was hit by the controller.

transform The transform that was hit by the controller.


Asset: Collider View
• Mientras más elementos existan en una
escena de juego y más grande es el
desarrollo, se hace más difícil poder
identificar todos los colisionadores. Este
asset permite debuggear una escena de
juego, pudiendo visualizar cada uno de los
colisionadores con un color distinto por tipo
e identificar cómo colisiona un personaje
con los distintos elementos.

https://www.assetstore.unity3d.com/en/#!/content/25478
Asset: Easy Character
Movement
• Controlador basado en Character Controller,
pero que funciona con Rigidbody,
permitiendo tener comportamientos fìsicos
que no posee el Character Controller, tales
como: mover y rotar sobre plataformas en
movimiento, tener fricción, mejorar el
comportamiento de los saltos, entre otros.
• Viene con integración para NavMesh y
animaciones con Root Motion.

https://www.assetstore.unity3d.com/en/#!/content/57985
Actividad 2

• Utilizando el prototipo de la actividad 1 agregarle un


personaje con CharacterController.

• El personaje tendrá un sistema de energía, y tendrá la


habilidad de caminar y correr. El objetivo es que el
personaje viaje desde un punto A a un punto B
evadiendo obstáculos y no muriendo en el camino.

• Detectar zonas dentro de la escena. Hacer una zona de


peligro de manera tal que si el personaje está en esa
zona, cada X tiempo que disminuya su energía. Hacer
otra zona de recuperación de energía.

• Agregar objetos como trampas que si se tocan uno


pierde el 20% de la energía.
https://assetstore.unity.com/packages/essentials/asset-
packs/standard-assets-32351
3. Interacciones

• Los colisionadores interactúan entre sí de diferentes


maneras, dependiendo de la configuración del
componente Rigidbody.

• Las configuraciones importantes son:


• Static Collider.
• Rigidbody Collider.
• Kinematic Rigidbody Collider.
• Trigger Collider.
Static Collider
• Éste es un GameObject que tiene un componente
Collider pero no Rigidbody. Es usado por objetos que
siempre permanecen en el mismo lugar y nunca se
mueven. Los objetos con Rigidbody colisionarán con el
Static Collider pero no lo moverán.
Static Collider

• Ejemplos de este tipo de configuración lo


tienen los elementos estáticos del
escenario, tales como el piso, paredes o
elementos decorativos.

• Para configurar un objeto como Static


Collider, simplemente debe tener añadido
un Collider.
Rigidbody Collider

• Éste es un GameObject con un Collider y un


Rigidbody normal (no cinemático). Los
Rigidbody Collider son simulados por el
motor de la física y pueden reaccionar ante
colisiones y fuerzas aplicadas, además
pueden chocar con otros objetos (incluídos
los colisionadores estáticos).
Rigidbody Collider

• Para que un objeto esté configurado como


Rigidbody Collider, éste debe contener
junto con el componente Collider un
componente Rigidbody.
Kinematic Rigidbody
Collider
• El término “cinemático” (IsKinematic) en
física clásica se refiere al movimiento de los
objetos sin considerar las causas que los
producen; es decir, el cambio de posición en
el tiempo sin considerar las fuerzas.
• Un objeto de tipo Kinematic Rigidbody
Collider puede moverse y ser
desactivado/activado pero que no responde
a colisiones y fuerzas como un objeto
Rigidbody normal, por lo tanto tampoco son
afectados por la gravedad.
• Además, al contrario de un Static Collider,
un Kinematic Rigidbody en movimiento
puede aplicar fuerzas a otros objetos
Rigidbody cuando entra en contacto.
Kinematic Rigidbody
Collider
Kinematic Rigidbody
Collider
Trigger Collider

• Éste es un GameObject que tiene como componente


un Collider con la propiedad IsTrigger activada, y
funciona con las 3 configuraciones anteriormente
indicadas, generando las nuevas configuraciones:
• Static Trigger Collider.
• Rigidbody Trigger Collider.
• Kinematic Rigidbody Trigger Collider.

• Un trigger es un disparador o activador de eventos,


por lo que un Trigger Collider activa un evento
cuando un collider entra en su espacio. Estos collider
no se comportan como un objeto sólido sino que
permiten que otros colliders puedan pasar a través
de él, como si físicamente no tuviesen un
colisionador.
Colisiones Basadas en
Layers
• En Unity podemos indicarle a un objeto con
qué otros objetos puede y no puede
interactuar.
• En caso de indicar que 2 objetos no pueden
interactuar significa que la física no aplica
entre ellos y no se genera una colisión en
caso de tocarse (visualmente), por lo que
no se activará ningún evento al respecto.
Estas interacciones se indican por medio de
layer o capas.
Colisiones Basadas en
Layers
• La interacción física entre las capas se
modifica en el “layer collision matrix” , que
se encuentra en las configuraciones de la
física del proyecto, para acceder se debe ir
al menú: Edit -> Project Settings -> Physics.
Ejemplo: Interacción
usando layers.

• Creamos nuevos layers, los identificamos


con los nombres Layer 1, Layer 2, Layer 3.

• A continuación creamos una escena con 3


planos, y cada uno de ellos lo asignamos a
un layer distinto. Además creamos un cubo
con el componente Rigidbody, ubicado
sobre los planos, de manera tal que al
ejecutar el juego el cubo caerá por efecto
de la gravedad.
Ejemplo: Interacción
usando layers.
Ejemplo: Interacción
usando layers.

• Para los layers creados, en la matriz de


colisión física, indicaremos que sólo pueden
interactuar con elementos de su mismo
layer, esto quiere decir por ejemplo que un
objeto del layer 1 no interactuará con un
objeto del layer 2.
Ejemplo: Interacción
usando layers.
• Como primera prueba le indicaremos al
cubo que pertenezca a la capa “Layer 1”.
Taller de Física 3D en Unity
Clase 1

fernando@invadelab.cl

También podría gustarte