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:\projects\worldCreater\Assets\_LBEngine\_Scripts\Banner\BannerViewController.cs:221
at BannerUpdate.updateSetting () [0x00030] in D:\projects\worldCreater\Assets\_LBEngine\_Scripts\Banner\BannerUpdate.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);
}
}
文章来源: 【解决BUG思路】get_gameObject can only be called from the main thread
原文链接: https://blog.csdn.net/muqian328/article/details/83656780