Físicas con Unity

Anuncio
VIDEOJUEGOS 2
Físicas con Unity
Físicas con Unity
V2
Puntos a tratar
•
•
•
•
•
•
•
•
Cuerpos rígidos
Colisiones
Trazado de rayos
Sensores
Materiales físicos
Uniones
Personajes
Ragdolls
Videojuegos II
© 2014-2015 Depto. Ciencia de la Computación e IA
Físicas con Unity
2
V2
Físicas con Unity
Físicas con Unity
• Unity incorpora PhysX como motor de físicas
• Para juegos 2D utiliza Box2D
• La física es configurable desde el entorno
• Podemos programar la física en UnityScript
• Separa claramente detección de colisiones y simulación física
Videojuegos II
© 2014-2015 Depto. Ciencia de la Computación e IA
Físicas con Unity
3
V2
Físicas con Unity
Cuerpos rígidos
• Para que un objeto se someta a la simulación física añadiremos un
componentes Rigidbody
• Rigidbody 2D en el caso del motor 2D
• Podemos acceder desde UnityScript a sus propiedades mediante la
variable implícita rigidbody
Videojuegos II
© 2014-2015 Depto. Ciencia de la Computación e IA
Físicas con Unity
4
V2
Físicas con Unity
Colisiones
• Para que un cuerpo pueda colisionar con otros debemos añadir
un componente de tipo collider
• Existen distintos tipos de collider según la forma del objeto
• Podemos acceder al collider desde UnityScript con la variable
implícita collider
Videojuegos II
© 2014-2015 Depto. Ciencia de la Computación e IA
Físicas con Unity
5
V2
Físicas con Unity
Detección de colisiones
• Cuando un cuerpo incorpore un componente collider se le
notificarán las colisiones con otros cuerpos
• Podemos implementar en su script los siguiente métodos
void OnCollisionEnter (Collision collision) {
...
}
void OnCollisionStay (Collision collision) {
...
}
void OnCollisionExit (Collision collision) {
...
}
• El objeto Collision nos proporcionará información sobre la colisión
y sobre el otro cuerpo implicado
Videojuegos II
© 2014-2015 Depto. Ciencia de la Computación e IA
Físicas con Unity
6
V2
Físicas con Unity
Datos de la colisión
• Podemos obtener datos del cuerpo con el que colisionamos
• Datos del objeto, del cuerpo rígido, velocidad relativa,etc
void OnCollisionEnter (Collision collision) {
if(collision.gameObject.tag == “bala"
&& collision.relativeVelocity>100) {
Destroy(this);
}
}
• También podemos obtener información 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 Computación e IA
Físicas con Unity
7
V2
Físicas con Unity
Trazado de rayos
• Podemos trazar rayos para detectar si hay algún objeto en la
dirección del rayo
• Si llamamos a Raycast sobre un objeto collider, sólo 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 Computación e IA
Físicas con Unity
8
V2
Físicas con Unity
Sensores
• Podemos crear sensores marcando la propiedad isTrigger sobre el
collider
• En estos casos la geometría de colisión abarcará normalmente
zonas vacías del espacio
Videojuegos II
© 2014-2015 Depto. Ciencia de la Computación e IA
Físicas con Unity
9
V2
Físicas con Unity
Respuesta al sensor
• En el script podemos recibir notificaciones cuando algún 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 Computación e IA
Físicas con Unity
10
V2
Físicas con Unity
Tipos de cuerpos en Unity
• Estático
• Incorpora un componente Collider
• No incorpora ningún componente Rigidbody
• Cinemático
• Incorpora un componente Collider
• Incorpora un componente Rigidbody con la propiedad is Kinematic
• Dinámico
• Incorpora un componente Collider
• Incorpora un componente Rigidbody sin la propiedad is Kinematic
Videojuegos II
© 2014-2015 Depto. Ciencia de la Computación e IA
Físicas con Unity
11
V2
Físicas con Unity
Contactos detectados
• En el caso de las colisiones, el motor detectará
• Colisiones entre un cuerpo dinámico y cualquier otro cuerpo
• Es decir, no se detectarán colisiones entre cuerpos cinemáticos y
estáticos, al menos uno de ellos debería ser dinámico
• En el caso de los sensores (triggers), el motor detectará
• Colisiones de cuerpos dinámicos con cualquier otro cuerpo
• Colisiones de cuerpos cinemáticos con cualquier otro cuerpo
• No se detectarán colisiones entre dos cuerpos estáticos
• Podemos filtrar los contactos a comprobar mediante layering
Videojuegos II
© 2014-2015 Depto. Ciencia de la Computación e IA
Físicas con Unity
12
V2
Físicas con Unity
Propiedades generales del mundo
• Podemos establecer las propiedades físicas del mundo en
• Edit > Project Settings > Physics
Layering
Videojuegos II
© 2014-2015 Depto. Ciencia de la Computación e IA
Físicas con Unity
13
V2
Físicas con Unity
Física en Unity Script
• La física debe funcionar a frecuencia fija
• Utilizaremos el método 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 Computación e IA
Físicas con Unity
14
V2
Físicas con Unity
Aplicación de fuerzas
• Podemos aplicar una fuerza o impulso lineal a un cuerpo rígido
void FixedUpdate() {
GetComponent<Rigidbody>().AddForce(new Vector3(0,1,0), ForceMode.Force);
}
• Podemos también 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 Computación e IA
Físicas con Unity
15
V2
Físicas con Unity
Traslación y rotación de cuerpos
• Establecer una nueva posición
GetComponent<Rigidbody>().position =
new Vector3(5,0,5);
GetComponent<Rigidbody>().MovePosition(
new Vector3(5,0,5));
Cambia la posición atravesando
los obstáculos intermedios
“Empuja” a los objetos que haya
en el camino al destino
• Establecer una nueva orientación
GetComponent<Rigidbody>().rotation = Quaternion.identity;
GetComponent<Rigidbody>().MoveRotation(Quaternion.AngleAxis(90, Vector3.forward));
• Interpolación de quaternions
Quaternion de rotación 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 Computación e IA
Quaternion a partir
de rotar 90º en Z,
30º en X, y 0º en Y
(en este orden)
Físicas con Unity
16
V2
Físicas con Unity
Uniones
• Podemos definir uniones entre cuerpos rígidos o con puntos fijos
• Se crean añadiendo componentes de tipo Joint
• Por ejemplo, podemos configurar un resorte de la siguiente forma
Videojuegos II
© 2014-2015 Depto. Ciencia de la Computación e IA
Físicas con Unity
17
V2
Físicas con Unity
Material de colisión
• Podemos definir los materiales de colisión como assets
• Asset > Create > Physic Material
• En estos materiales definimos los coeficientes del material físico
• También se establece la forma de combinar coeficientes
Videojuegos II
© 2014-2015 Depto. Ciencia de la Computación e IA
Físicas con Unity
18
V2
Físicas con Unity
Controlador del personaje
• El control del personaje normalmente no se somete a físicas
• Sólo detecta colisiones con el escenario
• Es difícil conseguir el comportamiento adecuado de un Rigidbody
• En Unity se proporciona el componente Character Controller
•
•
•
•
Incorpora un collider de tipo cápsula
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 Computación e IA
Físicas con Unity
19
V2
Físicas con Unity
Controladores de alto nivel
• Podemos importar el paquete de assets Character Controller
• Incluye controladores avanzados para primera y tercera persona
• Podemos añadirlos como componente de tipo script al personaje
Videojuegos II
© 2014-2015 Depto. Ciencia de la Computación e IA
Físicas con Unity
20
V2
Físicas con Unity
Ragdolls
• El cuerpo está formado por una serie de “huesos”
• Cada hueso se representa por un cuerpo de tipo cápsula
• Los huesos se conectan mediante articulaciones
• Se trata de uniones de tipo Character Joint
• Unity permite crear estas conexiones de forma automática
• GameObject > Create Other … > Ragdoll …
Videojuegos II
© 2014-2015 Depto. Ciencia de la Computación e IA
Físicas con Unity
21
V2
Físicas con Unity
¿Preguntas...?
Videojuegos II
© 2014-2015 Depto. Ciencia de la Computación e IA
Físicas con Unity
22
Descargar