30. CLASE CHARACTERCONTROLLER (y III)









FUNCIONES:

Move:


function Move (motion : Vector3) : CollisionFlags


Esta función mueve un character controller en la dirección y velocidad establecida por el parámetro de tipo vector tres. Dicho movimiento sólo será restringido por las colisiones que sufra el character.

Empecemos por un ejemplo básico. Eliminamos el script vinculado al cubo, y acto seguido modificamos el script vinculado a la esfera, para que quede así:


private var miCharCol : CharacterController;
miCharCol = GetComponent(CharacterController);

function Update() {
miCharCol.Move(Vector3(1 * Time.deltaTime ,0,0));
}


No tiene mucho misterio. Almacenamos el componente character controller de nuestro gameobject en una variable (que declaramos como privada para que no sea accesible desde el inspector), y acto seguido le damos un movimiento de una unidad por segundo a la derecha. Pulsando el play efectivamente la esfera se desplaza hasta que topa con el cubo.

El collider del cubo en este caso detiene el avance de la esfera, porque lo intercepta de pleno. Pero si al cubo lo ubicamos en position.Z= 0.8 y volvemos a darle al play, observamos que la esfera no detiene su avance. Choca y se desplaza de manera acorde a la colisión, pero acto seguido continúa avanzando hacia la derecha.

La función devuelve una variable de tipo collisionFlags, que estudiamos hace un par de capítulos, y que aporta información sobre la ubicación de las colisiones que ha sufrido el character controller. Con esa información, podemos alterar el comportamiento de nuestro character controller cuando sufra una colisión en una zona determinada de su cápsula.

Ampliamos el script anterior, para que quede así:


private var miCharCol : CharacterController;
miCharCol = GetComponent(CharacterController);
private var direccion : Vector3 = Vector3.right;

function Update() {
var misGolpes : CollisionFlags = miCharCol.Move(direccion * Time.deltaTime);
if(misGolpes == CollisionFlags.Sides)
{
direccion = Vector3(0,0,-1);
}
}


La esfera empieza su desplazamiento hacia la derecha (que es la dirección inicial que se le asigna a la función Move), hasta que colisiona con el cubo. Al hacerlo, nuestro condicional "if" detecta si la colisión se ha producido en uno de los laterales de la cápsula de nuestro character controller (CollisionFlags.Sides) y, para ese caso, se le pasa un nuevo vector3 a la dirección de la esfera.


SimpleMove:

function SimpleMove (speed : Vector3) : boolean


Podríamos deducir que esta función es similar a la anterior, y así es, pero con algunas peculiaridades. Por ejemplo, si a nuestra esfera le asignamos el siguiente script...


function Update() {
var miCharCol : CharacterController = GetComponent(CharacterController);
miCharCol.SimpleMove(Vector3(1 * Time.deltaTime, 0,0));
}


...podríamos esperar que la esfera se moviera hacia la derecha, pero se da el caso de que a la que presionamos play la esfera atraviesa el suelo y cae.

Esto es porque esta función automáticamente le asigna gravedad al character controller que la llama. Por otro lado, esta función no devuelve información sobre el lugar de contacto en que se ha producido las colisiones.


Y con esto acabamos una nueva clase.

Adiós.

POSTED BY UnityScripts
DISCUSSION 1 Comment

One Response to : 30. CLASE CHARACTERCONTROLLER (y III)

  1. Una observación:

    La función SimpleMove recibe como parámetro la velocidad de movimiento, por lo tanto no se debe multiplicar por Time.deltaTime, a diferencia de la función Move que recibe el delta de movimiento.


    ...a mí no se me cayó la esfera con SimpleMove....

    Saludos!

Leave a Reply

Con la tecnología de Blogger.