Как можно решить проблему дублирования рекламы в игре на Unity?

Я сделал два скрипта, один это скрипт менеджера рекламы, а второй это основная игровая логика, и почему то моя реклама с вознаграждением показывается дважды, но так быть не должно. Я уже пытался добавлять различные проверки чтобы этого не было, но к сожалению это не помогает, кто может помочь каким нибудь советом как это можно решить, буду очень рад! Чуть ниже оставляю код и инструкции к тому что он вообще делает.

AdmobAdsScript

using UnityEngine;
using GoogleMobileAds.Api;
using TMPro;
using UnityEngine.UI;
using System;

public class AdmobAdsScript : MonoBehaviour
{
    public string appId = "ca-app-pub-7863139588783304~4361746719";

#if UNITY_ANDROID
    string bannerId = "ca-app-pub-7863139588783304/2533044743";
    string interId = "ca-app-pub-7863139588783304/6066430804";
    string rewardedId = "ca-app-pub-7863139588783304/4254741402";
    string nativeId = "ca-app-pub-7863139588783304/5739127744";

#elif UNITY_IPHONE
    string bannerId = "ca-app-pub-3940256099942544/2934735716";
    string interId = "ca-app-pub-3940256099942544/4411468910";
    string rewardedId = "ca-app-pub-3940256099942544/1712485313";
    string nativeId = "ca-app-pub-3940256099942544/3986624511";

#endif

    RewardedAd rewardedAd;

    private void Start()
    {
        MobileAds.RaiseAdEventsOnUnityMainThread = true;
        MobileAds.Initialize(initStatus => {

            print("Ads Initialised !!");

        });

        LoadRewardedAd();
    }

    #region Rewarded

    public void LoadRewardedAd() {

        if (rewardedAd!=null)
        {
            rewardedAd.Destroy();
            rewardedAd = null;
        }
        var adRequest = new AdRequest();
        adRequest.Keywords.Add("unity-admob-sample");

        RewardedAd.Load(rewardedId, adRequest, (RewardedAd ad, LoadAdError error) =>
        {
            if (error != null || ad == null)
            {
                print("Rewarded failed to load"+error);
                return;
            }

            print("Rewarded ad loaded !!");
            rewardedAd = ad;
            RewardedAdEvents(rewardedAd);
        });
    }
    public void ShowRewardedAd() {

        if (rewardedAd != null && rewardedAd.CanShowAd())
        {
            rewardedAd.Show((Reward reward) =>
            {
                print("Give reward to player !!");

                GrantEnergy(60);

                LoadRewardedAd();
            });
        }
        else {
            print("Rewarded ad not ready");
        }
    }
    public void RewardedAdEvents(RewardedAd ad)
    {
        // Raised when the ad is estimated to have earned money.
        ad.OnAdPaid += (AdValue adValue) =>
        {
            Debug.Log("Rewarded ad paid {0} {1}."+
                adValue.Value+
                adValue.CurrencyCode);
        };
        // Raised when an impression is recorded for an ad.
        ad.OnAdImpressionRecorded += () =>
        {
            Debug.Log("Rewarded ad recorded an impression.");
        };
        // Raised when a click is recorded for an ad.
        ad.OnAdClicked += () =>
        {
            Debug.Log("Rewarded ad was clicked.");
        };
        // Raised when an ad opened full screen content.
        ad.OnAdFullScreenContentOpened += () =>
        {
            Debug.Log("Rewarded ad full screen content opened.");
        };
        // Raised when the ad closed full screen content.
        ad.OnAdFullScreenContentClosed += () =>
        {
            Debug.Log("Rewarded ad full screen content closed.");
        };
        // Raised when the ad failed to open full screen content.
        ad.OnAdFullScreenContentFailed += (AdError error) =>
        {
            Debug.LogError("Rewarded ad failed to open full screen content " +
                           "with error : " + error);
        };
    }

    #endregion

    #region extra 

    void GrantEnergy(int energy)
    {
        PlayerPrefs.SetInt("Energy", energy);
        PlayerPrefs.Save();
    }

    #endregion

}

NumberGenerate

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class NumberGenerate : MonoBehaviour
{
    public AdmobAdsScript Ads;

    private int ExitNumber;
    [Header("Выходное значение")]
    [SerializeField] public Text OutputNumberText;

    private static int Energy;
    [Header("Энергия")]
    [SerializeField] public Text EnergyText;

    [Header("Поделиться")]
    [SerializeField] private GameObject ShareButton;

    [Header("Секретный код")]
    [SerializeField] private Text YourCode;

    [Header("UI-кнопки")]
    [SerializeField] public GameObject[] UI;

    [Header("Music")]
    [SerializeField] private AudioClip[] CapibaraAudioClips;
    private AudioSource CapibaraAudio;

    private void Start()
    {
        CapibaraAudio = GetComponent<AudioSource>();
        Energy = PlayerPrefs.GetInt("Energy", 60);
        EnergyText.text = Energy.ToString();

        if (PlayerPrefs.GetInt("Win", 0) == 1)
        {
            ShowWinUI();
        }
        else
        {
            ExitNumber = 0;
            YourCode.gameObject.SetActive(false);
            ShareButton.SetActive(false);
            UI[1].SetActive(false);
            UI[2].SetActive(false);
        }

        EnergyText.text = Energy.ToString();
    }

    void Update()
    {
        EnergyText.text = Energy.ToString();
        EndEnergy();
    }

    public void Generate()
    {
        PlayRandomAudio();

        if (Energy > 0)
        {
            ExitNumber = Random.Range(1, 30000);
            OutputNumberText.text = ExitNumber.ToString();
            Energy--;
            PlayerPrefs.SetInt("Energy", Energy);
            PlayerPrefs.Save();

            if (ExitNumber == 15000)
            {
                WinNumber();
            }
        }
    }

    void WinNumber()
    {
        ShowWinUI();
        PlayerPrefs.SetInt("Win", 1);
        PlayerPrefs.Save();
    }

    void ShowWinUI()
    {
        UI[0].SetActive(false);
        UI[1].SetActive(true);
        UI[2].SetActive(true);
        OutputNumberText.text = "15000";
        YourCode.text = "Your code: " + "fD5JGm6A0aT0x13Y_2024";
        YourCode.gameObject.SetActive(true);
        ShareButton.SetActive(true);
    }

    public void EndEnergy()
    {
        if (Energy <= 0)
        {
            Ads.ShowRewardedAd();
            Energy = PlayerPrefs.GetInt("Energy", 60);
            EnergyText.text = Energy.ToString();
        }
    }

    private void PlayRandomAudio()
    {
        if (CapibaraAudioClips.Length > 0)
        {
            int randomIndex = Random.Range(0, CapibaraAudioClips.Length);
            CapibaraAudio.clip = CapibaraAudioClips[randomIndex];
            CapibaraAudio.Play();
        }
    }
}

Всё управление инициализацией/загрузкой рекламы выполняется в первом скрипте, во втором скрипте к кнопке привязывается функция Generate() которая при нажатии на кнопку выдает пользователю рандомное число, при этом отнимая 1 энергию, и если энергия становится меньше или равно нулю, то воспроизводится реклама с вознаграждением, а энергия восстанавливается до 60. Но сейчас когда энергия заканчивается и реклама воспроизводится, энергия после просмотра не восстанавливается, и сразу запускается вторая реклама, и только после второй рекламы энергия восполняется. Я уже перепробовал кучу способов, и ничего не помогает, не знаю что делать... буду благодарен за любой совет или критику как это можно исправить.


Ответы (1 шт):

Автор решения: Java Daddy

Проблема была решена когда я запустил билд игры на телефоне, а не в unity редакторе.

→ Ссылка