Novo vídeo: Enviando mensagens na Unity

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!

comments powered by Disqus