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!

Bruno Cicanci

Bruno Cicanci
Desenvolvendo jogos desde 2009.

Falta de foco

Você planeja uma tarefa ou atividade, reserva um bom tempo pra isso, escolhe aquela playlist perfeita, coloca seu fone e se isola em um c...… Continue lendo

Comparando deletages e Unity Events

Published on September 09, 2018