在Unity单线程中是c#事件?

时间:2018-02-01 07:02:03

标签: c# unity3d

Monobehavior中的事件是单线程吗?因此,当我捕获事件的触发器时,如果其中一个侦听器具有异常,则将触发该事件的try catch。我假设一旦A类触发一个事件,该线程将遍历每个用户,在每个用户完成后,A类继续?

public class EventExample : MonoBehaviour
{
    public delegate void ExampleEventHandler();
    public static event ExampleEventHandler OneDayPassed;

    public void Start NextTurn()
    {
        try{

        if (OneDayPassed != null)
            OneDayPassed();
            }
        catch(Exception e){
        // will catch error here
            }
    }
}

public class EntityWatcher: MonoBehaviour
{
    void Start()
    {
        EventExample.OneDayPassed += this.PrepareNextDay;
    }

    public void PrepareNextDay()
    {
        int test = int.parse("error");

    }
}

2 个答案:

答案 0 :(得分:2)

Monobehavior 主要是单线程但有些少数回调函数不是。 Unity API回调函数的大多数将在主线程上进行。

这些是不会在主线程上调用的功能,这意味着您无法在这些功能中调用/使用Unity API:

至于你自己的自定义事件,如:

public delegate void ExampleEventHandler();
public static event ExampleEventHandler OneDayPassed;

在您调用它的线程上调用该事件。如果从main / MonoBehaviour线程调用它,则回调将在主线程上发生。如果你创建一个新的Thread并从那里调用它或者使用上面列出的3个函数中的任何一个,那么期望它在另一个 Thread上调用,而不是主Thread 1}}。

如果您需要使用来自主Thread以外的其他Thread的Unity的API,请参阅this发布。

答案 1 :(得分:1)

Unity的事件API是单线程的。而且,它不是为支持多线程而设计的(不是线程安全的)。

当然,如果需要,您可以使用多线程明确委派一些工作,但不要尝试使用这些工具调用Unity API。

您可以在此处获得更多信息:https://answers.unity.com/questions/180243/threading-in-unity.html

如果您需要依赖某些执行顺序,可以参考manual page here