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!
Transform: http://docs.unity3d.com/ScriptReference/Transform.html.
Transform.Translate: http://docs.unity3d.com/ScriptReference/Transform.Translate.html.
Time.deltaTime: http://docs.unity3d.com/ScriptReference/Time-deltaTime.html.
Input: http://docs.unity3d.com/ScriptReference/Input.html.
Input.GetAxis: http://docs.unity3d.com/ScriptReference/Input.GetAxis.html.