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.

Delegate
Delegate

O que é um Delegate?

O delegate é um elemento da linguagem C# que permite fazer referência a um método de forma segura. Ele é semelhante a um ponteiro de função em C e C++, mas possui diferenças significativas, pois é orientado a objetos e geralmente é utilizado para lidar com eventos.

Delegates permitem uma maior flexibilidade no código, pois possibilitam que um método seja chamado dinamicamente sem que a classe que o executa precise conhecer sua implementação exata. Em termos simples, um delegate armazena o endereço de memória de um método e permite que ele seja invocado posteriormente.

Ao utilizar a classe delegate, podemos inicializar, adicionar, remover e invocar métodos de forma dinâmica. Essa abordagem é particularmente útil quando trabalhamos com eventos na Unity, permitindo um maior desacoplamento entre os componentes do jogo.

A definição de um delegate é composta pela seguinte sintaxe:

[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 código 1, na primeira linha, foi definido um delegate com o nome de AtacarDelegate, que pode apontar para qualquer método que não receba argumentos e tenha retorno do tipo void. Na segunda linha, o delegate pode apontar para um método que retorne um valor float, sem argumentos. Já na terceira linha, o delegate poderá apontar para métodos que retornem um float e aceitem um argumento do mesmo tipo.

Caso um método seja diferente da assinatura esperada pelo delegate, um erro será gerado.

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.

Criando uma Variável de Delegate

Agora que você aprendeu a definir um delegate, podemos criar uma variável que será utilizada para armazenar referências a métodos.

Vamos ao exemplo prático:

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

No código 2, criamos um delegate AtacarDelegate, que aponta para o método HandleFire. O código está estruturado para que, quando o usuário pressionar a barra de espaço, o delegate chame esse método e exiba a mensagem “Executou o atacar com arma” no console.

 

Operadores com Delegate

Delegates permitem a utilização dos operadores + e para adicionar ou remover métodos.

Vamos criar outro método com a mesma assinatura:


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.

Utilizando Delegates com Eventos na Unity

Eles são amplamente utilizados para a implementação de eventos em C# e Unity. Ao criar eventos personalizados, você pode permitir que outras classes se inscrevam em eventos e executem ações quando esses eventos forem disparados.

A seguir, um exemplo de uso de delegates em eventos


public class GameManager : MonoBehaviour
{
public delegate void GameEvent();
public static event GameEvent OnGameStart;

void Start()
{
if (OnGameStart != null)
{
OnGameStart();
}
}
}

public class Player : MonoBehaviour
{
void OnEnable()
{
GameManager.OnGameStart += StartGame;
}

void OnDisable()
{
GameManager.OnGameStart -= StartGame;
}

void StartGame()
{
Debug.Log("O jogo começou!");
}
}

Neste exemplo, criamos um evento OnGameStart na classe GameManager. A classe Player se inscreve nesse evento e responde quando o jogo começa.

Agora que você já leu, que tal assistir ao vídeo, onde eu mostro mais detalhes?

Conclusão.

Neste artigo, você aprendeu os conceitos básicos sobre delegates e como utilizá-los na Unity. Exploramos como definir, como atribuir métodos a ele, como utilizar operadores para manipular a lista de métodos associados e como aplicar esses conceitos em eventos. Aproveite para continuar explorando mais sobre ele e sua aplicação em eventos na Unity. Eles são uma ferramenta poderosa que torna o código mais flexível e modular!

Aproveite para ler sobre otimização de códigos, será muito importante para a jornada.

 

Acesse o nosso canal para saber mais!