Introdução
Dando continuidade a minha série de artigos sobre Unity, hoje irei mostrar como criar um script em C# para movimentar o nosso personagem. Caso tenha interesse em ler os primeiros artigos desta série, segue o link de cada um deles abaixo:
O primeiro passo será abrir o projeto desenvolvido no último artigo e criar o um novo arquivo dentro da pasta scripts. Para isso, clique com o botão direito do seu mouse na pasta scripts, em seguida clique em create -> C# Script. Eu darei o nome de Player, mas você pode escolher um outro nome de sua preferência. A imagem abaixo demonstra esse passo:
Agora dê dois cliques no arquivo Player.cs para abrir ele na sua IDE. Abaixo você tem uma imagem demonstrando esse arquivo aberto no Mono Develop:
Passando rapidamente pelo arquivo acima, você tem:
Uma classe chamada Player
Dois métodos: o Start, que funciona como um construtor e o Update, que é chamado a cada frame do seu jogo
Mas falando de POO, o que seria uma classe?
Antes de entrar mais a fundo nesse assunto, vamos conhecer um pouco mais sobre Orientação a Objetos.
Orientação a Objetos
A Orientação a objetos é uma maneira de programar que ajuda na organização do nosso código e resolve muitos problemas enfrentados pela programação procedural.
Saindo um pouco do mundo dos games e pensando em um exemplo do nosso dia dia, imagine aquele problema clássico de validação de um CPF. Normalmente, nós temos um formulário que recebe os dados de um campo e envia esses dados para uma função validar. Abaixo, você tem um exemplo demonstrando esse fluxo:
cpf = formulário -> input[preencha o seu cpf] backend -> function -> valida(cpf)
Agora imagine que você tem essa função em 4 ou até 6 lugares no seu código, e toda vez que precisa fazer uma alteração, precisa lembrar de todos os lugares que implementou esse método no seu código para atualizar.
Esse foi um dos problemas que a POO veio resolver. Pensando no exemplo anterior, poderíamos resolver criando uma classe Pessoa ou Cliente (algo que traga a sua estrutura para o mundo real) com um método valida CPF. Abaixo, você tem um exemplo demonstrando esse passo:
public class Pessoa { private string cpf; public void validaCpf(string cpf) { //regras } }
Analisando o código acima, você tem:
- Uma classe chamada Pessoa
- Uma propriedade chamada cpf (elementos que uma classe precisa)
- Um método (uma ação) chamada ValidaCpf
Agora você pode centralizar as suas regras de validação de cpf nessa classe e instanciar ela em todos os outros locais. Irei abordar instancia nos próximos artigos.
Voltando ao nosso game, nós criamos uma classe chamada Player. Vamos agora criar as propriedades e os métodos necessários para que o nosso personagem possa se movimentar em cima da plataforma. Para isso, atualize a sua classe com o trecho de código abaixo:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { public float velocidade; public float forcaPulo; private bool verificaChao; public Transform chaoVerificador; // Use this for initialization void Start() { } // Update is called once per frame void Update() { Movimentacao(); } void Movimentacao() { verificaChao = Physics2D.Linecast(transform.position, chaoVerificador.position, 1 << LayerMask.NameToLayer("Chao")); if (Input.GetAxisRaw("Horizontal") > 0) { transform.Translate(Vector2.right * velocidade * Time.deltaTime); transform.eulerAngles = new Vector2(0, 0); } if (Input.GetAxisRaw("Horizontal") < 0) { transform.Translate(Vector2.right * velocidade * Time.deltaTime); transform.eulerAngles = new Vector2(0, 180); } if (Input.GetButtonDown("Jump") && verificaChao) { GetComponent<Rigidbody2D>().AddForce(transform.up * forcaPulo); } } }
Analisando o código acima, você tem:
Quatro propriedades, sendo elas: três publicas e uma privada.
Voltando a programação em C#, esses atributos são chamados de moderadores de acesso. Abaixo você tem uma breve descrição deles:
- public: aberto para todos. Isso permite que a sua propriedade, método ou classe seja utilizada em qualquer parte do seu código
- protect: permite que a classe mãe e as filhas tenham acesso ao seu código com esse moderador
- private: fica restrito ao escopo da classe mãe
Analisando o nosso código, você tem: velocidade, forcaPulo e chaoVerificador com o moderador public, podendo ser acessados de qualquer parte do código e verificaChao com o moderador private, ficando restrita ao escopo da classe mãe.
Voltando à nossa classe Player, eu criei um método chamado Movimentação. Nele, você tem:
- Na linha 29: Uma variável chamada verificachao, que está recebendo um boolean da validação entre o personagem (transform.position) e o objeto chaoVerificador (chaoVerificador.position). Se existe algum objeto com o Layer Piso entre os dois, o personagem está no chão, caso contrário ele está no ar. (Quando voltarmos para o Unity essa parte irá ficar mais clara).
- Linha 32: input.GetAxisRaw(“Horizontal”). Esse método retorna 1 quando clicamos na seta para direita e -1 quando clicamos na seta da esquerda.
- Linha 34: transform.Translate, responsável por todas as ações e valores do transform do objeto. Note que eu estou passando para ele a velocidade informada na (variável velocidade + Vector2.Right + Time.deltatime). Dessa forma conseguimos fazer que o jogo seja executado com base na velocidade de processamento de cada computador que ele estiver rodando.
- Linha 44: estou verificando se o usuário pressionou a seta para cima e se ele está no chão (resultado boolean da variável verificaChao), caso o usuário tenha pressionado a seta para cima e esteja no chão, ele irá pular, caso o cenário seja diferente desse, ele permanecerá no chão.
- Linha 46: Como eu passei no meu artigo anterior, o Rigidbody trabalha com física. Tendo isso em mente eu estou passando para ele subir o personagem em y (para cima) utilizando (transform.up * a força) passada para variável forcaPulo.
Bom, com isso nós conseguimos ver um pouco de programação e criar o script que irá fazer o nosso personagem se movimentar. No próximo artigo irei demonstrar como vincular esse script ao nosso objeto Player. Espero que tenham gostado e até o próximo artigo, pessoal!