在主线程中访问gameObject

时间:2015-07-10 19:08:26

标签: c# multithreading unity3d

get_gameObject can only be called from the main thread.

我得到的错误是否与我在C#中实现事件处理程序的方式有关。

在我的Start方法中,我有

EventManager.Instance.AddListener(EVENT_TYPE.UPDATE, this);

然后在我的OnEvent处理程序方法中我有

public void OnEvent(EVENT_TYPE Event_Type, Component Sender, object Param=null)
{
    //Detect event type
    switch (Event_Type)
    {
        case EVENT_TYPE.UPDATE:
           Debug.Log(" UPDATE Timer event received Param = "+ Param);
            foo(Param as string);
            break;
    }
}

然后是我的foo方法

private void foo(string param)
{
    Debug.Log("ASSERT foo gameObject" + gameObject);

所以gameObject为空,因为foo方法不在主线程上。那么我如何访问gameObject呢?

1 个答案:

答案 0 :(得分:0)

与每个Windows应用程序一样,在Unity3D中,您必须仅从Thread访问元素(通常是主线程或UI线程),并且错误消息明确指出这是你的情况。

所以你可以通过两种方式解决这个问题:

  1. Use Loom helper class

    Loom.QueueOnMainThread(() =>
    {
        Debug.Log("ASSERT foo gameObject" + gameObject);
    }); 
    

    Loom.DispatchToMainThread(() =>
    {
        Debug.Log("ASSERT foo gameObject" + gameObject);
    }); 
    

    但在这种情况下,您必须initialize the Loom object,例如,在Start方法中添加一些无用的代码:

    void Start()
    {
        var tmp = Loom.Current;
        // or
        Loom.Current.GetComponent<Loom>(); // irrelevant call to kickoff Loom.        
    }
    
  2. Use Dispatcher class

    Dispatcher.CurrentDispatcher.BeginInvoke(
      DispatcherPriority.Normal,
      () => { // your work here });