[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

SerializeField - Serializando variáveis privadas e protegidas

Declarar variáveis como públicas (public) em nossos scripts é uma forma prática de permitir que os valores dessas variáveis sejam definidos/editados através da Unity, mas do ponto de vista da Programação Orientada a Objetos e principalmente do princípio do Encapsulamento, essa abordagem de variáveis públicas deixa de ser tão encorajada.

using UnityEngine;

public class Jogador : MonoBehaviour {

    public string nome;
    public int vidas;
    public float velocidadeMovimentacao;
    public bool invulneravel;

    public Rigidbody2D rigidbody2d;
    public Collider2D collider2d;
    public SpriteRenderer spriteRenderer;

}

Unity inspector contendo as variáveis públicas do jogador automaticamente serializadas


Tornar as variáveis privadas e/ou protegidas para controlar o acesso aos atributos de um script é uma abordagem recomendada pelo princípio do Encapsulamento e pode ser feita de forma simples, alterando o modificador de acesso das nossas variáveis, como pode ser visto na imagem abaixo.

using UnityEngine;

public class Jogador : MonoBehaviour {

    private string nome;
    private int vidas;
    private float velocidadeMovimentacao;
    private bool invulneravel;

    protected Rigidbody2D rigidbody2d;
    protected Collider2D collider2d;
    protected SpriteRenderer spriteRenderer;

}

Ao realizar essa alteração, todas as nossas variáveis marcadas como privadas (private) ou protegidas (protected) deixam de ser serializadas pela Unity e consequentemente deixam de ser exibidas no inspector, impedindo que nossas variáveis possam ser configuradas através do Unity Editor

Unity inspector exibindo script Jogador sem variáveis serializadas


Felizmente, existe uma abordagem que permite encapsular nossas variáveis, tornando elas privadas (private) ou protegidas (protected), e ainda manter os valores delas disponíveis para serem definidos/alterados através do editor da Unity. Sabia dessa?

Para fazer isso, a Unity disponibiliza um atributo chamado SerializeField que permite marcar variáveis que devem ser serializadas pelo Editor da Unity, mesmo que elas sejam privadas ou protegidas.

using UnityEngine;

public class Jogador : MonoBehaviour {

    [SerializeField]
    private string nome;

    [SerializeField]
    private int vidas;

    [SerializeField]
    private float velocidadeMovimentacao;

    [SerializeField]
    private bool invulneravel;


    [SerializeField]
    protected Rigidbody2D rigidbody2d;

    [SerializeField]
    protected Collider2D collider2d;

    [SerializeField]
    protected SpriteRenderer spriteRenderer;

}

Ao serializar uma variável com o atributo SerializeField estamos dizendo para a Unity que o valor dessa variável deverá ser salvo (serializado) pelo Editor da Unity e recuperado (deserializado) quando precisar ser utilizado/exibido. Esse processo de serialização/deserialização acontece sempre que o valor é alterado no editor da Unity, quando o valor precisa ser exibido no editor e quando o jogo é iniciado, definindo o valor da nossa variável durante o processo de inicialização do nosso script.

Unity inspector contendo as variáveis privadas (private) e protegidas (protected) serializadas


Dessa forma, nosso código consegue seguir o princípio do Encapsulamento, permitindo que nossas variáveis sejam protegidas de acessos indevidos/indesejados, sem deixar de aproveitar a flexibilidade do editor da Unity para a configuração dos nossos scripts.


Gostou do atributo SerializeField ou tem dúvida sobre o que é Encapsulamento e quais as duas vantagens? Comenta aí!

Comentários

Postagens mais visitadas deste blog

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

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

[POO] Herança na Unity