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