访问游戏对象在主线程
问题描述:
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
呢?
答
在每个Windows应用程序中,在Unity3D
中,您只能从Thread
访问元素(主线程或UI线程一般),并且错误消息明确指出这是您的情况。
所以你可以通过两种方式解决这个问题:
-
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. }
-
Dispatcher.CurrentDispatcher.BeginInvoke( DispatcherPriority.Normal, () => { // your work here });
最近,我在我自己的Unity3d使用项目实施委托的事件系统。它允许您在希望它们被触发的地方运行事件。我可以解释我认为如何解决你的问题,但这将是一种替代解决方案,而不是直接的答案。 – ChadF
什么是'EventManager'?这看起来不像Unity内置的东西? –
你为什么在第一时间脱线?正如戴夫所说,你应该解释你的'EventManager'是什么。 –