Antes de saltar em o que é um sistema de eventos e como fazer isso, vamos primeiro discutir por que é útil ter um sistema de eventos?
In Unity, you will be relying on one of the two things listed below to get the data or dependencies from another class.
você ou
agrupar suas propriedades públicas ou serializadas em um comportamento Monobehour para ser capaz de atribuí-lo do inspetor para obter as referências.
ou
Use o padrão Singleton no seu código para obter os dados de que necessita.
se você ainda não está ciente do padrão de design de Singletons, é um padrão de design de software que restringe a instanciação de uma classe a uma única instância. Isto é útil quando exatamente um objeto é necessário para coordenar ações em todo o sistema.
se outro objeto no código precisa de dados desse objeto, nós chamamos a instância singleton para se referir a ele. Singletons são muito úteis para se referir às classes que você sabe que vão precisar apenas de uma instância dele.
independentemente da abordagem que você usa para obter as dependências, você vai enfrentar problemas ao ajustar uma coisa pequena ou refactorar o código, especialmente se trabalhar em um projeto muito grande.Vamos aliviar as dependências!
os sistemas de Eventos ajudam a modularizar o seu código, enviando mensagens entre classes que não sabem diretamente umas das outras. Eles permitem que as coisas respondam a uma mudança em um estado sem monitorá-lo constantemente em um loop de atualização. É uma forma de Padrão de observador em que um objeto, chamado de sujeito, mantém uma lista de seus dependentes, chamados observadores, e os notifica automaticamente de quaisquer mudanças de estado, geralmente chamando seus métodos.
vamos entender isso por um exemplo de assinatura de uma revista.
- uma editora de revistas (assunto) está no negócio e publica revistas (dados).
- se você (usuário de dados / observador) estiver interessado na revista que você assina(registro), e se uma nova edição é publicada, ela é entregue a você.
- se cancelar a inscrição (não registada), deixará de obter novas edições.
- Publisher doesn’t know who you are and how you use the magazine, it just delivers it to you because you are a subscriber(loose coupling).
Como conceber o sistema de eventos?
eu tenho uma cena em que temos um terceiro jogador de futebol(say Mr.X), um labirinto, e algumas portas. Agora, digamos Mr. X quer chegar à saída do labirinto, mas há algumas portas entre as quais podem ser abertas assim que o Sr. X chegar perto deles.
As portas têm o disparador a caixa collider, que aciona as outras collider envolvidos neste colisão.
vamos implementar isto usando um sistema de eventos.
vamos começar adicionando um GameObject na cena e adicionando um novo script chamado EventsManager.cs
os nossos primeiros eventos serão os que dispararão quando o nosso Jogador entrar ou sair da área de disparo da porta.
for that, In EventsManager.cs class, create two event actions doortriggerenter and DoorTriggerExit, also, methods that can invoke the respective event action. Além disso, criar uma referência singleton estática para a classe.
Agora, precisamos de objetos que podem fogo e se inscrever para estes eventos. Para isso criar duas classes, uma para a porta, controlador de porta.cs, e um para o gatilho da porta, DoorTrigger.cs.
In The DoorController.cs, criar dois métodos que podem ouvir quando alguém dispara doortriggerenter ou doortriggerexit eventos e executar suas tarefas. No método de início do controle de portas, acesse os eventos da classe EventsManager usando a instância estática, e subscreva seu respectivo método.
Agora, nossos eventos estão prontos e os assinantes estão ouvindo esses eventos. Então, na aula de DoorTrigger, nós só precisamos disparar esses eventos no método OnTriggerEnter.
tudo Bem.. então vamos anexar o Controle de Portas E script DoorTrigger a cada porta e área de gatilho respectivamente e reproduzir a cena.
Uhh Ohh! Há um problema…
Nossa classe EventManager é uma classe singleton e cada porta que o gatilho é invocar o evento e cada controlador de porta é ouvir e responder para o mesmo evento. Precisamos passar algum id único ao invocar o evento para que apenas a porta que tem o mesmo id vai ouvir esse evento.
em nosso caso particular, gatilhos e o objeto pai da porta são os mesmos. Então, podemos passar o ID da instância do gameobject do Pai.
Vamos reproduzir a cena..
Yeahhh.. está a funcionar como esperado.
certifique-se de cancelar a subscrição destes eventos, pois eles podem levá-lo a alguns erros indesejados. Por exemplo, se você destruir sua porta em tempo de execução, etc.Então, é assim que podemos fazer o nosso sistema de eventos simples.É tudo por agora, pessoal… Feliz Código! 🙂