Search code examples
c#unity-game-engineadsrewardedvideoad

Rewarded Ads give multiple rewards instead of one (Video in the description)


I used the code from Unity and the rewards are multiples... first 1 then 2 then 3 and increasing... i tried deleting some code, but keep doing the same, then this happened.

I searched online and i couldn't find anything that explains clicking the rewarded ads button more than once.

Everything (apparently) is working fine only if i don't assing a button and leave the "SerializeField" empty, because if i remove the button, goes back to give more rewards... can somebody check this and tell me what's going on? i add the code Here

    using UnityEngine;
    using UnityEngine.Advertisements;
    using UnityEngine.UI;
    
    public class AdsInitializer : MonoBehaviour, IUnityAdsInitializationListener, IUnityAdsLoadListener, IUnityAdsShowListener
    {
        [SerializeField] string _androidGameId = "4634758";
        [SerializeField] string _iOSGameId = "4634759";
        [SerializeField] bool _testMode = false;
        private string _gameId;
    
        [SerializeField] Button _showAdButton;
        [SerializeField] string rewardAndroidAdUnitId = "Rewarded_Android";
        [SerializeField] string rewardiOSAdUnitId = "Rewarded_iOS";
        string rewardAdUnitId = null; // This will remain null for unsupported platforms
    
        void Awake()
        {
            _gameId = (Application.platform == RuntimePlatform.IPhonePlayer)
                ? _iOSGameId
                : _androidGameId;
    
            rewardAdUnitId = (Application.platform == RuntimePlatform.IPhonePlayer)
                        ? rewardiOSAdUnitId
                        : rewardAndroidAdUnitId;
    
            Advertisement.Initialize(_gameId, _testMode, this);
    
            rewardAdUnitId = (Application.platform == RuntimePlatform.IPhonePlayer)
                        ? rewardiOSAdUnitId
                        : rewardAndroidAdUnitId;
    
        }
    
        public void OnInitializationComplete()
        {
            Debug.Log("Unity Ads initialization complete.");
            LoadRewardedAd();
        }
    
        public void OnInitializationFailed(UnityAdsInitializationError error, string message)
        {
            Debug.Log($"Unity Ads Initialization Failed: {error.ToString()} - {message}");
        }
    
        #region REWARDED ADS
    
        public void LoadRewardedAd()
        {
            Debug.Log("Loading Ad: " + rewardAdUnitId);
            Advertisement.Load(rewardAdUnitId, this);
        }
    
        public void ShowRewardedAd()
        {
            Advertisement.Show(rewardAdUnitId, this);
        }
    
        #endregion
    
    
        public void OnUnityAdsAdLoaded(string adUnitId)
        {
            if (adUnitId.Equals(rewardAdUnitId))
            {
                // Configure the button to call the ShowAd() method when clicked:
                //_showAdButton.onClick.AddListener(ShowRewardedAd);
                // Enable the button for users to click:
                //_showAdButton.interactable = true;
                Debug.Log("RewardedAds Loaded");
            }
        }
    
        public void OnUnityAdsShowComplete(string adUnitId, UnityAdsShowCompletionState showCompletionState)
        {
            if (adUnitId.Equals(rewardAdUnitId) && showCompletionState.Equals(UnityAdsShowCompletionState.COMPLETED))
            {
                Debug.Log("Unity Ads Rewarded Ad Completed");
                // Grant a reward.
                _showAdButton.onClick.RemoveAllListeners(); //with this line of code the problem is solved but shows the NullReference.
                // Load another ad:
                Advertisement.Load(rewardAdUnitId, this);
            }
        }
    
        public void OnUnityAdsFailedToLoad(string adUnitId, UnityAdsLoadError error, string message)
        {
            if (adUnitId.Equals(rewardAdUnitId))
            {
                Debug.Log($"Error loading Ad Unit {adUnitId}: {error.ToString()} - {message}");
            }
        }
    
        public void OnUnityAdsShowFailure(string adUnitId, UnityAdsShowError error, string message)
        {
            if (adUnitId.Equals(rewardAdUnitId))
            {
                Debug.Log($"Error showing Ad Unit {adUnitId}: {error.ToString()} - {message}");
            }
        }
    
        public void OnUnityAdsShowStart(string adUnitId) { }
        public void OnUnityAdsShowClick(string adUnitId) { }
    
        void OnDestroy()
        {
            //with or without it doesn't change, it works only when the game is closed, and when reopen is working the same
            //_showAdButton.onClick.RemoveAllListeners(); 
        }

}

Solution

  • SOLVED!!

    So, basically the script from Unity somehow has an unknown error, i couldn't explain myself how or from where... so the solution i fould was to add a bool in this case showAd = false and implemented it inside the showAd and the OnUnityAdsShowComplete functions, fortunatelly that was enough to solve the issue, now I can put the script in the button or in an AdManager and call the funtion from the button in the section OnClick() either way now is not showing neither error neither multiples with the rewards.


    Hope it will be usefull for someone else.


    using UnityEngine;
    using UnityEngine.Advertisements;
    using UnityEngine.UI;
    
    public class AdsInitializer : MonoBehaviour, IUnityAdsInitializationListener, IUnityAdsLoadListener, IUnityAdsShowListener
    {
        [SerializeField] string _androidGameId = "4634758";
        [SerializeField] string _iOSGameId = "4634759";
        [SerializeField] bool _testMode = true;
        private string _gameId;
    
        [SerializeField] Button _showAdButton; //You can remove this if want to add the function manually from OnClick()
        [SerializeField] string _androidAdUnitId = "Rewarded_Android";
        [SerializeField] string _iOSAdUnitId = "Rewarded_iOS";
        string _adUnitId = null; // This will remain null for unsupported platforms
    
        private bool showAd = false;
    
    
        void Awake()
        {
            InitializeAds();
    
            Debug.Log("Awake");
            _adUnitId = (Application.platform == RuntimePlatform.IPhonePlayer)
                ? _iOSAdUnitId
                : _androidAdUnitId;
    
            Debug.Log("the _adUnitId is: " + _adUnitId);
        }
    
        public void InitializeAds()
        {
            _gameId = (Application.platform == RuntimePlatform.IPhonePlayer)
                ? _iOSGameId
                : _androidGameId;
            Advertisement.Initialize(_gameId, _testMode, this);
    
        }
    
        public void OnInitializationComplete()
        {
            Debug.Log("Unity Ads initialization complete.");
            LoadAd();
        }
    
        public void OnInitializationFailed(UnityAdsInitializationError error, string message)
        {
            Debug.Log($"Unity Ads Initialization Failed: {error.ToString()} - {message}");
        }
    
        public void LoadAd()
        {
            // IMPORTANT! Only load content AFTER initialization (in this example, initialization is handled on top of the script).
            Debug.Log("Loading Ad: " + _adUnitId);
            Advertisement.Load(_adUnitId, this);
        }
    
        // If the ad successfully loads, add a listener to the button and enable it:
        public void OnUnityAdsAdLoaded(string adUnitId)
        {
            Debug.Log("Ad Loaded: " + adUnitId);
    
            if (adUnitId.Equals(_adUnitId))
            {
                // Configure the button to call the ShowAd() method when clicked:
                _showAdButton.onClick.AddListener(ShowAd); //You can remove this if want to add the function manually from OnClick()
                // Enable the button for users to click:
                _showAdButton.interactable = true; //You can remove this if want to add the function manually from OnClick()
            }
        }
    
        // Implement a method to execute when the user clicks the button:
        public void ShowAd()
        {
            if (showAd == false)
            {
                Debug.Log("Showing Ad");
                // Disable the button:
                _showAdButton.interactable = false; //You can remove this if want to add the function manually from OnClick()
                // Then show the ad:
                Advertisement.Show(_adUnitId, this);
                _showAdButton.onClick.RemoveAllListeners(); //You can remove this if want to add the function manually from OnClick()
                Debug.Log("All Listeners Removed");
                showAd = true;
            }
        }
    
        // Implement the Show Listener's OnUnityAdsShowComplete callback method to determine if the user gets a reward:
        public void OnUnityAdsShowComplete(string adUnitId, UnityAdsShowCompletionState showCompletionState)
        {
            if (showAd == true)
            {
                if (adUnitId.Equals(_adUnitId) && showCompletionState.Equals(UnityAdsShowCompletionState.COMPLETED))
                {
                    Debug.Log("Unity Ads Rewarded Ad Completed");
                    // Grant a reward.
    
                    // Load another ad:
                    Advertisement.Load(_adUnitId, this);
                    showAd = false;
    
                }
            }
        }
    
        public void OnUnityAdsFailedToLoad(string adUnitId, UnityAdsLoadError error, string message)
        {
            Debug.Log($"Error loading Ad Unit {adUnitId}: {error.ToString()} - {message}");
            // Use the error details to determine whether to try to load another ad.
        }
    
        public void OnUnityAdsShowFailure(string adUnitId, UnityAdsShowError error, string message)
        {
            Debug.Log($"Error showing Ad Unit {adUnitId}: {error.ToString()} - {message}");
            // Use the error details to determine whether to try to load another ad.
        }
    
        public void OnUnityAdsShowStart(string adUnitId) { }
        public void OnUnityAdsShowClick(string adUnitId) { }
    }