Mover personagem com Unity 3D

Movimentando personagem com teclas direcionais usando Translate e Rotate.

Os jogos se tornam grande sucesso desde sua criação pelo simples fato do jogador ter interação com o personagem, seja ele uma bola, um soldado e até mesmo lutadores.

Como toda Engine de jogos, é possível se locomover pelo cenário dando vida ao personagem e interação ao Jogador, para fazer esta movimentação, existem N formas, aqui será apresentado duas formas básicas e funcionais.

Para este artigo, será utilizado um cubo, e um cenário básico, veja na imagem abaixo.

Crie um script em C# chamado move, cuidado para não escrever errado, pois se tiver que ser renomeado, terá que alterar na class também, após criar o arquivo, abra com o editor de códigos.

Por padrão o script já é criado com uma Class, dois Métodos e duas bibliotecas.

Código 01:

using UnityEngine;
using System.Collections;

//Classe move.
public class move : MonoBehaviour {

	//Metodo Start e executado uma unica vez, quando o script e executado.
	void Start () {
	
	}

	//Medodo Update e executado a cada Frame
	void Update () {
	
	}
}

Vamos começar criando as variáveis responsável por controlar qual a velocidade que será aplicado as movimentações, para este exemplo utilizaremos três, que é:

Tipo Nome Valor
Float _velocidadeFrente 10
Float _velocidadeTras 5
Float _velocidadeGirar 60

Note que serão necessárias duas várias para controlar a velocidade da frente e a de trás, isto por que a ninguém anda mais rápido para trás, então tem que ter um valor menor. Crie as variáveis e atribua o valor a eles no método Start, conforme mostra o código a seguir.

Código 02:

using UnityEngine;
using System.Collections;

//Classe move.
public class move : MonoBehaviour {

	float _velocidadeFrente;
	float _velocidadeTras;
	float _velocidadeGirar;

	//Metodo Start e executado uma unica vez, quando o script e executado.
	void Start () {
		_velocidadeFrente = 10;
		_velocidadeTras = 5;
		_velocidadeGirar = 60;
	}

	//Medodo Update e executado a cada Frame
	void Update () {
	
	}
}

Para esta movimentação, será utilizado as teclas:

W – Frente.
S – Trás.
A – Rotacionar Esquerda.
D – Rotacionar Direita.

Para saber se uma tecla está pressionada, devemos utilizar a classe Input, ela contém vários métodos que possibilita detectar uma entrada, abaixo uma breve explicação de três métodos.

Método Função
GetKey()

 

Enquanto a tecla especificada estiver sendo pressionada.
GetKeyDown() Quando pressionar a tecla.
GetKEyUp() Quando soltar uma tecla.

Quando utilizado qualquer um dos três métodos, é retornado se a tecla está sendo pressionada (true), então utilizaremos o IF para fazer esta verificação, utilizaremos o método GetKey(), que será acionado se o player estiver com a tecla pressionada.

Para mover o cubo na cena, utilizaremos métodos da classe Transform, que é responsável por controlar a posição, rotação e escala de um objeto, estas informações também aparecem quando você seleciona um objeto na aba Inspector.

A classe Transform possui dois principais métodos que utilizaremos, que são:

Método Função
Translate Permite mover em um eixo como X, Y e Z.
Rotate Permite rotacionar em um eixo como X, Y e Z.

Cuidado quando for chamar a classe Transform, o T deve ser escrito na minúscula, pois com T maiúsculo referência o tipo de uma variável.

Para cada atribuição de variável dentro de um método, será necessário multiplicar o valor da variável por Time.deltaTime, isto faz com que o valor seja passado por segundo e não por quadro. Ainda na atribuição devemos fazer esta multiplicação dentro de (), pois primeiro será feito o cálculo e com o resultado dele a atribuição ao eixo.

Para mover para a esquerda ou direita em um dos eixos será necessário negativa os valores, por exemplo, direita 60 e direita -60.

Veja o algoritmo completo abaixo, em seguida crie e atribuía seu script ao cubo ou seu personagem, por fim, execute seu jogo.

Código 03:

using UnityEngine;
using System.Collections;

//Classe move.
public class move : MonoBehaviour {

	float _velocidadeFrente;
	float _velocidadeTras;
	float _velocidadeGirar;

	//Metodo Start e executado uma unica vez, quando o script e executado.
	void Start () {
		_velocidadeFrente = 10;
		_velocidadeTras = 5;
		_velocidadeGirar = 60;
	}

	//Medodo Update e executado a cada Frame
	void Update () {
		if(Input.GetKey ("w")){
			transform.Translate(0, 0, (_velocidadeFrente * Time.deltaTime));
		}

		if(Input.GetKey ("s")){
			transform.Translate(0, 0, (-_velocidadeTras * Time.deltaTime));
		}

		if(Input.GetKey ("a")){
			transform.Rotate(0,(-_velocidadeGirar * Time.deltaTime), 0);
		}
		
		if(Input.GetKey ("d")){
			transform.Rotate(0,(_velocidadeGirar * Time.deltaTime), 0);
		}
	}
}

Existe uma outra forma, que é a mais recomendada, ela detecta automaticamente se um eixo foi pressionado, tanto as teclas W, S, A, D, quanto os direcionais e até mesmo um Joystick, para isto, basta utilizar o Método GetAxis, ele pode assumir vários valores, Vertical e Horizontal.

Utilizando o GetAxis, não é necessário utilizar o IF e sim apenas fazer a multiplicação do valor retornado pelo GetAxis pelo valor que se deseja mover e por último o resultado por Time.deltaTime. Este método retorna 1 e – 1, ou seja, ele atribui valores negativos quando necessitamos se mover para trás.

Veja com a utilização do GetAxis(), o código ficou bem menor o resultado também.

Código 04:

using UnityEngine;
using System.Collections;

public class moveAxis : MonoBehaviour {

	float _velocidade;
	float _girar;

	void Start () {
		_velocidade = 20.0F;
		_girar = 60.0F;
	}
	
	// Update is called once per frame
	void Update () {
		float translate = (Input.GetAxis ("Vertical") * _velocidade) * Time.deltaTime;
		float rotate = (Input.GetAxis ("Horizontal") * _girar) * Time.deltaTime;

		transform.Translate (0, 0, translate);
		transform.Rotate (0, rotate, 0);
	}
}

Com o conhecimento apresentado neste artigo, você já está apto a fazer movimentações de seus personagens, basta sincronizar a movimentação com a animação.

Veja o vídeo de como o game se comporta quando utilizamos o GetAxis().

Você pode alterar qual tecla corresponde a um eixo, para isto basta acessar o menu Edit, Project Settings, Input.

Espero que tenham aprendido, Até a próxima!