Físicas con Unity
Transcripción
Físicas con Unity
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