Admob SDK v8.3.0のUnityプラグインを導入したプロジェクトで、
RewardedAd.Show( Action<Reward> userRewardEarnedCallback )
でリワード広告を見せた後、報酬が獲得できる状態になったタイミングでクラッシュするようになった。
UnityとSDK両方同じバージョンの他プロジェクトだと動いてたのに…
しかも全然検索しても全く同じ症状の内容が無いので自分で調べるしかない。困った。
logcat
logcatしてみたらこんな感じ。
処理最低限にしてテスト
コールバック処理をDebug.Logだけにしてリクエストしてみた所、
ちゃんとリワード獲得までクラッシュせずに処理を終わることができた。
logcatの時にもちょっと勘づいてはいたが、
もしかしてコールバックが重いんでは…?って思ったのがどうやら正解だったらしい。
解決方法
リワード獲得処理をコルーチンにして、数F待ってから実行してください。
こういう何かしら外部とかの物から帰ってくるとき、直後は安定しないみたいな挙動久しぶりに思い出しました。
一気に処理しようとするから落ちるので、処理を小分けにしてちょこちょこ待たせるとかしてもいいかも。
例えばこんな感じにするとか。
/// <summary> /// リワード広告を再生 /// </summary> public void ShowAds() { RewardedAd.Show(() => this.StartCoroutine(this.EarnedReward())); } /// <summary> /// 報酬を獲得 /// </summary> private IEnumerator EarnedReward() { // 数F待つことでクラッシュを回避 // 1Fでも動いたけど念には念をで2~3F程度待っとけば安全かも? yield return null; yield return null; // 重いリワード付与処理 }
ちなみに、フレーム待ちだけのコルーチン用意して待つのはダメでした。
普通にクラッシュするので、付与処理とかを一緒にしたコルーチン1個を、
コールバックで StartCoroutine
するだけの感じの方が確実と思われます。
割と困ってたんだけど、これで解決。自力で何とか解決できてうれしい。