Метод Unity запускает только первую строку кода

#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. Есть несколько решений:

  1. https://github.com/PimDeWitte/UnityMainThreadDispatcher — Переключитесь на основной поток, используя это. Проверьте файл readme для получения дополнительной информации.

  2. Создайте глобальные логические значения со значением 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.
         }
    }
      
  1. Используйте сопрограмму. Сопрограммы автоматически переключаются на основной поток 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();
     }