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;