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の実装は、一筋縄にいかないですな〜。

 

\IT未経験者からのサポートあり!転職サービス3選!!/

サービス名
未経験 未経験OK 未経験の転職専用 経験者向け
公開の求人数 ITエンジニア全体で1万件以上
ITエンジニア未経験で600件以上
未公開 5,000件以上
利用対象 全職種 IT特化 IT特化
特徴 ✓誰もが知る転職サービス
✓経歴を登録しておくとオファーが来る
✓企業担当者と条件交渉
✓スキルの身につく企業を紹介
✓IT専門のエージェントが対応
✓転職成功すると年収200万円以上の大幅アップがある
転職サポート内容
  • 求人検索
  • 企業担当者と交渉
  • 求人紹介
  • ライフプランのサポート
  • キャリア相談
  • 求人紹介
  • 提出書類の添削
  • 面接対策
公式サイト リクナビネクスト テックゲート レバテックキャリア
最新情報をチェックしよう!