[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

Teclado: Identificando teclas pressionadas

E aí galera, beleza?

Identificar quando o jogador pressionou uma tecla específica do teclado é uma das tarefas mais comuns para jogos de computador e isso pode ser feito de uma forma bem fácil utilizando a classe Input da Unity.
A classe Input foi criada para facilitar a interação com os mais diversos dispositivos de entrada (input), como teclado, mouse, controles e telas sensíveis ao toque, por isso, ela possui um conjunto de métodos bem interessantes para nos ajudar nessa interação.

Input.GetKey

Um desses métodos é o GetKey. O Input.GetKey identifica se uma tecla está sendo pressionada.

using UnityEngine;

public class InputTeclado : MonoBehaviour {

    public void Update() {
        if (Input.GetKey(KeyCode.A)) {
            // Esta mensagem será exibida durante todos os
            // próximos frames, enquanto a tecla estiver pressionada
            Debug.Log("A tecla A está pressionada.");
        }
    }

}

O método GetKey retorna true (está sendo pressionada) ou false (não está sendo pressionada) para nos ajudar a identificar o estado atual de uma tecla específica. A partir do momento em que a tecla é pressionada, o método GetKey retornará true, indicando que a tecla está sendo pressionada, em todos os frames subsequentes, até que a tecla deixe de ser pressionada. Somente quando a tecla não estiver sendo pressionada, o método GetKey retornará false. Dessa forma, essa abordagem pode ser utilizada para mover um objeto enquanto uma tecla esteja pressionada.

Input.GetKeyDown

Identifica se uma tecla foi pressionada.

using UnityEngine;

public class InputTeclado : MonoBehaviour {

    public void Update() {
        if (Input.GetKeyDown(KeyCode.A)) {
            // Esta mensagem será exibida somente UMA VEZ,
            // no frame em que a tecla foi pressionada.
            Debug.Log("A tecla A foi pressionada neste frame.");
        }
    }

}


O método GetKeyDown retorna true (foi pressionada) ou false (não foi pressionada) de forma semelhante ao GetKey. A principal diferença entre esses dois método é que o GetKey retornará true, indicando que a tecla está sendo pressionada , durante todo o período em que o jogador pressionar e segurar a tecla. Por sua vez, o GetKeyDown retornará true, indicando que a tecla foi pressionada, somente no primeiro frame em que isso aconteceu, ou seja, caso o jogador pressione e segure a tecla, o método GetKeyDown retornará true apenas uma vez, indicando o momento exato em que a tecla foi pressionada. Dessa forma, para movimentar um personagem com essa abordagem, será necessário que o jogador repetida a ação de pressionar e soltar a tecla, para cada vez que quiser mover o personagem.

Assim como é possível utilizar o GetKeyDown para saber o momento em que um tecla começou a ser pressionada, também podemos utilizar o GetKeyUp para saber quando esta mesma tecla deixou de ser pressionada.

Input.GetKeyUp

Identifica se uma tecla foi pressionada.

using UnityEngine;

public class InputTeclado : MonoBehaviour {

    public void Update() {
        if (Input.GetKeyUp(KeyCode.A)) {
            // Esta mensagem será exibida somente UMA VEZ,
            // no frame em que a tecla deixou de ser pressionada.
            Debug.Log("A tecla A deixou de ser pressionada neste frame.");
        }
    }

}

O método GetKeyUp retornará true somente no frame em que a tecla deixou de ser pressionada e retornará false em todos os demais frames. Dessa forma, utilizando o GetKeyDown e o GetKeyUp em conjunto, conseguimos obter um comportamento similar ao do GetKey, como mostra o exemplo abaixo:


using UnityEngine;

public class InputTeclado : MonoBehaviour {

    // Identifica se a tecla A está ou não pressionada
    private bool teclaPressionada;

    public void Start() {
        this.teclaPressionada = false;
    }

    public void Update() {
        if (Input.GetKeyDown(KeyCode.A)) {
            // Marca a tecla como pressionada
            this.teclaPressionada = true;
        } else if (Input.GetKeyUp(KeyCode.A)) {
            // Marca a tecla como não pressionada
            this.teclaPressionada = false;
        }

        if (this.teclaPressionada) {
            // Esta mensagem será exibida durante todos os
            // próximos frames, enquanto a tecla estiver pressionada
            Debug.Log("A tecla A está pressionada.");
        }
    }

}


E se eu quiser executar uma ação enquanto uma tecla específica não for pressionada?
Para esses casos, basta inverter o valor retornado pelo GetKey, da seguinte forma:

using UnityEngine;

public class InputTeclado : MonoBehaviour {

    public void Update() {
        if (Input.GetKey(KeyCode.A) == false) {
            // Esta mensagem será exibida durante todos os
            // próximos frames, enquanto a tecla NÃO estiver pressionada
            Debug.Log("A tecla A NÃO está pressionada.");
        }
    }

}


Resumindo:
GetKey informa se a tecla está ou não pressionada.
GetKeyDown informa em qual frame a tecla começou a ser pressionada
GetKeyUp informa em qual frame a tecla deixou de ser pressionada

A utilização dos métodos GetKey, GetKeyDown e GetKeyUp pode ser realizada com conjunto com a classe KeyCode, que contém um lista de todas as teclas disponíveis no teclado.


Gostou? 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