在Unity,线程不能操作通过UnityEngine像transform.position等,这导致了异常那get_transform只能从主线程调用提供的对象。然而,这些方法可以像BeginReceive一些异步函数使用,所以有没有人能告诉我为什么?异步函数不是线程或者某事?
我尝试下面的代码:
void Start(){
AsyncCallback callback = new AsyncCallback (demo);
callback.BeginInvoke (null, null, null);
}
void demo(IAsyncResult result){
Debug.Log(Thread.CurrentThread.ManagedThreadId);
Debug.Log(gb.transform.position.ToString());
}
它,当我运行在统一编辑代码抛出异常。然而,当我直接在Android手机上运行此代码,它没有抛出任何异常,并正确地执行代码。
登录应用程序的logcat表明:
Line 13497: 02-20 14:37:49.973 31027 31697 I Unity : 3
Line 13501: 02-20 14:37:49.975 31027 31697 I Unity : (0.0, 0.0, 0.0)
如此看来,在功能上的另一线程,而不是主线程运行,因此任何人都可以告诉我为什么在这种情况下,变换的作品?
团结不允许从非主线程,期间其他线程调用大多数API函数。所有事件/消息处理的其实就是主线程上完成。
基于IEnumerator
协程系统是一个黑客位,并不能真正允许多线程(记住,即便是.NET 4.5异步/等待功能并不一定意味着要么多线程执行)。
如果调用API UnityEngine作品,你在主线程上。
UI API是不允许从不同的线程比UI一个叫。
这简化了统一的工作方式在幕后,实际上使得它更快。
一些异步方法是使用一个事件循环,而不是在不同的线程调度。仅仅因为一个方法是异步,这并不意味着它得到在不同的线程中运行。
这在Unity最明显的例子是协同程序。他们异步运行,但在主线程上。这是可能的,因为统一将所有的到列表并执行每帧。
您可以从其他线程调用API团结,但如果你从Unity编辑器中运行该游戏。发布版本不检查哪个线程调用API统一源于。我想他们也懒得去避免性能受到影响。
我没有太多自己虽然测试这一点。统一的文档是很清楚,API是不是线程安全的。因此,绝对不要做任何财产分配或调用,游戏状态从其他线程改变。仅仅读值可能是好的,但它取决于UnityEngine的未知的内部缓存行为,即。哈希表/字典是坏的多线程。