quarta-feira, 7 de setembro de 2011

Movimento avançado de personagens com Character Controller

Se você assistiu os videos anteriores,já percebeu que o script de movimento do personagem usado neles não funciona muito bem.Mas por que?
A resposta é simples,o script apenas muda a posição do objeto enquanto quem cuida das "interações físicas" é o rigidbody e as simulações feitas por esse componente não são muito boas para personagens,então nós devemos usar outro tipo de componente voltado para personagens na unity esse componente se chama Character Controller.
Abra a unity coloque um cubo,um plano e uma luz na cena posicione pra ficar mais ou menos assim:
Ok,agora vamos ao script,crie um novo javascript chame-o de move ou andar ou algo do tipo(é bom colocar nomes que expliquem bem o que o script faz porque quando seu projeto ficar grande você pode se perder nos códigos).Dê dois cliques no script e dentro do editor de códigos cole isso aqui:
var speed : float = 6.0;

var jumpSpeed : float = 8.0;

var gravity : float = 20.0;

var rotspeed:float=3.0;

private var moveDirection : Vector3 = Vector3.zero;



function Update() {

var hor=Input.GetAxis("Horizontal");

var vert=Input.GetAxis("Vertical");

    var controller : CharacterController = GetComponent(CharacterController);

    if (controller.isGrounded) {

       

        moveDirection = Vector3(0, 0,vert);

        moveDirection = transform.TransformDirection(moveDirection);

        moveDirection *= speed;

        transform.Rotate(0,hor*rotspeed,0);

        if (Input.GetButton ("Jump")) {

            moveDirection.y = jumpSpeed;

        }

    }



    

    moveDirection.y -= gravity * Time.deltaTime;

    

    

    controller.Move(moveDirection * Time.deltaTime);

}

@script RequireComponent(CharacterController)
Arraste o script para o cubo,bote o jogo pra tocar e brinque um pouco,como você pode ver esse script esta pronto para ser usado em qualquer tipo de jogo de plataforma 3d(Mario 64) a TPS(Gears of War).Agora vamos a explicação desse código:
var jumpSpeed : float = 8.0;

var gravity : float = 20.0;

var rotspeed:float=3.0;
Essas variáveis indicam a velocidade do pulo(jumpSpeed) a gravidade(gravity) e a velocidade de rotação(rotspeed).
private var moveDirection : Vector3 = Vector3.zero;
Essa variável indica a direção do movimento do player.
var hor=Input.GetAxis("Horizontal");

var vert=Input.GetAxis("Vertical");

var controller : CharacterController = GetComponent(CharacterController);
Aqui temos uma variável para representar o eixo horizontal do teclado , outra para representar o eixo vertical e mais uma para representar o componente Character Controller.
if (controller.isGrounded) {
 moveDirection = Vector3(0, 0,vert);

        moveDirection = transform.TransformDirection(moveDirection);

        moveDirection *= speed;

        transform.Rotate(0,hor*rotspeed,0);

        if (Input.GetButton ("Jump")) {

            moveDirection.y = jumpSpeed;

        }

    }
Esse if (controller.isGrounded) quer dizer se o personagem estiver no chão,colocamos a direção dele para ser guiada no eixo z pelo vertical do teclado.O moveDirection *= speed multiplica o moveDirection para ter velocidade. transform.Rotate(0,hor*rotspeed,0) faz a rotação de player multiplicando pela velocidade de rotação.O if (Input.GetButton ("Jump")) serve para mudar o eixo y para a velocidade de pulo(jumpSpeed).moveDirection.y -= gravity * Time.deltaTime Faz a gravidade cuidar da altura do player(caso ele não esteja no chão).@script RequireComponent(CharacterController) Coloca um Character Controller no objeto.
Referencias
Character Controller
Time.deltaTime

Bom jogo e até a próxima!
Aqui você pode ver a cena que eu fiz com esse script

Nenhum comentário:

Postar um comentário