2015-07-10 81 views
1

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爲null,因爲foo方法不在主線程中。那麼我該如何訪問gameObject呢?

+0

最近,我在我自己的Unity3d使用項目實施委託的事件系統。它允許您在希望它們被觸發的地方運行事件。我可以解釋我認爲如何解決你的問題,但這將是一種替代解決方案,而不是直接的答案。 – ChadF

+0

什麼是'EventManager'?這看起來不像Unity內置的東西? –

+0

你爲什麼在第一時間脫線?正如戴夫所說,你應該解釋你的'EventManager'是什麼。 –

回答

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