简体   繁体   English

Unity 奖励视频广告注册多次。 统一广告

[英]Unity rewarded video ad registering multiple times. Unity Ads

This is my rewarded video script.这是我的奖励视频脚本。 It is attached to a UI button.它附加到一个UI按钮。

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Advertisements;
using UnityEngine.SceneManagement;

[RequireComponent(typeof(Button))]
public class RewardedAdsButton : MonoBehaviour, IUnityAdsListener
{

#if UNITY_IOS
    private string gameId = "1234567";
#elif UNITY_ANDROID
    private string gameId = "7654321";
#endif

    Button myButton;
    public string myPlacementId = "rewardedVideo";

    void Start()
    {
        myButton = GetComponent<Button>();

        // Set interactivity to be dependent on the Placement’s status:
        myButton.interactable = Advertisement.IsReady(myPlacementId);

        // Map the ShowRewardedVideo function to the button’s click listener:
        if (myButton) myButton.onClick.AddListener(ShowRewardedVideo);

        // Initialize the Ads listener and service:
        Advertisement.AddListener(this);
        Advertisement.Initialize(gameId, true);
    }

    // Implement a function for showing a rewarded video ad:
    void ShowRewardedVideo()
    {
        Advertisement.Show(myPlacementId);
    }

    // Implement IUnityAdsListener interface methods:
    public void OnUnityAdsReady(string placementId)
    {
        // If the ready Placement is rewarded, activate the button: 
        if (placementId == myPlacementId)
        {
            myButton.interactable = true;
        }
    }

    public void OnUnityAdsDidFinish(string placementId, ShowResult showResult)
    {
        // Define conditional logic for each ad completion status:
        if (SceneManager.GetActiveScene().name == "GameplayScene")
        {
            if (showResult == ShowResult.Finished)
            {
                GameObject.Find("GameManager").GetComponent<GameManagerScript>().ResumeGame();
            }
            else if (showResult == ShowResult.Skipped)
            {
                SceneManager.LoadScene("MenuScene");
            }
            else if (showResult == ShowResult.Failed)
            {
                Debug.LogWarning("The ad did not finish due to an error.");
            }
        }
        if(SceneManager.GetActiveScene().name == "CharacterScene")
        {
            if (showResult == ShowResult.Finished)
            {
                PlayerPrefs.SetInt("coin", PlayerPrefs.GetInt("coin", 0) + 50);
            }
            else if (showResult == ShowResult.Skipped)
            {
                //Do nothing.
            }
            else if (showResult == ShowResult.Failed)
            {
                Debug.LogWarning("The ad did not finish due to an error.");
            }
        }
    }

    public void OnUnityAdsDidError(string message)
    {
        // Log the error.
    }

    public void OnUnityAdsDidStart(string placementId)
    {
        // Optional actions to take when the end-users triggers an ad.
    }
}

It should only add the 50 coins but on minimum it adds 100 or multiple of 50 times, the button is registering multiple clicks.它应该只添加 50 个硬币,但至少添加 100 个或 50 次的倍数,该按钮正在注册多次点击。 Any idea what is happening?知道发生了什么吗?

It is correct thirteen4054, for those who have the same problem, a possible solution is to add this method:是正确的thirteen4054,对于有同样问题的人,一个可能的解决方案是添加这个方法:

public void OnDestroy ()
{
   Advertisement.RemoveListener (this);
}

In this way, if you go to another scene and return to it, only the last element created will be subscribed.这样,如果你去另一个场景并返回它,只会订阅最后创建的元素。


@Nicola, I would not add it to the OnUnityAdsDidFinish because then the subscription would be removed after the first call regardless of the result. @Nicola,我不会将其添加到 OnUnityAdsDidFinish 中,因为无论结果如何,都会在第一次调用后删除订阅。

I had the same problem that I resolved adding this two lines:我有同样的问题,我解决了添加这两行:

Advertisement.RemoveListener (this);
myButton.onClick.RemoveListener(ShowRewardedVideo);

after the conditional logic for each ad completion status.在每个广告完成状态的条件逻辑之后。 The complete event should be like this:完整的事件应该是这样的:

   public void OnUnityAdsDidFinish(string placementId, ShowResult showResult)
    {
        // Define conditional logic for each ad completion status:
        if (showResult == ShowResult.Finished)
        {
            // Reward the user for watching the ad to completion.
        }
        else if (showResult == ShowResult.Skipped)
        {
            // Do not reward the user for skipping the ad.

        }
        else if (showResult == ShowResult.Failed)
        {
            Debug.LogWarning("The ad did not finish due to an error.");
        }
        else
        {
            Debug.LogError("Error");
        }

        Advertisement.RemoveListener (this);
        myButton.onClick.RemoveListener(ShowRewardedVideo);
    }

I suggest to put the code even in the error event:我建议将代码放在错误事件中:

public void OnUnityAdsDidError (string message) 
{
    // Log the error.
    Advertisement.RemoveListener (this);
    myButton.onClick.RemoveListener(ShowRewardedVideo);        
}

I copied the code from unity website and so I was not sure what was going on.我从统一网站复制了代码,所以我不确定发生了什么。 But here is the solution.但这是解决方案。 We are subscribing to an event.我们正在订阅一个事件。 And every time this script was called at the start of the scene, another new event was getting subscribed.每次在场景开始时调用此脚本时,都会订阅另一个新事件。 So when you switch scene do "unsubscribe" to the event.因此,当您切换场景时,请“取消订阅”该事件。 And this issue will not happen.而且这个问题不会发生。

Well I solved this problem by calling OnDestry(), from OnUnityAdsShowStart(string adUnitId).好吧,我通过从 OnUnityAdsShowStart(string adUnitId) 调用 OnDestry() 解决了这个问题。 This gives appropriate follow and same amount of rewards on every click.这会在每次点击时提供适当的关注和相同数量的奖励。 )) ))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM