You are on page 1of 22

VIDEOJUEGOS 2

Fsicas con Unity

Fsicas con Unity

V2

Puntos a tratar

Cuerpos rgidos
Colisiones
Trazado de rayos
Sensores
Materiales fsicos
Uniones
Personajes
Ragdolls

Videojuegos II

2014-2015 Depto. Ciencia de la Computacin e IA

Fsicas con Unity

V2

Fsicas con Unity

Fsicas con Unity


Unity incorpora PhysX como motor de fsicas
Para juegos 2D utiliza Box2D

La fsica es configurable desde el entorno


Podemos programar la fsica en UnityScript
Separa claramente deteccin de colisiones y simulacin fsica

Videojuegos II

2014-2015 Depto. Ciencia de la Computacin e IA

Fsicas con Unity

V2

Fsicas con Unity

Cuerpos rgidos
Para que un objeto se someta a la simulacin fsica aadiremos un
componentes Rigidbody
Rigidbody 2D en el caso del motor 2D

Podemos acceder desde UnityScript a sus propiedades mediante la


variable implcita rigidbody

Videojuegos II

2014-2015 Depto. Ciencia de la Computacin e IA

Fsicas con Unity

V2

Fsicas con Unity

Colisiones
Para que un cuerpo pueda colisionar con otros debemos aadir
un componente de tipo collider
Existen distintos tipos de collider segn la forma del objeto

Podemos acceder al collider desde UnityScript con la variable


implcita collider

Videojuegos II

2014-2015 Depto. Ciencia de la Computacin e IA

Fsicas con Unity

V2

Fsicas con Unity

Deteccin de colisiones
Cuando un cuerpo incorpore un componente collider se le
notificarn las colisiones con otros cuerpos
Podemos implementar en su script los siguiente mtodos
void OnCollisionEnter (Collision collision) {
...
}
void OnCollisionStay (Collision collision) {
...
}
void OnCollisionExit (Collision collision) {
...
}

El objeto Collision nos proporcionar informacin sobre la colisin


y sobre el otro cuerpo implicado
Videojuegos II

2014-2015 Depto. Ciencia de la Computacin e IA

Fsicas con Unity

V2

Fsicas con Unity

Datos de la colisin
Podemos obtener datos del cuerpo con el que colisionamos
Datos del objeto, del cuerpo rgido, velocidad relativa,etc
void OnCollisionEnter (Collision collision) {
if(collision.gameObject.tag == bala"
&& collision.relativeVelocity>100) {
Destroy(this);
}
}

Tambin podemos obtener informacin de cada punto de contacto


void OnCollisionEnter (Collision collision) {
foreach(ContactPoint contact in collision.contacts) {
Vector3 point = contact.point;
Vector3 normal = contact.normal;
}
}

Videojuegos II

2014-2015 Depto. Ciencia de la Computacin e IA

Fsicas con Unity

V2

Fsicas con Unity

Trazado de rayos
Podemos trazar rayos para detectar si hay algn objeto en la
direccin del rayo
Si llamamos a Raycast sobre un objeto collider, slo detectar
dicho collider (til cuando busquemos un objeto concreto)
Nos proporciona la normal del contacto con el rayo
if (Input.GetMouseButton(0)) {
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (collider.Raycast(ray, out hit, 100.0F)) {
rigidbody.AddForce(-hit.normal*10, ForceMode.Impulse);
}
}

Si queremos detectar cualquier collider podemos utilizar


Physics.Raycast()
Videojuegos II

2014-2015 Depto. Ciencia de la Computacin e IA

Fsicas con Unity

V2

Fsicas con Unity

Sensores
Podemos crear sensores marcando la propiedad isTrigger sobre el
collider

En estos casos la geometra de colisin abarcar normalmente


zonas vacas del espacio

Videojuegos II

2014-2015 Depto. Ciencia de la Computacin e IA

Fsicas con Unity

V2

Fsicas con Unity

Respuesta al sensor
En el script podemos recibir notificaciones cuando algn objeto
entra en el sensor
void OnTriggerEnter (Collider other) {
...
}
void OnTriggerStay (Collider other) {
...
}
void OnTriggerExit (Collider other) {
...
}

Videojuegos II

2014-2015 Depto. Ciencia de la Computacin e IA

Fsicas con Unity

10

V2

Fsicas con Unity

Tipos de cuerpos en Unity


Esttico
Incorpora un componente Collider
No incorpora ningn componente Rigidbody

Cinemtico
Incorpora un componente Collider
Incorpora un componente Rigidbody con la propiedad is Kinematic

Dinmico
Incorpora un componente Collider
Incorpora un componente Rigidbody sin la propiedad is Kinematic

Videojuegos II

2014-2015 Depto. Ciencia de la Computacin e IA

Fsicas con Unity

11

V2

Fsicas con Unity

Contactos detectados
En el caso de las colisiones, el motor detectar
Colisiones entre un cuerpo dinmico y cualquier otro cuerpo
Es decir, no se detectarn colisiones entre cuerpos cinemticos y
estticos, al menos uno de ellos debera ser dinmico

En el caso de los sensores (triggers), el motor detectar


Colisiones de cuerpos dinmicos con cualquier otro cuerpo
Colisiones de cuerpos cinemticos con cualquier otro cuerpo
No se detectarn colisiones entre dos cuerpos estticos

Podemos filtrar los contactos a comprobar mediante layering

Videojuegos II

2014-2015 Depto. Ciencia de la Computacin e IA

Fsicas con Unity

12

V2

Fsicas con Unity

Propiedades generales del mundo


Podemos establecer las propiedades fsicas del mundo en
Edit > Project Settings > Physics

Layering
Videojuegos II

2014-2015 Depto. Ciencia de la Computacin e IA

Fsicas con Unity

13

V2

Fsicas con Unity

Fsica en Unity Script


La fsica debe funcionar a frecuencia fija
Utilizaremos el mtodo FixedUpdate() para actualizara
Podemos establecer la tasa fija de fotogramas utilizada
Time.fixedDeltaTime

Por defecto
0.02 (50fps)

Por ejemplo
void Start () {
Time.fixedDeltaTime = 0.3;
}

Videojuegos II

2014-2015 Depto. Ciencia de la Computacin e IA

Fsicas con Unity

14

V2

Fsicas con Unity

Aplicacin de fuerzas
Podemos aplicar una fuerza o impulso lineal a un cuerpo rgido
void FixedUpdate() {
GetComponent<Rigidbody>().AddForce(new Vector3(0,1,0), ForceMode.Force);
}

Podemos tambin aplicar un par de fuerzas (torque)


void FixedUpdate() {
GetComponent<Rigidbody>().AddTorque(Vector3.up, ForceMode.Impulse);
}

ForceMode nos permite elegir entre fuerza o impulso


// Teniendo en cuenta la masa
GetComponent<Rigidbody>().AddForce(Vector3.up, ForceMode.Force);
GetComponent<Rigidbody>().AddForce(Vector3.up, ForceMode.Impulse);
// Sin tener en cuenta la masa
GetComponent<Rigidbody>().AddForce(Vector3.up, ForceMode.Acceleration);
GetComponent<Rigidbody>().AddForce(Vector3.up, ForceMode.VelocityChange);

Videojuegos II

2014-2015 Depto. Ciencia de la Computacin e IA

Fsicas con Unity

15

V2

Fsicas con Unity

Traslacin y rotacin de cuerpos


Establecer una nueva posicin
GetComponent<Rigidbody>().position =
new Vector3(5,0,5);
GetComponent<Rigidbody>().MovePosition(
new Vector3(5,0,5));

Cambia la posicin atravesando


los obstculos intermedios
Empuja a los objetos que haya
en el camino al destino

Establecer una nueva orientacin


GetComponent<Rigidbody>().rotation = Quaternion.identity;
GetComponent<Rigidbody>().MoveRotation(Quaternion.AngleAxis(90, Vector3.forward));

Interpolacin de quaternions

Quaternion de rotacin de 90 alrededor de (0,0,1)

GetComponent<Rigidbody>().rotation = Quaternion.Lerp(
GetComponent<Rigidbody>().rotation,
new Quaternion.Euler(30, 0, 90),
0.5);

Interpola a mitad de camino


entre origen y destino
Videojuegos II

2014-2015 Depto. Ciencia de la Computacin e IA

Quaternion a partir
de rotar 90 en Z,
30 en X, y 0 en Y
(en este orden)

Fsicas con Unity

16

V2

Fsicas con Unity

Uniones
Podemos definir uniones entre cuerpos rgidos o con puntos fijos
Se crean aadiendo componentes de tipo Joint

Por ejemplo, podemos configurar un resorte de la siguiente forma

Videojuegos II

2014-2015 Depto. Ciencia de la Computacin e IA

Fsicas con Unity

17

V2

Fsicas con Unity

Material de colisin
Podemos definir los materiales de colisin como assets
Asset > Create > Physic Material

En estos materiales definimos los coeficientes del material fsico


Tambin se establece la forma de combinar coeficientes

Videojuegos II

2014-2015 Depto. Ciencia de la Computacin e IA

Fsicas con Unity

18

V2

Fsicas con Unity

Controlador del personaje


El control del personaje normalmente no se somete a fsicas
Slo detecta colisiones con el escenario
Es difcil conseguir el comportamiento adecuado de un Rigidbody

En Unity se proporciona el componente Character Controller

Incorpora un collider de tipo cpsula


No le afectan las fuerzas
Permite manejar de forma sencilla a nuestro personaje
Si queremos aplicar fuerzas a elementos del escenario deberemos
hacerlo mediante script

Videojuegos II

2014-2015 Depto. Ciencia de la Computacin e IA

Fsicas con Unity

19

V2

Fsicas con Unity

Controladores de alto nivel


Podemos importar el paquete de assets Character Controller
Incluye controladores avanzados para primera y tercera persona
Podemos aadirlos como componente de tipo script al personaje

Videojuegos II

2014-2015 Depto. Ciencia de la Computacin e IA

Fsicas con Unity

20

V2

Fsicas con Unity

Ragdolls
El cuerpo est formado por una serie de huesos
Cada hueso se representa por un cuerpo de tipo cpsula

Los huesos se conectan mediante articulaciones


Se trata de uniones de tipo Character Joint

Unity permite crear estas conexiones de forma automtica


GameObject > Create Other > Ragdoll

Videojuegos II

2014-2015 Depto. Ciencia de la Computacin e IA

Fsicas con Unity

21

V2

Fsicas con Unity

Preguntas...?

Videojuegos II

2014-2015 Depto. Ciencia de la Computacin e IA

Fsicas con Unity

22

You might also like