引发通过网络接收的Update()事件的优雅方式

时间:2018-06-23 14:49:23

标签: c# unity3d networking event-handling

我正在编写一个Unity3D游戏,该游戏从外部来源获取网络事件。实际的网络读取操作在其自己的线程中。

当我从网络中读取某些项目时,我希望Monobehaviour在下一次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 :(得分:1)

您的解决方案似乎在您的问题中。您可以改用事件。

网络线程

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){ }