FC2ブログ
    07 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.» 09

    ハルシオンシステムの気ままBlog

    株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

     

    【ハルシオンブログ】Unity+Admobの動画リワードではまったので、修正したよメモ 

    あつーい日が始まりましたね。
    とりあえず来週までずっと30度以上じゃないですか・・・・
    熱中症、日射病に気を付けてくださいまし。
    ほんと暑いのやですよねー


    UnityでAdmobを入れたんですが、リワードを受け取る処理でエラーがでたので、直してました。
    前動いてた気がしたんですけどね・・・・
    ちなみにAdmobのSDKは2022/6/27時点での最新です。

    GoogleMobileAds-v7.1.0

    【現象】
    リワードを受け取って動画を閉じるとアプリが落ちる。

    実機のエラーは特に分からず・・・・

    エラーはこんな内容。

    Exception in MessageQueue callback: handleReceiveCallback
    java.lang.Error: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

    処理としては何をしていたかというと、画面AのメソッドAをAdmobManagerに渡して、リワードを受け取る時にメソッドAを実行という感じ。
    メソッドAでは、画面AのGameObjectとかTextをいじっていました。

    [画面A.cs]

    void OnClickViewReward() {
    AdmobManager.instance.ProcReawrd(GetReward);
    }

    void GetReward() {
    btnViewReward.gameObject.SetActive(false);
    btnClose.transform.GetComponentInChildren().text = "閉じる";
    gold += rewardValue;
    GameData.instance.Save();
    }



    [AdmobManager.cs]

    Action actionReward;

    private void LoadReward() {
    this.reward = new RewardedAd(ID);
    this.reward.OnUserEarnedReward += HandleUserEarnedReward;
    this.reward.OnAdClosed += HandleCloseAd;
    AdRequest request = new AdRequest.Builder().Build();
    this.reward.LoadAd(request);
    }

    ///
    /// リワード動画開始
    ///

    public void ProcReawrd(Action reward) {
    actionReward = reward;
    #if UNITY_ANDROID || UNITY_IOS
    if (this.reward.IsLoaded()) {
    this.reward.Show();
    }
    #endif
    }

    public void HandleUserEarnedReward(object sender, Reward args) {
    actionReward();
    }


    こんな感じだとダメらしい。

    GetRewardのはじめの
    btnViewReward.gameObject.SetActive(false);
    で、エラーがでてしまうようです。

    ちなみにこの行を消しても次の行で・・・・・

    OnUserEarnedRewardのタイミングでは動画の方がアクティブになっていて、UI周りとか触れないのかな?

    ってことで、次のようにしたら動きました。

    [AdmobManager.cs]

    Action actionReward;

    private void LoadReward() {
    this.reward = new RewardedAd(ID);
    this.reward.OnUserEarnedReward += HandleUserEarnedReward;
    this.reward.OnAdClosed += HandleCloseAd;
    AdRequest request = new AdRequest.Builder().Build();
    this.reward.LoadAd(request);
    }

    ///
    /// リワード動画開始
    ///

    public void ProcReawrd(Action reward) {
    isReward = false;
    isClose = false;
    actionReward = reward;
    #if UNITY_ANDROID || UNITY_IOS
    if (this.reward.IsLoaded()) {
    this.reward.Show();
    }
    #endif
    }

    public void HandleUserEarnedReward(object sender, Reward args) {
    isReward = true;
    }
    public void HandleCloseAd(object sender, EventArgs args) {
    isClose = true;
    }
    private void Update(){
    if(isReward && isClose){
    actionReward();
    isReward = false;
    isClose = false;
    }
    }


    リワード取得のタイミングと、閉じたタイミングでフラグを立てて、Updateで処理。

    なぜこのタイミングならできるのかは分かりませんが、できました。

    ということで、Unity + Admobの動画リワードではまったの巻でした。

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    コメント

    コメントの投稿

    Secret

    トラックバック

    トラックバックURL
    →http://halcyonsystemblog.jp/tb.php/899-740294e4
    この記事にトラックバックする(FC2ブログユーザー)