Как можно решить проблему дублирования рекламы в игре на 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 шт):
Проблема была решена когда я запустил билд игры на телефоне, а не в unity редакторе.