29. CLASE CHARACTERCONTROLLER (II)









radius:

var radius : float


El radio de la cápsula del character controller.


height:

var height : float


La altura de la cápsula del character controller.


center:

var center : Vector3


El centro de la cápsula del character relativo a la posición del transform.


slopeLimit:

var slopeLimit : float


El límite de pendiente en grados por el que puede ascender nuestro character controller.

Vamos a probar esta variable. Sigue estos pasos:

1.- Seleccionamos el cubo y lo desplazamos a la derecha (transform.x = 3, por
ejemplo)
2.- Vamos al menú=>GameObject=>create other=>Cube.
3.- En el apartado transform, le damos al nuevo cube estos valores:
position = 0,2,0
rotation = 0,0,315
scale = 0.2,7,1

Nos debería haber quedado algo así:



Vale, ahora tenemos una pasarela con una inclinación de 45 grados (360-315), por lo tanto, que nuestra esfera la pueda subir o no depende del valor que le demos a slopeLimit. Así, si tecleamos:

function Update () {
var controller : CharacterController = GetComponent(CharacterController);
controller.slopeLimit = 46.0;
controller.Move(Vector3(1,0,0));
}


Nuestra esfera sí ascenderá por la rampa, ya que el grado de inclinación de esta es inferior al que puede asumir nuestro character controller. Pero le asignamos a slopeLimit el valor 45.0. observaremos que ya la esfera se niega a subir.


stepOffset:

var stepOffset : float


Los límites de altura que el character controller podrá superar, fijados en metros.(no podrá por ejemplo subir una escalera si cada escalón mide más de ese límite)

Para trabajar con un ejemplo, vamos a seleccionar el gameobject que nos sirvió como rampa en el ejemplo anterior. Le establecemos estos valores:
position: 0,0,0
rotation: 0,0,90
scale: 0.6,3,1

Por otro lado, a nuestro cubo le vamos a aumentar momentáneamente la altura (scale.y = 4).

Y tecleamos el siguiente código para nuestra esfera:

function Update () {
var controller : CharacterController = GetComponent(CharacterController);
controller.stepOffset = 0.3;
controller.Move(Vector3(1,0,0));
}


Tomemos nota de que la antigua rampa tiene una altura de 0.6. En cambio, a nuestro character controller le hemos limitado la capacidad de superar alturas mayores de 0.3, por lo que cuando le demos al play...la esfera topará con la rampa. En cambio, si variamos el valor de stepOffset y lo colocamos, por ejemplo, a 0.9, la esfera no tendrá problemas en superar la rampa, aunque tras hacerlo topará con el cubo.

Por experiencia personal, las mediciones de esta variable no siempre resulta exactas, ya que no todos los gameobjects se asientan completamente y de manera exacta sobre el suelo, o éste presenta desniveles. Para evitar este tipo de inexactitudes es necesario probar el comportamiento de los objetos y modificar stepOffsset en consecuencia, hasta dar con el comportamiento adecuado.

Borramos la rampa y devolvemos al cubo a sus dimensiones habituales y a su posición 0,0,0.


detectCollisions:

var detectCollisions : boolean


Determina si otros rigidbodies o character controllers colisionan con nuestro character Controller (por defecto esto está siempre habilitado).

Esta variable no afecta a las colisiones que nuestro character controller sufre cuando se mueve, sino las que sufre a raíz del movimiento de otros character controllers o colliders, y en concreto a si esos colliders o character controllers entrantes deben ser bloqueados por nuestro controller.

Para este ejemplo tenemos que escribir dos scripts. Abrimos MiPrimerScript, que deberíamos tener vinculado a nuestra esfera, y tecleamos:

function Update () {
var controller : CharacterController = GetComponent(CharacterController);
controller.detectCollisions = false;
}


Aquí meramente le decimos a nuestro character controller que no queremos que bloquee los colliders entrantes. Y ahora abrimos MiSegundoScript y escribimos:

function FixedUpdate() {
rigidbody.AddForce(-10,0,0);
}


Le asignamos este segundo script al cubo, de tal forma que se desplazará hacia la izquierda, hasta colisionar con la esfera. Es preferible colocar la escena en vista superior (eje Y del gizmo). Le damos al play.

Y tal como era de esperar, nuestra esfera no bloquea al cubo. Eso sí, si lo hubiéramos hecho al revés (mover la esfera hacia el cubo) aunque la variable detectCollisions estuviera en false, se produciría la colisión y el consiguiente bloqueo.


Y en la próxima lección vamos a por las funciones de esta clase.

POSTED BY UnityScripts
DISCUSSION 0 Comments

Leave a Reply

Con la tecnología de Blogger.