访问游戏对象在主线程

问题描述:

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'是什么。 –

在每个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 });