Unity3D 中GetComponentFastPath can only be called from the main thread
产生原因:由于跨线程访问数据,因为在Unity中,继承mono的组件都在主进程上访问数据,当你在新的线程访问任何组件基本上都会存在这个问题。解决办法:通过继承Mono的组件,通过事件监听的方式对方法进行执行声明:MainThreadCall,类,挂载在场景的场景中public class MainThreadCall : MonoBehaviour{static object locker = n
·
产生原因:由于跨线程访问数据,因为在Unity中,继承mono的组件都在主进程上访问数据,当你在新的线程访问任何组件基本上都会存在这个问题。
解决办法:通过继承Mono的组件,通过事件监听的方式对方法进行执行
声明:MainThreadCall,类,挂载在场景的场景中
public class MainThreadCall : MonoBehaviour
{
static object locker = new object();
static List<Action> aList = new List<Action>();
static int count = 0;
public static int MainThreadID { get; private set; }
private void Awake()
{
MainThreadID = Thread.CurrentThread.ManagedThreadId;
}
// Update is called once per frame
void Update()
{
if (count != 0)
{
lock (locker)
{
foreach (var a in aList)
{
if (a != null) a();
}
aList.Clear();
count = 0;
}
}
}
private static void AddCall(Action a)
{
lock (locker)
{
aList.Add(a);
count++;
}
}
static public void SafeCallback(Action _a)
{
AddCall(_a);
}
static public void SafeCallback<T>(Action<T> _a, T p1)
{
Action tmp = () => { _a(p1); };
AddCall(tmp);
}
static public void SafeCallback<T1, T2>(Action<T1, T2> _a, T1 p1, T2 p2)
{
Action tmp = () => { _a(p1, p2); };
AddCall(tmp);
}
static public void SafeCallback<T1, T2, T3>(Action<T1, T2, T3> _a, T1 p1, T2 p2, T3 p3)
{
Action tmp = () => { _a(p1, p2, p3); };
AddCall(tmp);
}
static public void SafeCallback<T1, T2, T3, T4>(Action<T1, T2, T3, T4> _a, T1 p1, T2 p2, T3 p3, T4 p4)
{
Action tmp = () => { _a(p1, p2, p3, p4); };
AddCall(tmp);
}
再异常的地方,通过传递事件
MainThreadCall.SafeCallback(() => { //这里书写你的方法); });
还有其他方式,这个目前对我来说够用了
更多推荐
已为社区贡献1条内容
所有评论(0)