Movimento do Jogador
·Adicionando movimento ao jogador
Adicionando física
Colisão
Antes de adicionar a física, os objetos precisam ser capazes de interagir entre si, para isso os daremos um corpo físico
Corpo físico
- Selecione o seu objeto player
- Clique na opção “add component”
- Procure pela opção “Rigidbody 2D”
Esse componente permite modificar a gravidade, atrito, resistência do ar e outros parâmetros.
Colisões
Caixas de colisão definem o formato do corpo físico dos objetos, devem ser adicionadas tanto ao jogador como ao chão
- Vá nas características do objeto novamente
- Adicione um componente
- Procure por “Box Collider 2D”
-
Clique para editar a caixa de colisão
- Tente deixar a caixa de colisão o mais próximo o possível do formato dos objetos
Ao rodar o jogo agora, o player terá gravidade e colidirá com o chão a cair, porém, ainda não temos controle sobre ele
Movimento por transform
Existem algumas formas de adicionar movimento ao jogador, a mais símples é utilizando o componente transform dos objetos, que dita sua posição dentro do jogo
Script
- Para criar um script, adicione um componente ao player com um nome original (ex.: “PlayerMovimentation”) e clique em New Script
- Abra o script recém criado
- Os scripts Unity vem com funções especificas do Unity. Sendo elas:
void Start()
Tudo dentro desta função irá rodar uma única vez quando o objeto for criado (ou quando a cena for carregada)
void Update()
Tudo dentro desta função irá rodar continuamente todo frame que o objeto estiver ativo
- Dentro de Update(), Insirá o seguinte código
void Update()
{
transform.position += Vector3.right; // Move o player para a direita
}
⚠ Sempre salve quaisquer alterações feitas em scripts
Ao rodar o jogo, você deverá ver o player ir para a direita extremamente rápido, para controlar sua velocidade, podemos fazer a seguinte mudança
void Update()
{
transform.position += speed * Vector3.right; // Move o player para a direita com velocidade controlada
}
E defina a variável speed como um float(número real) no início do script
public class PlayerMovimentation : MonoBehaviour
{
public float speed = 0.1f; //velociade = 0.1
.
.
.
}
Variáveis definidas com “public” podem ser acessadas diretamente pelo editor Unity
Inputs
- No canto superior esquerdo, clique em edit > Project Settings
- Na nova janela aberta, clique em Input Manager > Axes > Horizontal
- Defina os botões negativo e positivo com as teclas que quiser usar para mover o player para a esquerda e para a direita, respectivamente
Para permitir que o player seja controlado pelo teclado, fazemos essa modificação dentro de Update()
void Update()
{
var inputX = Input.GetAxis("Horizontal");
// inputX = -1 se o player apertar o botão para mover para a esquerda
// = 1 para a direita
// = 0 se nenhum dos dois estiver sendo apertad
transform.position += inputX * speed * Vector3.right; // Move o player horizontamente quando o botao de movimento estiver pressionado
}
Movimento por Rigidbody2D
Outra maneira de fazer a movimentação do jogador é utilizando seu componente Rigidbody2D, que dita sua velocidade
Para poder interagir com o Rigidbody2D dentro do script, precisamos primeiro defini-lo como um componente da nossa classe
- Declare um novo componente público de tipo Rigidbody2D
public class PlayerMovimentation : MonoBehaviour { public Rigidbody2D myrigidbody; // Cria uma variável que vai guardar as propiedades do componente RigidBody public float maxSpeed = 1f; // velociade maxima . . . }
- Dentro de Start(), escreva a seguinte linha
void Start() { myrigidbody = GetComponent<RigidBody2D>(); // variavel é inicializada quando o jogo começa }
-
Depois de salvar o script, no Unity você verá uma nova variável no componente script do jogador com um valor “None”. Para arrumar isso, clique e segure o RigidBody2D do jogador e leve-o até aquela caixa.
- Para movimentar o jogador através do Rigidbody2D, escreva o seguinte código em Update()
void Update() { var inputX = Input.GetAxis("Horizontal"); // inputX = -1 se o player apertar o botão para mover para a esquerda // = 1 para a direita // = 0 se nenhum dos dois estiver sendo apertad myrigidbody.velocity = new Vector2(inputX * maxSpeed, myrigidbody.velocity.y); // Atualiza o player horizontalmente todo frame }
Pulo
Para permitir que o player pule, ao invés de atualizar sua velocidade vertical todo frame como para o movimento horizontal, verificaremos primeiro SE o player está apertando o botão de pulo
-
Dentro de Project Settings > Input Manager, vá em Jump e defina o botão positivo assim como feito anteriormente. (escreva “space” caso queira utilizar a barra de espaço)
-
Dentro de Update(), adicione o seguinte código
void Update() { var x = Input.GetAxis("Horizontal"); myrigidbody.velocity = new Vector2(x*speed, myrigidbody.velocity.y); // Atualiza o player horizontalmente todo frame //Entra na condição enquanto o batão de "Jump" estiver pressionado if (Input.GetButton("Jump")) { Debug.Log("Você Pulou!"); // Escreve "Você Pulou!" no console } }
Quando apertarmos o botão de pulo, uma mensagem aparecerá no console de debug
- Dentro da condição if, insira o seguinte código
void Update() { var inputX = Input.GetAxis("Horizontal"); myrigidbody.velocity = new Vector2(inputX * maxSpeed, myrigidbody.velocity.y); // Atualiza o player horizontalmente todo frame //Entra na condição enquanto o batão de "Jump" estiver pressionado if (Input.GetButton("Jump")) { Debug.Log("Você Pulou!"); // Escreve "Você Pulou!" no console myrigidbody.velocity += Vector2.up * jumpSpeed; // Acelera o player para cima todo frame } }
E declare a variável jumpSpeed no início da classe
public class PlayerMovimentation : MonoBehaviour { public float speed = 0.1f; // velocidade horizontal = 0.1 public float jumpspeed = 0.5f; // velociade do pulo = 0.5 public Rigidbody2D rigidBody; // cria objeto RigidBody2D . . . }
- O player agora estará pulando, entretanto, como não foi posto um limite, o player ficará pulando eternamente enquanto a barra de espaço estiver pressionada
- Para limitar seu pulo para 1 vamos criar:
- Um variável tipo booleana, iniciamenlte falsa
bool isJumping = false;
- Adicionar uma segunda condição no if em que: Para entrar na condição a barra de espaço deve estar pressionada E isJumping seja falso
- Dentro da condição if vamos tornar isJumping verdadeiro para que a condição não pule mais de uma vez
if (Input.GetButtonDown("Jump") && !isJumping) { isJumping = true; }
- Criar uma função para quando ocorrer colisão, e usar-lá para tornar isJumping falso
private void OnCollisionEnter2D (Collision2D other) { isJumping = false; }
- Um variável tipo booleana, iniciamenlte falsa
- O resultado final deve ficar assim
void Update(){ var x = Input.GetAxis("Horizontal"); rigidBody.velocity = new Vector2(x*speed, rigidBody.velocity.y); // todo frame a velocidade do rigidbody= velocidade horizontal, velociade vertical permanece a mesma // Entre na condição quando apertar a barra de espaço E isJumping = false if (Input.GetButtonDown("Jump") && !isJumping) { Debug.Log("Jump"); // Quando pular escreve "Jump" no Debug Log rigidBody.velocity = new Vector2(rigidBody.velocity.x, jumpSpeed); // mantemos a velocidade horizontal e alteramos a vertical isJumping = true; } } private void OnCollisionEnter2D (Collision2D other) // Função chamada quando player entra em colisão { isJumping = false; }