Android Studio付属ツールmonitor.batを使ってUnityのAndroid実機デバッグでログを確認していたのですが、どうもAdMobのインタースティシャル広告の開始時および復帰時の時に「E/Unity(22202): set_timeScale can only be called from the main thread.」というエラーが出てしまいます。
Time.timeScaleをいじってゲームを止めたり再開したり処理をOnAdOpeningイベントハンドラやOnAdClosedイベントハンドラで加えていたのですが、これがまずかったのかもしれません。
そのままの意味で考えると、メインスレッドでタイムスケールは弄れやという事らしいので大人しく従う事にします(´・ω・`)
あ、よく見ると「 E/Unity(23828): Find can only be called from the main thread.」「E/Unity(25414): SetActive can only be called from the main thread.」というのも出てますね。Findは使わずにSerializeFieldを使う事にして、イベントハンドラ内ではメインスレッド内のコードのフラグを立てるだけにして、実際の処理はUpdate()の中で行う事にしました。
public enum AdState {NotShowing,JustStart,NowShowing,JustFinished}; public AdState nowInterstitial = AdState.NotShowing; void Update () { if (nowInterstitial == AdState.JustStart) { Time.timeScale = 0; AudioListener.pause = true; nowInterstitial = AdState.NowShowing; } else if (nowInterstitial == AdState.JustFinished) { Time.timeScale = 1; AudioListener.pause = false; nowInterstitial = AdState.NotShowing; //次シーン遷移 loadingUi.SetActive(true); StartCoroutine(LoadScene()); } }
AdMob広告クラスのイベントハンドラ内ではnowInterstitialの値を変えるだけです。これでバグが綺麗に消えました!
コメント