unity,

Novo vídeo: Enviando mensagens na Unity

Bruno Cicanci Bruno Cicanci Seguir 2 de Junho de 2018 · 3 min de leitura
Novo vídeo: Enviando mensagens na Unity
Compartilhe

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!

Gostou do post?
Como muitos programadores, aprecio um bom café. Se curtiu este conteúdo, que tal me presentear com um café?
Bruno Cicanci
Escrito por Bruno Cicanci Seguir
Bacharel em Ciência da Computação e pós-graduado em Produção e Programação de Jogos. Atuo profissionalmente com desenvolvimento de jogos desde 2010. Já trabalhei na Glu Mobile, Electronic Arts, 2Mundos, Aquiris, e atualmente na Ubisoft em Londres. Escrevo neste blog desde 2009.