概述
BUG:
11-02 14:38:46.703 6555-6934/net.lionbird.google.countryCreatorUS E/Unity: UnityException: get_gameObject 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.
at BannerViewController.GetbannerPosition (System.String id, Boolean _ipx) [0x00036] in D:projectsworldCreaterAssets_LBEngine_ScriptsBannerBannerViewController.cs:221
at BannerUpdate.updateSetting () [0x00030] in D:projectsworldCreaterAssets_LBEngine_ScriptsBannerBannerUpdate.cs:29
at (wrapper delegate-invoke) System.Action:invoke_void__this__ ()
at (wrapper delegate-invoke) System.Action:invoke_void__this__ ()
at (wrapper delegate-invoke) System.Action:invoke_void__this__ ()
at (wrapper delegate-invoke) System.Action:invoke_void__this__ ()
at (wrapper delegate-invoke) System.Action:invoke_void__this__ ()
at (wrapper delegate-invoke) System.Action:invoke_void__this__ ()
at (wrap
原因:
SDK线程调用了主线程才可以调用的方法
解决方案:
用代理封装要执行的方法。由Unity Update调用。
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using UnityEngine;
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);
}
}
最后
以上就是搞怪老虎为你收集整理的【Unity3d】【解决BUG思路】get_gameObject can only be called from the main thread的全部内容,希望文章能够帮你解决【Unity3d】【解决BUG思路】get_gameObject can only be called from the main thread所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复