首页 > 解决方案 > unity 方法只运行第一行代码

问题描述

我已经在我的项目中完全运行 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();
}

标签: c#visual-studiounity3dmethodsadmob

解决方案


如果我没记错的话,您是在用户观看奖励视频后尝试给予奖励。我曾经遇到过同样的问题,问题是在“HandleUserEarnedReward”内部执行的函数不会在统一的 MainThread 上执行,而是在 Google 的 SDK 线程上执行。有几种解决方案:

  1. https://github.com/PimDeWitte/UnityMainThreadDispatcher - 使用这个切换到主线程。查看自述文件以获取更多信息。

  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. 使用协程。协程在“yield return”后自动切换到 Unity 的 MainThread

     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();
     }
    

推荐阅读