[POO] Herança na Unity

Herança é um conceito do paradigma de programação conhecido como Programação Orientada a Objetos , que tem como objetivo construir e trabalhar com abstrações de objetos do mundo real, em um nível de código. A Herança dá a capacidade de uma classe/objeto herdar comportamentos previamente definidos em outra classe, sem a necessidade de duplicação do código, permitindo a extensão e a sobrescrita de comportamentos já existentes, de acordo com a necessidade do novo objeto/classe. Para definir uma relação de herança no C#, a "palavra" reservada : (dois pontos) deve ser utilizada na definição da classe que estamos criando, indicando de qual outra classe o nosso script deve herdar. public class Jogador : MonoBehaviour { // Classe Jogador que herda da classe MonoBehaviour } Por padrão, todos os scripts criados na Unity herdam de MonoBehaviour, que é a classe base da Unity para Scripts que serão associados aos GameObjects do jogo. Embora essa definição de herança

GetComponent - Obtendo a referência para outros componentes do GameObject

O editor da Unity é um ferramenta poderosa para auxiliar na configuração do jogo, podendo ser utilizado até para associar valores de variáveis públicas (ou marcadas com SerializeField) que estejam disponíveis na aba Inspector.

Por ser de fácil uso, muitos desenvolvedores acabam sempre utilizando este recurso para associar valores em suas variáveis, arrastando o componente de um objeto para a variável definida em outro script. Um exemplo comum é a criação de um Script para a movimentação de um objeto, por exemplo o jogador, onde essa movimentação será realizada com física, através do Rigidbody.

using UnityEngine;

public class Jogador : MonoBehaviour {

    public Rigidbody2D rigidbody2d;

}

Partindo do script de exemplo acima, com o nosso script contendo uma variável pública do tipo Ridigbody2D, nós precisamos associar o componente Rigidbody2D, que deve estar presente em nosso objeto, na variável de mesmo nome (rigidbody2d) para que possamos utilizá-la no nosso código, conforme pode ser visto na imagem abaixo:

Rigidbody2D sendo associado ao script do jogador através do Editor da Unity

Arrastar o Rigidbody (ou o objeto todo) para a variável é a forma mais simples e comum de fazer essa associação. Mas você sabia que é possível fazer isso diretamente pelo seu código, sem precisar arrastar nenhum objeto na Unity?

O MonoBehavour, script base de todos os scripts que criamos na Unity, possui um método chamado GetComponent que permite ao nosso script obter a referência para qualquer componente (Scripts, Rigidbody, SpriteRenderer, Colliders e etc.) que esteja associado ao mesmo GameObject onde o nosso script foi adicionado.

O exemplo de código abaixo mostra um script Jogador contendo três variáveis (rigidbody2d, spriteRenderer e circleCollider2d) que são privadas, ou seja, não estarão visualmente disponíveis para edição no Editor/Inspector da Unity.

using UnityEngine;

public class Jogador : MonoBehaviour {

    private Rigidbody2D rigidbody2d;
    private SpriteRenderer spriteRenderer;
    private CircleCollider2D circleCollider2d;


    public void Start() {
        // Obtém a referência para os componentes automaticamente,
        // após iniciar o script, sem precisar arrastar os componentes
        // no Editor da Unity
        this.rigidbody2d = GetComponent<Rigidbody2D>();
        this.spriteRenderer = GetComponent<SpriteRenderer>();
        this.circleCollider2d = GetComponent<CircleCollider2D>();
    }

}

Por não estarem disponíveis através do editor da Unity, toda a associação entre os componentes contidos no GameObject (imagem abaixo) e as variáveis definidas em nossos scripts, é realizada através do método GetComponent, que busca automaticamente por componentes com os tipos especificados em nosso código (Rigidbody2D, SpriteRenderer e CircleCollider2D) que estejam associados ao mesmo GameObject que o script Jogador e cria a conexão entre as variáveis e os componentes, para que os componentes possam ser utilizados durante a execução do jogador.

Script Jogador no Inspector, sem a necessidade de variáveis públicas para associar componentes

A utilização de variáveis públicas (ou marcadas com SerializeField) tem como vantagem a facilidade de associação entre as variáveis e componentes, assim como a clareza na identificação de quais componentes são necessários para o funcionamento do script/objeto, sem a necessidade de consultar o código desenvolvido. Por outro lado, a utilização do GetComponent reduz a chance de inicializarmos o nosso jogo com associações de variáveis pendentes, fazendo com que o jogo não funcione corretamente.

É claro que para o bom funcionamento do método GetComponent, os componentes necessários já precisam ter sido adicionados previamente, fazendo com que falhas na configuração dos objetos ainda possam ocorrer. A boa notícia é que também existem forma de mitigar essas falhas e facilitar ainda mais a configuração de nossos GameObject e nós vamos falar disso em breve, em outro post. ;)


Gostou do método GetComponent ou tem dúvida sobre o seu funcionando? Comenta aí!

Comentários

Postagens mais visitadas deste blog

Transição de Fases (navegação entre Cenas) na Unity

[POO] Herança na Unity