Объявление Google admob отображается после многократного нажатия
Я использую Google AdMob для показа видеообъявлений с вознаграждением в моей игре. По окончании игры кнопка воспроизведения видео становится доступной. Если пользователь нажимает на это, открывается панель с вопросом: «Не хотите ли вы оживить проигрыватель, просмотрев рекламу». Есть два варианта: один - нажать «ОК», а другой - отменить «х». Проблема в том, что мне нужно несколько раз нажать «ОК», чтобы показывалась реклама. Иногда реклама вообще не отображается независимо от того, сколько раз я нажимаю «ок». Вот код, который у меня есть в adscript:
public class AdScript : MonoBehaviour
{
string App_ID = "ca-app-pub-123454545~12345678";
string Video_Ad_Id = "ca-app-pub-3940256099942544/5224354917";
private RewardedAd rewardedAd;
void Start()
{
MobileAds.Initialize(App_ID);
}
public void RequestRewardBasedVideo()
{
this.rewardedAd = new RewardedAd(Video_Ad_Id);
AdRequest request = new AdRequest.Builder().Build();
this.rewardedAd.LoadAd(request);
this.rewardedAd.OnAdLoaded += HandleRewardedAdLoaded;
this.rewardedAd.OnAdFailedToLoad += HandleRewardedAdFailedToLoad;
this.rewardedAd.OnAdOpening += HandleRewardedAdOpening;
this.rewardedAd.OnAdFailedToShow += HandleRewardedAdFailedToShow;
this.rewardedAd.OnUserEarnedReward += HandleUserEarnedReward;
this.rewardedAd.OnAdClosed += HandleRewardedAdClosed;
}
public void ShowVideoRewardAd()
{
if (this.rewardedAd.IsLoaded())
{
this.rewardedAd.Show();
}
}
public void HandleRewardedAdLoaded(object sender, EventArgs args)
{
MonoBehaviour.print("HandleRewardedAdLoaded event received");
}
public void HandleRewardedAdFailedToLoad(object sender, AdErrorEventArgs args)
{
MonoBehaviour.print(
"HandleRewardedAdFailedToLoad event received with message: "
+ args.Message);
}
public void HandleRewardedAdOpening(object sender, EventArgs args)
{
MonoBehaviour.print("HandleRewardedAdOpening event received");
}
public void HandleRewardedAdFailedToShow(object sender, AdErrorEventArgs args)
{
MonoBehaviour.print(
"HandleRewardedAdFailedToShow event received with message: "
+ args.Message);
}
public void HandleRewardedAdClosed(object sender, EventArgs args)
{
this.RequestRewardBasedVideo();
}
public void HandleUserEarnedReward(object sender, Reward args)
{
GameManager.instance.ReceiveReward();
}
}
Функция RequestRewardBasedVideo () добавляется к кнопке воспроизведения видео, а ShowVideoRewardAd () добавляется к кнопке «ok». Тестовые объявления отображаются правильно, но проблема в том, что мне нужно несколько раз нажать кнопку ОК, чтобы объявление отобразилось. Я не уверен, почему это происходит. Может кто-нибудь помочь?
Ответы
Загрузка рекламы может занять некоторое время. Мол, надолго. Фактически, до тех пор, пока я обычно начинаю загружать свое первое объявление при запуске приложения и начинаю загружать следующее объявление сразу же после того, как предыдущее объявление заканчивается.
Я предполагаю, что это:
public void ShowVideoRewardAd()
{
if (this.rewardedAd.IsLoaded())
{
this.rewardedAd.Show();
}
}
просто пропускает вызов, чтобы показывать снова и снова каждый раз, когда вы нажимаете кнопку, пока объявление не загрузится.
Я предлагаю даже не показывать возможность просмотра рекламы, если IsLoaded не вернет true. Кроме того, вы можете открыть диалоговое окно «Подождите», когда пользователь коснется видео, если IsLoaded имеет значение false, и дождитесь вызова HandleRewardedAdLoaded или HandleRewardedAdFailedToLoad.
Я сделаю здесь безумную догадку (точнее, две догадки).
Первое предположение состоит в том, что структура рекламы еще не полностью инициализирована после попытки загрузить свое первое объявление. Основываясь на документации , кажется, что вы можете передать обратный вызов объекту MobileAds.Initialize();
, который будет вызываться после завершения инициализации. Вам нужно будет дождаться завершения инициализации, прежде чем запрашивать ваши первые объявления. На первый взгляд документация относительно того, как это сделать, довольно плохая, поэтому я предлагаю вам копнуть немного дальше, чтобы узнать больше о том, как вы могли бы этого добиться.
Второе предположение заключается в том, что вы пытаетесь загрузить рекламу до того, как настроите обработчики событий. Если мы еще раз посмотрим на документацию , окажется, что они обращаются к
// Create an empty ad request.
AdRequest request = new AdRequest.Builder().Build();
// Load the rewarded ad with the request.
this.rewardedAd.LoadAd(request);
после того, как они настроили слушателей событий. Предполагается, что как только вы запрашиваете его у «LoadAd», фреймворк извлекает список слушателей в этот момент, выполняет с ним асинхронную работу и вызывает методы, которые вы предоставили в момент вызова. В момент вызова LoadAd слушателей не было, поэтому, возможно, именно поэтому вы видите, что «ничего не происходит», и вам нужно «коснуться несколько раз», потому что с первой попытки слушателей нет, и слушатели будут там только на второй раз.