'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(); 
        }

}


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source