Unity Ads 的 resultCallback 仅在视频播放完毕时奖励

resultCallback for Unity Ads to only reward if video finished

我最近在我的一个工作游戏中添加了统一广告,我想弄清楚如何使用奖励视频广告展示位置来确保我只在视频没有被跳过时才提供奖励。 我已经有 unity ads 了,这是我的代码:

private static bool PlayUnityVideoAd()
{
    string adString = PlayerPrefs.GetString ("UnityAds"+adName);
    if (Advertisement.isReady (adString)) {
        Advertisement.Show (adString, new ShowOptions {
            pause = true,
            resultCallback = result => {
                Debug.Log (result.ToString ())
            }
        });
        return true;
    }
    return false;
}

如果 ShowOptions.resultCallback 设置为已完成,我需要更改什么才能使函数仅 return 为真? 我试图将 Debug.Log 行替换为 return 来自开关的值,但它崩溃了。 我也感觉可能需要Advertisement.isShowing来确保等待视频结束,但我不知道如何实现它。 所以,我想要的结果是:
完成 => return true;
失败=> return false;
已跳过 => return false;

备注:
我正在使用 PlayerPrefs 来存储不同广告展示位置的 ID (adString)。
这是具有多个广告网络的级联的一部分,这就是为什么我希望它 return 真或假。

实际上,您的回答是错误的,因为 resultBool 变量将异步更新,如果广告可用,"return resultBool" 语句在您的情况下将始终 return 为真,而不是播放器完成视频。

一个好的实现是使用回调,一个你在某处创建的静态,甚至是一个你在参数中给出的动态事件。

它会是这样的:

private static void PlayUnityVideoAd(Callback<bool> onVideoPlayed)
{
    string adString = PlayerPrefs.GetString ("UnityAds" + adName);
    if (Advertisement.isReady (adString)) {
     Advertisement.Show (adString, new ShowOptions {
            pause = true,
            resultCallback = result => {
                switch(result)
                {
                case (ShowResult.Finished):
                    onVideoPlayed(true);
                    break;
                case (ShowResult.Failed):
                    onVideoPlayed(false);
                    break;
                case(ShowResult.Skipped):
                    onVideoPlayed(false);
                    break;
                }
            }
        });
    }
    onVideoPlayed(false);
}

请记住,您可能需要更新代码工作流程以保持原始行为和异步工作。所以不要做这样的事情:

void MyCodeWorkflow()
{
   //Doing somehing...
   bool result = PlayUnityVideoAd();
   if (result)
   {
     //Something
   }
   else
   {
     //Something else
   }
}

它将是:

public delegate void Callback<T>(T value);

void MyCodeWorkflow()
{
   //Doing somehing...
   PlayUnityVideoAd(delegate(bool result)
   {
     if (result)
     {
       //Something
     }
     else
     {
       //Something else
     }
   });
}