Unity(Androidアプリ)のAdmob・リワード動画広告でエラー「ExecutionEngineException: SIGILL」が発生したときの対処方法

 

Unityで作成したAndroidアプリに、Admobの動画リワード広告を導入した時の話。

導入が終わり、無事に動画が再生されることを確認した。

 

しかし、動画再生を終了させ、音を鳴らそう(再生)としたら以下のようなエラーが出てアプリが落ちて再生できなかったのだ。

 

■エラー内容


/Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
2019-09-09 19:20:19.031 12486-13490/jp.sample.title E/Unity: ExecutionEngineException: SIGILL
      at UnityEngine.Resources.Load (System.String path) [0x00000] in :0 
      at SoundManager.PlaySE (SE_TYPE type, Boolean roop, Single pitch, Boolean Overlap) [0x00000] in :0 
      at ShopGUI.MovieEndEvent (Boolean yes) [0x00000] in 

 

このようなエラーに悩んでいる人は、他にもいるのでは?

この記事では、解消方法を解説します。

 

現象発生手順

現象が発生したときの開発環境

・Unity2017.4.19

・Android Studio 3.5(UnityからAndroid Studio向けにエクスポートしてからStudioでビルドしている)

・Admob SDK

 

①UnityにAdmobをインストールする

②OnAdClosedのコールバック先を実装する(実装内容に音を鳴らす処理があること)

 ■補足・OnAdClosedの機能

 OnAdClosedは、ユーザーが「閉じる」アイコンまたは「戻る」ボタンを使って

 動画リワードを閉じたときに呼び出される。

 

③Admob SDK(Unity)の公式サイトを参考に、リワード動画を再生する処理を実装する

 Admob SDK(Unity)の公式サイト

 

 

④実装したアプリを起動して、動画を再生する

⑤動画終了後、OnAdClosedがコールバックされることを確認する。

 OnAdClosedの呼び出し先で音楽を鳴らすために呼び出した関数

 AudioSource.PlayOneShot

⑥その結果、以下のようなエラーが出たのだ。

 


/Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)
2019-09-09 19:20:19.031 12486-13490/jp.sample.title E/Unity: ExecutionEngineException: SIGILL
      at UnityEngine.Resources.Load (System.String path) [0x00000] in :0 
      at SoundManager.PlaySE (SE_TYPE type, Boolean roop, Single pitch, Boolean Overlap) [0x00000] in :0 
      at ShopGUI.MovieEndEvent (Boolean yes) [0x00000] in 

 

ググった結果わかったことは、Admobから呼び出されたOnAdClosedと同じスレッドで音楽を再生しようとしてはいけないとのこと。音楽再生は、別スレッドでコードを書くように言われているが、次の方法で比較的簡単に解決しました。

対処方法

 

OnAdClosedの呼び出し先で、IEnumerator型の関数を呼び出し、IEnumerator内の処理で音を鳴らすようにします。

 

擬似コードを書くとこんな感じ。

 


main(){
    //コールバック指定
    OnAdClosed +=  CallbackOnAdClosed();
}

private void  CallbackOnAdClosed(){

    //ここで「AudioSource.PlayOneShot」を処理しないこと!
    //エラーがでて再生できないため

    //音楽を鳴らす処理をStartCoroutineで呼び出す
    StartCoroutine(PlaySE());
}

IEnumerator  void PlaySE(){

   //念の為1フレーム飛ばす
   yield return null;
   AudioSource.PlayOneShot();
}

 

このような対処をすることによって、解決するのでした。

Admobの実装は、一筋縄にいかないですな〜。

 

 

最新情報をチェックしよう!
>プログラミングスクール検索・比較表サイト

プログラミングスクール検索・比較表サイト

ワンクリック、さらに詳細に条件を指定してプログラミングスクールの検索ができます。さらに比較表により特徴を細かく比較できる!

CTR IMG