Search code examples
c#unity-game-engineunityads

Unity rewarded video ad registering multiple times. Unity Ads


This is my rewarded video script. It is attached to a UI button.

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. Any idea what is happening?


Solution

  • 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.