#c# #visual-studio #unity3d #methods #admob
#c# #visual-studio #unity3d #методы #admob
Вопрос:
В моем проекте полностью работает тестовая реклама AdMob. При просмотре рекламы должен выполняться приведенный ниже код, однако выполняется только первая строка, 2 другие строки игнорируются без ошибок.
public void HandleUserEarnedReward(object sender, Reward args)
{
GameControl.control.life = 1;
GameControl.control.Save();
txtLife.text = GameControl.control.life.ToString();
}
Я поместил тот же код в другой метод, который я запускаю с помощью кнопки для тестирования.
В этом случае выполняется полный метод.
public void runtest()
{
GameControl.control.life = 1;
GameControl.control.Save();
txtLife.text = GameControl.control.life.ToString();
}
Комментарии:
1. Код выглядит нормально. Как вы пришли к выводу, выполняется только первая строка. Он запускается и ничего не сохраняет? Вы пытались выполнить пошаговое выполнение (F10), и он пропускает строки?
2. Если вы сталкиваетесь с этим только при сборке игры — вы можете попробовать добавить Debug. Войдите, чтобы прочитать информацию из журналов, выполняется ли каждая строка.
3. Я пробовал разные вещи, такие как создание строк кода, выводящих сообщения на консоль, повторение первой строки кода. Метод всегда просто пропускает все, кроме первой строки. Это происходит как в редакторе Unity, так и в сборке на моем устройстве Android. Когда я выполняю отладку, step over (F10) для меня выделен серым цветом, поэтому я не могу щелкнуть, чтобы увидеть, что-то не так.
Ответ №1:
Если я не ошибаюсь, вы пытаетесь получить вознаграждение после просмотра пользователем видео с вознаграждением. Однажды у меня была такая же проблема, проблема в том, что функции, которые выполняются внутри «HandleUserEarnedReward», будут выполняться НЕ в главном потоке Unity, а в потоке SDK Google. Есть несколько решений:
-
https://github.com/PimDeWitte/UnityMainThreadDispatcher — Переключитесь на основной поток, используя это. Проверьте файл readme для получения дополнительной информации.
-
Создайте глобальные логические значения со значением false. Затем в «HandleUserEarnedReward» измените логическое значение «isRewarded» на true. Создайте функцию обновления для проверки логического значения. Что-то вроде:
void Update() { if (isRewarded) { // do all the actions // reward the player isRewarded = false; // to make sure this action will happen only once. } }
-
Используйте сопрограмму. Сопрограммы автоматически переключаются на основной поток Unity после «yield return»
public void HandleRewardBasedVideoRewarded(object sender, Reward args) { string type = args.Type; double amount = args.Amount; Debug.Log( "HandleRewardBasedVideoRewarded event received for " amount.ToString() " " type); StartCoroutine(AfunctionName()); } IEnumerator AfunctionName() { yield return new WaitForSecondsRealtime(0.1f); // FB.LogAppEvent("AdmobRewardedView"); Debug.Log("Reward Function Called!!!!!"); GiveReward(); this.RequestRewardBasedVideo(); }