Usando Delegate C# | Unity
Neste artigo, será apresentado o conceito de delegate e como chama-lo. Para isso,vamos contextualizar os conceitos por meio de exemplos práticos usando a Unity. Então, leia o conteúdo primeiro, e depois assista ao vídeo para melhor compreensão.
O que é Delegate?
O delegate é um elemento da linguagem C# o qual permite fazer referência a um método de forma segura. Existe uma grande semelhança de um ponteiro de função em C e C++. Entretanto, o delegate são orientados a objetos, e geralmente são mais utilizados no uso de eventos e permitem maior flexibilidade, tenha isso em mente. De forma resumida, delegate irá guardar o endereço de memória de um método. Nesse sentido, ao usar a classe delegate, será possível inicializar, remover, adicionar e invocar delegates.
A definição do delegate é composta por:
[modificador de acesso] [delegate][tipo de retorno] [nome do delegate]
Dessa forma, veja os exemplos a seguir usando a sintaxe em c#
public delegate void AtacarDelegate(); public delegate float AtacarDelegate(); public delegate float AtacarDelegate(float value);
[Código 1] – Definições de delegate
No exemplo do código 1, na primeira linha, foi definido um delegate com o nome de Atacar Delegate, o qual pode apontar para qualquer método que não receba nenhum argumento e tem como retorno o tipo void. Para a sintaxe da linha 2, o delegate pode apontar apenas para métodos que retornam um tipo float e não possuam nenhum argumento. Para o último exemplo, o delegate pode apontar apenas para métodos que retornam float e passa um argumento do tipo float. Caso, os métodos sejam diferentes das definições do delegate, será gerado um erro.
Agora que você aprendeu a definir um delegate, podemos criar uma variável que deverá instanciar a classe e um método que deverá ter a mesma assinatura.
Vamos para o exemplo para elucidar essa questão. Então vamos, utilizar o delegate da primeira linha, onde não retorna valor e não possui nem um parâmetro
public class ExemploDelegate : MonoBehaviour { public delegate void AtacarDelegate(); // variavel do tipo AtacarDelegate AtacarDelegate atacarDelegate; //Criando método para o delegate private void HandleFire() { Debug.Log("Executou o atacar com arma"); } // Start is called before the first frame update void Start() { // instanciando o delegate atacarDelegate = HandleFire; } // Update is called once per frame void Update() { if (Input.GetKeyDown(KeyCode.Space)) { //chamando o delegate atacarDelegate(); } } }
[Código 2] – Instanciando e apontando para método
Operadores
As delegates permitem utilizar os operadores [ + 0u – ] para adicionar ou remover métodos da delegate. Então, crie mais um método com a assinatura permitida pela delegate criada, conforme o código 3.
private void HandleSword() { Debug.Log("Executou o atacar com espada"); }
[Código 3] – Definindo mais um método
No método Start, adicione mais um método ao delegate com o operador +.
void Start() { // instanciando o delegate atacarDelegate = HandleFire; atacarDelegate += HandleSword; }
No método update, não é necessário fazer nenhuma alteração.
Agora que você já leu, que tal assistir ao vídeo, onde eu mostro mais detalhes?
Conclusão.
Neste artigo você aprendeu a utilizar os primeiros conceitos de delegate, faça bom uso dele!
Aproveite para ler sobre otimização de códigos, será muito importante para a jornada.
Abraços;