Sei sulla pagina 1di 6

Ejercicios de fsicas con Unity

ndice
1

Cuerpos rgidos.............................................................................................................2

Colisiones..................................................................................................................... 2

Sensores........................................................................................................................3

Uniones.........................................................................................................................5

Copyright 2013-14 Dpto. Ciencia de la Computacin e I.A. All rights reserved.

Ejercicios de fsicas con Unity

1. Cuerpos rgidos
Vamos a continuar el proyecto Unity BlockGame creado en sesiones anteriores, para
aadir ahora fsicas. Deberemos:
a) Abre el proyecto BlockGame en Unity (File > Open Project ...) y crea una nueva
escena (File > New Scene). Guarda la escena (File > Save Scene) y dale el nombre
Escena02. Vers que la nueva escena aparece como asset del proyecto.
b) Aade a la escena un prefab de tipo Habitacin definido en la sesin anterior,
arrastrndolo desde el panel Project al editor de la escena (si no cuentas con este prefab
puedes crear manualmente un plano de 10x10 metros y un muro al fondo del plano).
c) Crea una luz direccional en la escena (GameObject > Create Other > Directional
Light).
d) Crea una esfera (GameObject > Create Other > Sphere) y situala a unos 3m de altura
sobre el plano, justo al comienzo del mismo (lo ms cercano a la cmara). Dale al cubo el
nombre Proyectil y un material de color rojo (si no tienes este material creado de la sesin
anterior, debers crearlo como asset con Assets > Create Material y en el Inspector
seleccionar un rojo como Main Color).
e) Aade a la esfera un componente de tipo RigidBody (Add Component > Physics >
Rigidbody). Prueba a ejecutar el proyecto y comprueba como la gravedad afecta a la
esfera.
f) Crea un script ProyectilScript en el que definiremos el comportamiento de la esfera
Proyectil. Haz que al inicializarse se aplique sobre ella un impulso de 10 kgm/s en la
direccin z hacia adelante. Comprueba el efecto del impulso al ejecutar el juego.
g) Crea un material fsico para la esfera (Assets > Create > Physics Material) que haga
que rebote (puedes utilizar una restitucin de 0.75). Prueba el efecto de aplicar este
material.
h) Crea ahora una forma rectangular alargada de color amarillo. Aade sobre ellas un
componente de cuerpo rgido. Almacena el objeto como prefab. Crea varias instancias del
prefab y realiza con ellas una construccin apilando las piezas que acabamos de crear de
diferentes formas, y situando la construccin cerca del fondo del plano, en un lugar donde
sepamos que la esfera va a impactar. Observa el efecto del impacto de la esfera contra la
construccin.

2. Colisiones
Vamos ahora a detectar colisiones con los distintos elementos del escenario.

Copyright 2013-14 Dpto. Ciencia de la Computacin e I.A. All rights reserved.

Ejercicios de fsicas con Unity

a) En primer lugar vamos a hacer que la esfera no se lance automticamente, sino que lo
haga cuando pulsemos con el ratn sobre ella. Para ello trazaremos un rayo, y
aplicaremos un impulso en el punto de la esfera donde haya impactado el rayo. Para ello
el impulso se deber aplicar en el sentido opuesto a la normal del contacto con la esfera, y
con una magnitud de 10 kgm/s.
b) Vamos a crear un marcador para el juego. Crea un objeto en la escena de tipo GUI
Text, y pon en l el texto "SCORE: 0" en la esquina superior izquierda, con tamao 24,
fuente Arial y color amarillo.
c) Una vez tenemos el marcador en pantalla, vamos a escribir un script que nos sirva para
almacenar y actualizar la puntuacin. Crearemos un asset de tipo script al que llamaremos
MarcadorScript y aadiremos una variable global en la que almacenar la puntuacin
como la siguiente:
static var puntuacion : int = 0;

Hay que destacar el modificador static. Este modificador hace que se cree una instancia
nica de esta variable para todo el juego, independientemente de que pueda haber varios
objetos que utilicen este script (todos ellos compartiran la misma puntuacin). Por lo
tanto, desde cualquier otro script podremos incrementar la puntuacin simplemente con:
MarcadorScript.puntuacion ++;

Por otro lado, haz que en el mtodo Update el texto (propiedad text) del componente
guiText se actualice con la nueva puntuacin.
d) Ganaremos puntos cuando la bola impacte con los bloques de la estructura. Para ello
deberemos detectar colisiones entre estos objetos. Define un script llamado PiezaScript
y asgnalo como componente a todas las piezas (utiliza para ello el prefab). Haz que al
detectar el inicio de una colisin se incremente la puntuacin segn la magnitud de la
velocidad relativa de dicha colisin (busca la propiedad adecuada en la clase Collision).
Ejecuta el juego y comprueba lo que ocurre.
e) Modifica la deteccin para que slo se tengan en cuenta las colisiones entre la bola y
las piezas. Para ello, antes de incremental la puntuacin, puedes comprobar si el objeto
con el que ha colisionado se llama "Proyectil". Esto se puede obtener mediante la
propiedad collision.gameObject.name.

3. Sensores
Vamos a crear ahora un tanque de agua. Dentro de ese tanque haremos que los cuerpos
dinmicos floten. Esto lo implementaremos mediante un sensor.
a) Crea un cubo de dimensiones 3m x 3m de color azul semitransparente (utiliza para ello
un material con shader Transparent/Diffuse). Haz que el componente collider de dicho
cubo se comporte como trigger. Sitalo sobre el escenario, y comprueba que al lanzar la

Copyright 2013-14 Dpto. Ciencia de la Computacin e I.A. All rights reserved.

Ejercicios de fsicas con Unity

bola contra l, lo atraviesa.


b) Vamos a hacer ahora que cuando un objeto entre en l, se le aplique a dicho objeto una
fuerza de flotacin. Para ello definiremos un script AguaScript, y lo aadiremos como
componente al cubo de agua. En dicho script definiremos el mtodo OnTriggerStay
donde aplicaremos una fuerza para hacer que los cuerpos que entren en el volumen del
trigger floten. Para poder aplicar la fuerza antes deberemos comprobar que el collider que
ha entrado en el volumen tiene asociado un rigidbody:
if(other.attachedRigidbody) {
other.attachedRigidbody.AddForce(Vector3(0,20,0));

c) Vamos a mejorar el mtodo anterior, para ello comprobaremos el grado de


sumergimiento y la masa del volumen de agua desplazada:
private var waterDensity : float = 2;
function OnTriggerStay(other : Collider) {
if(other.attachedRigidbody) {
var otherBounds : Bounds = other.bounds;
var waterBounds : Bounds = collider.bounds;
var volumen : float = otherBounds.size.x * otherBounds.size.y *
otherBounds.size.z;
var sumergimiento : float =
(waterBounds.max.y - otherBounds.min.y)
/ otherBounds.size.y;
sumergimiento = Mathf.Clamp(sumergimiento, 0, 1);
other.attachedRigidbody.AddForce(-Physics.gravity *
waterDensity * volumen * sumergimiento);
}
}

Debemos destacar que la solucin anterior no es exacta, ya que por simplicidad estamos
considerando el bounding volume del cuerpo sumergido, y no su forma real. Estamos
tambin considerando el cuerpo sumergido como una partcula, por lo que slo ser
vlido para algunos tipos de cuerpos, como por ejemplo esferas. Qu podramos hacer
para extender el modelo a cuerpos con otras formas?
Si ejecutamos el juego, veremos que al entrar en el agua el cuerpo no deja de oscilar
alrededor de la superficie.
d) Para que el cuerpo no oscile indefinidamente, deberemos aplicar una fuerza de
resistencia (dumping). Lo ms apropiado ser aplicar esta fuerza slo cuando est
sumergido, ya que la resistencia al agua se supone que ser mayor a la resistencia al aire.
Para ello aadiremos al mtodo OnTriggerStay la siguiente fuerza:
other.attachedRigidbody.AddForce(-other.attachedRigidbody.velocity *
waterDamping);

Como waterDamping puedes utilizar por ejemplo el valor 0.75 (crea una variable global
privada para definir este valor). Ejecuta de nuevo el juego. Ahora el comportamiento
dentro del agua ser ms realista.

Copyright 2013-14 Dpto. Ciencia de la Computacin e I.A. All rights reserved.

Ejercicios de fsicas con Unity

4. Uniones
Para finalizar vamos a conectar la esfera (proyectil) a un resorte para que se comporte
como una "bola de demolicin". Aade al objeto Proyectil un componente de tipo Physics
> Spring Joint y comprueba ahora el comportamiento del objeto al ejecutar el juego.

Copyright 2013-14 Dpto. Ciencia de la Computacin e I.A. All rights reserved.

Ejercicios de fsicas con Unity

Copyright 2013-14 Dpto. Ciencia de la Computacin e I.A. All rights reserved.

Potrebbero piacerti anche