Na aula 5, vimos brevemente como controlar um objeto. Dessa vez veremos com mais detalhe o movimento de um objeto, usando o Rigidbody, e usaremos um projeto 3D.
Primeiramente, podemos montar o objeto em cena. Usarei uma capsula por se aproximar do formato humanoide. E colocarei nele o collider, o rigidbody sem gravidade e o código de movimento SimpleMove (ainda sem nada escrito nele).
Faremos primeiro o movimento para objetos dinâmicos. Então abra o código e declare os atributos necessários, referência para o Rigidbody, o speed, e a direção, como está abaixo:
Até aqui, nada realmente novo - declaramos variáveis e usamos o GetComponent<>() para acessar o rigidbody da capsula. Como só precisamos fazer isso uma vez, ele roda no Start().
Para fazer o movimento, a melhor forma depende do contexto, no nosso contexto estamos apresentando o Rigidbody, portanto ficaremos com o MovePosition(), um método bem prático que funciona tanto para objetos dinâmicos como para cinemáticos, mas de novo, nem sempre será a melhor opção, e você só saberá qual será a melhor com prática e pesquisa.
De qualquer forma, o MovePosition() movimenta o Rigidbody (o objeto que contém o Rigidbody) recebendo a nova posição como parâmetro (ou seja, temos que usar a fórmula do movimento uniforme para encontrar a próxima posição).
Agora temos algumas coisas a mais. Veja que usamos o direction para mover o objeto nos eixos XZ, isso se deve ao fato de que em 3D os objetos se movem nesses eixos e pulam ao longo do eixo Y, sendo assim, X move o objeto para esquerda e direita, e Z move o objeto para frente ou para trás, e Y move para cima ou para baixo.
No momento já é possível testar o controle do objeto, faça com speed igual a 7.5, aproximadamente. Você pode setar o valor pelo Inspector.
Depois de testar, precisamos corrigir dois detalhes importantes.
Quando lidamos com física e Rigidbody, todas as ações que o envolve devem ser executadas num Update() próprio de física, chamado FixedUpdate(), pois ele executa na frequência de atualização do motor de física. E que fique bem claro, ele serve exclusivamente para lidar com física, e mais nada.
Junto com o FixedUpdate(), precisamos substituir a variável do tempo pelo Time.fixedDeltaTime, que é o intervalo de frames do FixedUpdate().
Para finalizar, coloque um cubo em formato de parede e veja como a capsula bate na parede ao colidir.
O mesmo código pode ser usado para mover objetos com Rigidbody2D, só precisa ser feita a devida conversão (fica como dica de estudo).
Além do Rigidbody, para 3D existe, também, o CharacterController, que particularmente acho muito mais recomendável. Veremos o uso dele em um tutorial, à parte das aulas, quando implementarmos uma mecânica com controle de câmera.