【发布时间】:2019-02-03 15:11:26
【问题描述】:
在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());
}
当我在 Unity 编辑器上运行代码时,它确实会引发异常。但是,当我直接在Android手机上运行这段代码时,它并没有抛出任何异常,并且代码执行正确。
applogcat 的登录显示:
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)
看来该函数是在另一个线程而不是主线程上运行的,所以谁能告诉我为什么 transform 在这种情况下有效?
【问题讨论】:
-
"在 BeginReceive 等一些异步函数中" C# 中有很多异步函数。你试的是哪一款?你在做什么需要你使用另一个线程?
-
我只是想知道BeginReceive应该是一个线程,但是我可以使用UnityEngine提供的方法,也不例外。
-
从哪里开始接收?哪一堂课?其中有许多来自不同的 C# API/类。
-
来自 System.Net.Scotets 的套接字
-
你没有包含你的代码,所以我不知道发生了什么,但如果你没有看到异常,这只是意味着代码没有在另一个线程上运行。至于在另一个线程中调用/使用 Unity API,看看这个post。