Sistema de events simples no Unity

Eu estou tentando usar o sistema de events no Unity (o caminho C #), mas estou tendo problemas para implementá-lo.

A maioria dos exemplos, mostra uma class, onde você define o manipulador; em seguida, você escreve na mesma class, a function que corresponde à assinatura do manipulador e escreve os events como estáticos

public class EventExample : MonoBehaviour { public delegate void ExampleEventHandler(); public static event ExampleEventHandler OneDayPassed; public static void NextTurn() { // do stuff then send event if (OneDayPassed != null) OneDayPassed(); } } 

Então, em outra class, você se inscreve nos events, criando uma function que realmente faz alguma coisa

 public class EntityWatcher: MonoBehaviour { void Start() { EventExample.OneDayPassed += this.PrepareNextDay; } public void PrepareNextDay() { // Do other stuff that happen after the day is done } } 

Até agora, não há problemas, mas não tenho certeza de como projetar isso, então qualquer GameObject de um tipo específico, vai se inscrever para este evento. Por exemplo, se você tem uma categoria de pessoal de GO, que está trabalhando de 8 a 6 e as instancia em tempo de execução; devo me inscrever na class principal desta categoria, ou devo criar um script que eu append ao prefab do object de jogo, que se inscrever para o evento?

O objective é que todos os membros da equipe que deveriam fazer um turno de 8 a 6 no centro de esportes, saibam quando o evento “day is done” é iniciado, mas eu não quero inscrever cada prefab que eu instanciei.

Pelo que entendi, eu deveria append um script com o código necessário na pré-fabricada, mas não consigo encontrar um exemplo prático que mostre se essa é a maneira de fazê-lo.

Você deve usar o UnityEvent .

  public UnityEvent whoa; 

Não poderia ser mais fácil. Faça um script BigScript.cs

 using UnityEngine; using System.Collections; using UnityEngine.Events; public class BigScript:MonoBehaviour { [Header("Here's a cool event! Drag anything here!")] public UnityEvent whoa; } 

Coloque em um object de jogo. Agora olhe para isto no Inspetor . Legal certo?

Simplesmente arraste seus outros scripts para lá, para fazer algo acontecer, quando “whoa” acontecer.

insira a descrição da imagem aqui

É simples assim. Para chamar o evento no BigScript, é apenas

 public class BigScript:MonoBehaviour { [Header("Here's a cool event! Drag anything here!")] public UnityEvent whoa; private void YourFunction() { whoa.Invoke(); } 

(se você preferir, if (whoa!=null) whoa.Invoke(); )


Se você é novo: excelente tutorial em vídeo do Unity Events.


Em casos raros, você pode precisar adicionar um ouvinte por meio do código. (Quero dizer, ao invés de simplesmente arrastá-lo no Editor.)

 whoa.AddListener(ScreenMaybeChanged); 

Para ser claro: nunca faça isso , simplesmente arraste para conectar. Eu só mencionei isso por completo.


Isso é tudo que existe para isso.

Os events de unidade são um exemplo incrível de como o Unity torna isso ridiculamente fácil. Lembre-se sempre que, ao trabalhar com a Unity, se você está fazendo algo complicado, está fazendo da maneira errada. É brincadeira de criança.


O acima mostra como conectar funções simples que não possuem argumentos. Em projetos reais, você inevitavelmente precisa de alguns argumentos.

Se você precisar de um argumento:

Instruções rápidas:

 ... using UnityEngine.Events; // example, function has one float argument: // ADD THIS at the top of the file: [System.Serializable] public class _UnityEventFloat:UnityEvent {} public class SomeThingHappens : MonoBehaviour { public _UnityEventFloat changedLength; public _UnityEventFloat changedHeight; ... and then ... void ProcessValues(float v) { .... if (changedLength != null) changedLength.Invoke(1.4455f); } } 

Quando você arrasta da sua outra function para o slot do Editor nesta function:

Seja !!! certeza absoluta !!! para usar os que estão no topo – “Float dynamic”.

insira a descrição da imagem aqui

Confusamente, suas funções também serão listadas na seção “parameters estáticos”.

Este é um enorme gotchya em Unity!

Não se preocupe muito com o número de inscritos se você estiver falando apenas de algumas dezenas. Sim, quando você chegar às centenas ou milhares, pode ser uma boa ideia otimizar isso, mas mesmo assim. Primeira regra de otimização: não otimize.

Então, basta cada instância se inscrever no evento e acabar com isso.