28. CLASE CHARACTERCONTROLLER (I)




Un character Controller nos permite hacer fácilmente movimientos limitados por colisiones sin tener que lidiar con un rigidbody.

Comprobémoslo empíricamente, siguiendo estos pasos:
1.- Le borramos a la esfera el script que tiene vinculado.
2.- Le eliminamos a la esfera su componente rigidbody (botón derecho del ratón
situado sobre el nombre de dicho componente=> remove component)
3.- Con la esfera seleccionada, vamos al menú Component=>Physics=>Character
Controller. Nos saldrá un aviso preguntándonos si realmente queremos sustituir
el collider primitivo que por defecto trae la esfera por un Character
collider. Presionamos Replace.
4.- En Jerarquía seleccionamos suelo, y en el inspector desmarcamos el checkbox
situado junto a Mesh Collider.
5.- Play.

El cubo, afectado por las leyes físicas, atraviesa el suelo al que le hemos deshabillitado la malla. Sin embargo el cubo, que ahora está controlado por el character controller, no se ve afectado por las leyes físicas.

Antes de seguir, volvamos a habilitar la malla del suelo en su correspondiente checkbox.

Un character Controller no se ve afectado tampoco por fuerzas y se moverá sólo cuando llamemos a la función Move, específica de esta clase.


VARIABLES:

isGrounded:

var isGrounded : boolean


Booleano que devuelve true si nuestro character controller (controlador de personaje, podríamos traducirlo) estaba tocando el suelo durante el último movimiento.


velocity:

var velocity : Vector3


La velocidad relativa actual del character. La velocidad así retornada es la diferencia durante la última actualización entre la distancia antes y después de llamar a la función Move o SimpleMove, esto es, dónde estaba el último frame, o la última porción de frame o el último segundo el character antes de llamar a una de esas funciones y dónde estába despues, para que distancia partida por (tiempo, frame o fracción dada) sea igual a la velocidad por tiempo, frame o fracción dada.

Decimos que la velocidad es relativa porque no puede seguir movimientos del transform que suceden fuera del character controller (por ej un character emparentado bajo otro transform en movimiento, como por ejemplo un vehículo moviéndose)


collisionFlags:

var collisionFlags : CollisionFlags


Esta variable nos indicá qué parte de la cápsula (que es la forma que tiene un character controller) colisionó con el entorno durante la última llamada a CharacterController.Move.

Comprobamos que la variable es de tipo CollisionFlags, que tal como podemos sospechar es de tipo enumeración, permitiéndonos usar los siguientes valores:


None: No hay colisión.
Sides: Colisión en los lados.
Above: Colisión en la parte superior.
Bellow: Colisión en la parte inferior.

Así, un sistema para determinar si nuestro character controller ha topado con algo, y en qué parte de la cápsula, sería como sigue (no hace falta que tecleéis esto, es sólo a modo indicativo):

function Update () {

var controller : CharacterController = GetComponent(CharacterController);
controller.Move(Vector3(1,0,0));

if (controller.collisionFlags == CollisionFlags.None)
print("No hay colisiones");

if (controller.collisionFlags & CollisionFlags.Sides)
print("Colisión lateral, al menos");

if (controller.collisionFlags == CollisionFlags.Sides)
print("Sólo colisión lateral, ninguna de otro tipo");

if (controller.collisionFlags & CollisionFlags.Above)
print("Colisión superior, al menos");

if (controller.collisionFlags == CollisionFlags.Above)
print("Sólo colisión superior, ninguna de otro tipo");

if (controller.collisionFlags & CollisionFlags.Below)
print("Tocando tierra");

if (controller.collisionFlags == CollisionFlags.Below)
print("Sólo tocando tierra, nada más");
}


Le añadimos el script a la esfera (si no lo tenía ya vinculado) y le damos al play.

La esfera se mueve hacia la derecha, hasta que impacta con el cubo (démonos cuenta que la esfera ya no tiene un ridigbody, pero gracias al character controller sigue colisionando con otros colliders. Debajo de la ventana game aparece impresa la última colisión, pero no es la única. Si le hacemos click al mensaje impreso nos saldrá una lista de todas las colisiones que ha sufrido nuestra esfera hasta topar con el cubo.

La función GetComponent que hemos tecleado al inicio del script aún no la hemos estudiado, pero su cometido es bastante obvio: buscar el componente del gameobject que hace la llamada y que sea del tipo que le pasamos como parámetro, retornándolo. En este caso, nos sirve para inicializar la variable controller, con la que trabajaremos para montar un primitivo sistema de identificación de colisiones.

la función Print es similar a Debug.Log, y la función Move la estudiaremos durante el próximo capítulo.

POSTED BY UnityScripts
DISCUSSION 0 Comments

Leave a Reply

Con la tecnología de Blogger.