1. 程式人生 > >Unity3d C 錯誤提示 禁止線上程中進行遊戲物件比較

Unity3d C 錯誤提示 禁止線上程中進行遊戲物件比較

               

今天剛剛寫完非同步Socket客戶端的資料收發,在進行測試的時候,Unity報出錯誤:

 

CompareBaseObjectsInternal can only be called from the main thread.


詳情如下:

ERROR : CompareBaseObjectsInternal can only be called from the main thread. Constructors and field initializers will be executed from the loading thread when loading a scene. Don't use this function in the constructor or field initializers, instead move initialization code to the Awake or Start function.


 

在Unity3d官方論壇有網友請教了這個問題

http://answers.unity3d.com/questions/704284/comparebaseobjectsinternal-can-only-be-called-from-1.html


答案如下:

Seems like you must be calling Unity specific functions from another thread, compare gameobjects means you are checking if one gameobject equals another, apparently this is not threadsafe, so you would need to make sure your separate thread does NOT interract with Unity functions at all. 

 

翻譯過來就是說:

在Unity中需要遵循C#的執行緒安全,不能在另外的執行緒對Unity的GameObject進行相等比較操作。

 

在我的工程中,當Socket BeginConnect的時候就會 呼叫WindowManager來顯示一個等待介面

當Connect Success或者failed的時候,就會關閉。

 

顯示介面是在Unity執行緒中執行

關閉介面是在Socket的非同步回撥中執行

 

從Mono的斷點來看這兩個不是同一個執行緒。

 

 

 

因為在Wait.GetSingleton().Close() 中有用到WindowManager.GetSingleton()

如下:

 public static CCWindowManager GetSingleton({  if(m_sInstance==null)  {   //Helper.LogError("CCWindowManager m_sInstance==nul");   GameObject obj = new GameObject("CCWindowManager");   m_sInstance=obj.AddComponent<CCWindowManager>();  }  return m_sInstance; }


 

所以在判斷 m_sInstance == null 的時候出現了錯誤。

 

解決方法:

將關閉等待介面的程式碼移到了Update中。

 

 

           

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!https://blog.csdn.net/jiangjunshow