![Novo vídeo: Enviando mensagens na Unity](/content/categories/unity.png)
Novo vídeo: Enviando mensagens na Unity
No começo de um projeto na Unity é comum adicionarmos referências de outros objetos em um mesmo MonoBehaviour
, como um campo de texto que precisa ser atualizado. Porém, quando maior o projeto fica, mais díficl é manter todos scripts que tem referência atualizados, sem falar que é muito fácil quebrar uma referência dessas. Uma solução para isso é desacoplar o máximo possível componentes que não precisam conhecer outros para realizar seu objetivo, e enviar mensagens é um padrão de desenvolvimento que pode ajudar muito nesse caso.
No video eu começo com um exemplo simples de um projeto que tem dois botões que interagem com o mesmo componente de texto, e o problema é que o script que cuida do inventário do jogador não precisa ter a responsabilidade de atualizar a UI também. Para resolver este problema, e desacoplar a UI do inventário do jogador, eu removo essa dependência utilizando um sistema de enviar e receber mensagens através do MessageManager
.
Como mencionei no vídeo, este padrão de enviar mensagens lembra o Observer mas com algumas diferenças. O script abaixo é uma versão simplificada do que encontrei no framework Frictionless.
using System;
using System.Collections.Generic;
public class MessageManager
{
private readonly Dictionary<Type, List<Delegate>> _listeners;
private static MessageManager _instance;
public static MessageManager Instance
{
get { return _instance ?? (_instance = new MessageManager()); }
}
private MessageManager()
{
_listeners = new Dictionary<Type, List<Delegate>>();
}
public void SendMessage(object message)
{
List<Delegate> messages = null;
if(_listeners.TryGetValue(message.GetType(), out messages))
{
for(int i = 0; i < messages.Count; i++)
{
messages[i].DynamicInvoke(message);
}
}
}
public void AddListener<T>(Action<T> message)
{
List<Delegate> messages = null;
if(_listeners.TryGetValue(typeof(T), out messages))
{
messages.Add(message);
}
else
{
messages = new List<Delegate> { message };
_listeners.Add(typeof(T), messages);
}
}
public void RemoveListener<T>(Action<T> message)
{
List<Delegate> messages = null;
if(_listeners.TryGetValue(typeof(T), out messages))
{
messages.Remove(message);
}
}
}
Espero que o audio tenha ficado melhor neste vídeo, também editei algumas partes dele para ficar mais fluído, algo que não tinha feito nos dois anteriores. Se você gostou do vídeo e quer mais conteúdo neste formato deixe seu comentário aqui ou no vídeo, e se inscreva no canal para ser notificado quando novos vídeos forem adicionados. Qualquer dúvida ou sugestão para outros vídeos fique a vontade para comentar!