Dev (Back & Front)ARTIGO

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

Continuando a série sobre o Unity, o autor mostra como criar um script em C# para movimentar o personagem criado nos artigos anteriores.

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!

Microsoft (MVP), atualmente trabalha como Arquiteto de Software para TV Bandeirantes. Nesses últimos anos, focou nas tecnologias criadas pela Microsoft, mas sempre esteve antenado para as novas tecnologias que estão surgindo no mercado. Em um breve resumo, é uma pessoa apaixonada pelo que faz, tem a sua profissão como hobby.

Ver perfil