UnityアプリでAdMobのリワード広告を活用し、ユーザーにGoogle Driveへのインポート・エクスポート機能を提供する構成はよくあります。
しかし、この組み合わせには処理タイミングに関する注意点が存在します。
本記事では、広告報酬獲得後にDrive連携処理を行う場合に陥りやすいエラーとその回避方法を解説します。
想定ユースケース
- リワード広告視聴後にアプリ設定をGoogle Driveにバックアップ
- 広告を見たユーザーに、Driveからのデータ復元を提供
よくあるNGパターン
以下のような流れで処理を実行すると、高確率でエラーになります。
AdMobリワード広告表示
↓
OnUserEarnedRewardイベント内で即座にGoogle Drive処理を実行
この時点では以下のような不安定要素が残っています:
-
Activity
が完全に復帰していない - UIスレッドの切り替え中
- Google認証が非同期で未完了
結果、以下のような不具合が発生します。
代表的なエラー例
エラー | 内容 |
---|---|
ActivityNotFoundException |
ファイルピッカーが起動できない |
NullPointerException |
Intent対象がnull |
無反応/クラッシュ | 非同期競合による処理停止 |
解決策①:ユーザー操作をトリガーにする
void OnUserEarnedReward(...) {
canExecuteDriveOperation = true;
}
void OnClickDriveImport() {
if (!canExecuteDriveOperation) return;
StartDriveImport();
canExecuteDriveOperation = false;
}
OnUserEarnedReward() では**「Drive処理してOKな状態」であることを記録**するだけ
実際のDrive処理はUIボタン等でユーザーが明示的に行う
この設計により、処理タイミングの安定性が大幅に向上します。
解決策②:広告終了イベントをトリガーにする
AdMobやUnity Adsの OnAdClosed() / OnUnityAdsDidFinish() を活用して、広告終了後にDrive処理を開始する方法です。
void HandleAdClosed() {
StartDriveExport();
}
この方法でも処理は可能ですが、広告終了直後は一部UIが不安定なこともあるため、ワンクッション(数百ms遅延)を入れるとさらに安定します。
補足:ワンクッションを入れる方法(例)
IEnumerator DelayedDriveExport() {
yield return new WaitForSeconds(0.3f);
StartDriveExport();
}
まとめ
やること | 理由 |
---|---|
報酬イベント内で即Drive処理しない | Activity未安定、認証未完了の恐れ |
UI経由 or 広告終了後に処理開始 | タイミングが安定しやすい |
処理前に数百ms待機させる | UIスレッドの安定を待つため |
ブログでもUnityや個人開発ネタを発信中です!
開発ノウハウやアプリ制作過程、Unity連携系のハマりポイントなど
より深掘りした内容をブログにまとめています。
▶ https://syunpp.com
公開中のアプリ一覧はこちら!
実際にUnityで開発してリリース済みのアプリ一覧をまとめています。
▶ https://syunpp.com/公開中のアプリ一覧/