質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1205閲覧

Unity : AndroidアプリでGoogleAdmobのリワード広告を実装したい

japomondo

総合スコア23

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/01/23 06:07

編集2018/01/23 10:15

###実現したいこと
Unityで開発中のAndroidアプリで、GoogleAdmobのリワード広告を実装したい

###詳細
UnityでAndroidのゲームを作っています。

キャラクターの体力が0になった時にリワード広告の視聴をユーザーに問い、視聴した場合体力を50%回復、視聴しなかった或いは視聴を途中で辞めた場合体力は回復せずゲームオーバーになる、という機能を実装したいと考えています。

上記について、理解が足りておらず以下の問題を抱えております。もしお力をお貸しくださる方がいらっしゃいましたら、アドバイス等いただけますと大変幸いです。

###問題点
(1)HandleRewardBasedVideoRewardedメソッドが呼ばれるタイミングが分からない
→広告動画を最後まで見た上で右上の×ボタンをタップしても、リワードが与えられない(体力を50%回復するメソッドが呼ばれない)

(2)ユーザーが動画の視聴を途中で見るのを辞めた際に呼ばれる処理をどこに書けばいいか分からない
→HandleRewardBasedVideoClosedメソッドに書けばいいのかと思ったが、違った

(3)広告動画の再生時間を任意に選びたいが、方法が分からない
→5秒版、30秒版、60秒版とあると思いますが、表示する動画の長さを設定したい

###該当のソースコード

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using GoogleMobileAds.Api; 5using System; 6using StrOpe = StringOperationUtil.OptimizedStringOperation; 7using UniRx; 8using UniRx.Triggers; 9 10public class AdManagement : MonoBehaviour { 11 12 private RewardBasedVideoAd rewardBasedVideo; 13    // 呼びたいメソッドを持つクラス 14 public PlayerHealth playerHealth; 15 16 void Start () 17 { 18 this.rewardBasedVideo = RewardBasedVideoAd.Instance; 19         RequestRewardBasedVideo (); 20 RegistHandler (); 21 22 // 追記 23 this.UpdateAsObservable() 24       .Where(_ => endPlay) 25       .ObserveOnMainThread() 26       .Subscribe(_ => playerHealth.Revival()); 27 } 28 29 private void RequestRewardBasedVideo() 30 { 31 #if UNITY_ANDROID 32 // テストアカウント 33 string adUnitId = "ca-app-pub-3940256099942544/5224354917"; 34 #else 35 string adUnitId = "unexpected_platform"; 36 #endif 37 38 AdRequest request = new AdRequest.Builder().Build(); 39 rewardBasedVideo.LoadAd(request, adUnitId); 40 } 41 42 private void RegistHandler() 43 { 44 // Ad event fired when the rewarded video ad 45 46 // has been received. 47 rewardBasedVideo.OnAdLoaded += HandleRewardBasedVideoLoaded; 48 // has failed to load. 49 rewardBasedVideo.OnAdFailedToLoad += HandleRewardBasedVideoFailedToLoad; 50 // is opened. 51 rewardBasedVideo.OnAdOpening += HandleRewardBasedVideoOpened; 52 // has started playing. 53 rewardBasedVideo.OnAdStarted += HandleRewardBasedVideoStarted; 54 // has rewarded the user. 55 rewardBasedVideo.OnAdRewarded += HandleRewardBasedVideoRewarded; 56 // is closed. 57 rewardBasedVideo.OnAdClosed += HandleRewardBasedVideoClosed; 58 // is leaving the application. 59 rewardBasedVideo.OnAdLeavingApplication += HandleRewardBasedVideoLeftApplication; 60 } 61 62 #region RewardBasedVideo callback handlers 63 64 private void HandleRewardBasedVideoLoaded (object sender, EventArgs args) 65 { 66 MonoBehaviour.print ("HandleRewardBasedVideoLoaded event received"); 67 } 68 69 private void HandleRewardBasedVideoFailedToLoad (object sender, AdFailedToLoadEventArgs args) 70 { 71 MonoBehaviour.print ( 72 StrOpe.i + "HandleRewardBasedVideoFailedToLoad event received with message: " + args.Message); 73 } 74 75 private void HandleRewardBasedVideoOpened (object sender, EventArgs args) 76 { 77 MonoBehaviour.print ("HandleRewardBasedVideoOpened event received"); 78 } 79 80 private void HandleRewardBasedVideoStarted (object sender, EventArgs args) 81 { 82 MonoBehaviour.print ("HandleRewardBasedVideoStarted event received"); 83 } 84 85    // 広告動画が完全に視聴された際に呼び出されるメソッドと理解。キャラクターの体力を50%回復させたい 86 private void HandleRewardBasedVideoRewarded (object sender, Reward args) 87 { 88 // 追記 89 endPlay = true; 90 91 string type = args.Type; 92 double amount = args.Amount; 93 MonoBehaviour.print ( 94 StrOpe.i + "HandleRewardBasedVideoRewarded event received for " + amount.ToString () + " " + type); 95 } 96 97 public void HandleRewardBasedVideoClosed (object sender, EventArgs args) 98 { 99 // 追記→コメントアウト 100 // playerHealth.Death(); 101 MonoBehaviour.print ("HandleRewardBasedVideoClosed event received"); 102 } 103 104 private void HandleRewardBasedVideoLeftApplication (object sender, EventArgs args) 105 { 106 MonoBehaviour.print ("HandleRewardBasedVideoLeftApplication event received"); 107 } 108 #endregion 109 110    // キャラクターの体力が0になった時に、広告を見るか否かユーザーに問い、見る選択をした際に呼び出す 111 public void PlayAd () 112 { 113 if (rewardBasedVideo.IsLoaded()) { 114 rewardBasedVideo.Show(); 115 } 116 } 117 118} 119

###参考にしたエントリ
https://stackoverflow.com/questions/37354039/how-to-check-if-an-advertisement-has-finished-in-unity

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

リワードが与えられない

**「体力を50%回復するメソッド」**でUnity APIにアクセスしていませんか?
Unity APIはシングルスレッドです。Admobは別スレッドで動作しているのでその影響で動作しないかと思います。

方法は2つ思いつきます。
###1 Update内でフラグをチェックする
ポイントは広告を閉じるタイミングで報酬を与えることです。
そうしないと広告を閉じる前に報酬を与えてしまうのでそれを防ぎます。
そして広告を再生するタイミングでTime.timeScaleを0にしてUnityの時間を止めることで余計な処理が走らないようにすると良いと思います。

C#

1bool IsReworded; 2bool IsClosed; 3 4void Update() 5{ 6 if(IsReworded && IsClosed) 7 { 8 IsReworded = false; 9 IsClosed = false; 10 11 //ここで報酬を与える処理を実行 12 } 13} 14 15void HandleRewardBasedVideoOpened(object sender, EventArgs args) 16{ 17 Time.timeScale = 0; 18} 19 20void HandleRewardBasedVideoRewarded(object sender, Reward args) 21{ 22 IsReworded = true; 23} 24 25void HandleRewardBasedVideoClosed(object sender, EventArgs args) 26{ 27 IsClosed = true; 28 Time.timeScale = 1; 29}

###2 UnirxのObserveOnMainThread()を使う
Unirxにはメインスレッドに戻すObserveOnMainThread()というメソッドがあります。実は、これを試したことが無いのですがこれを介すことで問題なく動くと思います。

###(2)について
一度今回のものを実装してみてください。

###(3)について
Admobでは再生時間を選べません。他広告会社で選べるところがありますのでAdmobメディエーションを利用して広告を読み込むと良いと思います。ちなみにですが、Admobも含め各広告会社は1日の再生回数が大体決まっています。なのでAdmobのみではなく2,3社入れておくのをお勧めします。再生時間を選べる広告会社はVungleです。

###最後に 動画広告の注意点
1 ダウンロード速度
例えばユーザーの端末に速度制限が掛かっている場合や、Wifiが不安定な場合広告の読み込みができないこともあります。その現象が続くとユーザーが離れてしまう原因になるので00秒待機しても動画の準備が終わらない場合、読み込み完了までインタースティシャルを表示することを検討してみてもいいかもしれません。

2 初期化が遅い
広告会社にもよりますが、初期化に1分以上掛かることもあります。ユーザーがわかりやすいように「準備中です」などの表記をすることをお勧めします。

投稿2018/01/23 06:46

編集2018/01/23 07:26
IShix

総合スコア1724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

japomondo

2018/01/23 08:39 編集

IShikawan様、先の質問に続きまたもご教示いただき本当にありがとうございます。 教えていただいたUnirxのObserveOnMainThread()を介してみたところ、「体力を50%回復するメソッド」(playerHealth.Revival())を呼ぶことができました。 (2)についても、HandleRewardBasedVideoClosedの中に「ゲームオーバーになるメソッド」(playerHealth.Death())を加えてみたところ、動画の再生途中に右上の×ボタンを押すことで、ゲームオーバーとさせることができました。 ただ、こちらに関してはなぜObserveOnMainThread()を介す必要が無いのか今のところ分かっていないので、考えてみようと思います。 (3)および最後の注意点についても懇切丁寧に教えていただき感謝いたします。独学で開発しておりますゆえ、そういった「そもそも」の部分までご教示いただき、ありがたい限りです。
japomondo

2018/01/23 08:23

申し訳ありません、勘違いをしておりました。HandleRewardBasedVideoClosedの中に「ゲームオーバーになるメソッド」(playerHealth.Death())を加えたところ、広告を見終えようと途中であろうと、右上の×ボタンを押すとplayerHealth.Death()が呼ばれてしまっておりました。
IShix

2018/01/23 09:42

無事解決できたようで良かったです。 ユーザーのコンテニューが動画広告の報酬になるようですね? コンテニューが報酬でしたら最近ではユーザーの体験を損なわないように「広告を見てコンテニューする」を押した時点では広告を再生せずにゲームオーバー後に広告を再生するゲームもあります。よろしければ検討してみてください。 下記のアプリがそのシステムを実装しています。よければ遊んでみてください。 ▼ Rodeo Stampede [iOS] https://itunes.apple.com/jp/app/id1047961826 [Android] https://play.google.com/store/apps/details?id=com.yodo1.rodeo.safari
japomondo

2018/01/23 09:52

事例アプリまでご紹介いただき誠にありがとうございます。プレイして勉強させていただきます。 (2)についてですが、ユーザーが動画の視聴を途中でやめてしまった場合に呼び出すメソッドは、どこにどのように書けば良いのか教えていただけませんでしょうか?
IShix

2018/01/23 10:21

動画を見たかどうかで判定するといいと思います。クローズのタイミングで動画を見ていれば報酬を与える、見ていなければゲームオーバーといった感じです。 フラグで処理してもいいですし、Unirxで書いてもいいと思います。
japomondo

2018/01/23 10:57

Unirxでできました!(1)と同じやり方でやれば良いだけでした…。本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問