繁体   English   中英

resultCallback for Unity Ads仅在视频结束时奖励

[英]resultCallback for Unity Ads to only reward if video finished

我最近在自己的一款工作游戏中添加了统一广告,我想弄清楚如何使用奖励视频广告展示位置来确保仅在不跳过视频的情况下给予奖励。 我已经可以使用统一广告,这是我的代码:

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设置为Finished,我该如何更改才能使函数仅返回true? 我尝试将Debug.Log行替换为从开关返回值的行,但是它崩溃了。 我也觉得可能需要Advertisement.isShowing来确保等待视频结束,但是我不知道如何实现。 因此,我想要的结果是:
完成=> return true;
失败=> return false;
跳过=> return false;

笔记:
我正在使用PlayerPrefs存储不同广告展示位置( adString )的ID。
这是具有多个广告网络的级联的一部分,这就是为什么我希望它返回true或false。

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

一个好的实现是使用回调,您在某处创建的静态或什至要在参数中提供的动态事件。

就像这样:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM