Desenvolvimento

21 jun, 2018

Unity: introdução a programação orientada a objetos (POO) com C#

Publicidade

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:

Criação de um script c# no Unity 3D

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:

Exemplo de script c# (Unity 3D)

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!