Элегантный способ вызывать события в Update (), полученные по сети - PullRequest
0 голосов
/ 23 июня 2018

Я пишу игру Unity3D, которая получает сетевые события из внешнего источника. Фактические операции чтения по сети находятся в их собственном потоке.

Когда я читаю какой-либо элемент из сети, я хочу, чтобы монобихевиорр вызывал некоторую функцию, используя этот элемент в качестве аргумента при следующем вызове Update(). Вот как я могу это сделать прямо сейчас (просто псевдокод для простоты)

Сетевая нить

OtherScript script;
while true {
    Thing thing = Network.read()
    script.queue.put(thing);
}

Monobehaviour (OtherScript)

SynchronizedQueue<Thing> queue;
void Update() {
    while !queue.isEmpty() {
        useThing(queue.pop())
    }
}

Это определенно работает, но моя проблема в том, что я подписываюсь на 20+ разных типов вещей, у каждого из которых есть своя очередь и своя функция «обратного вызова», что приводит к большому количеству шаблонов.

Есть ли какой-то встроенный механизм, который автоматизирует эту функцию?

1 Ответ

0 голосов
/ 23 июня 2018

Ваше решение, похоже, в вашем вопросе.Вместо этого вы можете использовать событие.

Сетевой поток

public static event EventHandler<NetworkArg>RaiseNetwork;
protected void OnNetwork(NetworkArg arg)
{
     if(RaiseNetwork != null) { RaiseNetwork(this, arg); }
}
while true {
    Thing thing = Network.read()
    RaiseNetwork(new NetworkArg(thing));
}

Класс NetworkArg

public class NetworkArg : System.EventArgs
{
    public Thing thing { get; private set;}
    public NetworkArg(Thing thing){ this.thing = thing; }
}

Monobehaviour (OtherScript)

void Start()
{
    NetworkThread.RaiseNetwork += UseThing;
}
private void UseThing (object sender, NetworkArg arg){ }
...