在Unity中,子线程是无法调用Unity主线程的API的,因为unity不允许这么干。
但是我们可以通过别的途径,实现这一功能。
大致思路:
将子线程中需要调用的函数,通过委托传递给Loom中的委托列表,在Loom中去调用该委托。因为Loom是继承MonoBehavior的,挂载在空物体上面,所以由他去执行委托,自热是没问题的!
详细思路:
- 一开始在Unity中创建一个新物体obj,挂上Loom脚本。
- Loom中有List<Action> listActions;
- 将子线程中的函数,以委托的形式,传递给listActions,Loom在Updata里面,轮询去调用委托。
- 巧妙的将子线程无法调用主线程的API 转化为 子线程传递给空物体上面的Loom,在Loom里面去调用委托来调用主线程API。
Loom.cs:
using
常规的出错用法:
Text
使用Loom.cs:
Text
需要注意的是,应当提前把Loom实例化出来。
其实在上述的测试代码中,在ThreadFun()中调用Loom函数,Loom已经执行了初始化了。
假如这是第一次调用Loom,那么会触发Loom的初始化函数Initialize(),会执行 new GameObject("Loom"),相当于还是在子线程中调用主线程代码,还是行不通 会报错的。所以我们要提前给Loom实例化。
方法有2:
1.手动在场景中创建一个空物体,挂上Loom脚本
2.在游戏启动的时候,主动调用Loom的初始化函数。假设GameManager.cs 是游戏的管理启动脚本
GameManager.cs :
void