【问题标题】:resultCallback for Unity Ads to only reward if video finished用于 Unity 广告的 resultCallback 仅在视频播放完毕时进行奖励
【发布时间】:2015-03-19 04:45:21
【问题描述】:

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

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 设置为已完成,我需要更改什么以使函数仅返回 true? 我试图用一条线替换Debug.Log 线以从开关返回一个值,但它使统一崩溃。 我也有一种感觉,可能需要Advertisement.isShowing 以确保等待视频结束,但我不知道如何实现它。 所以,我想要的结果是:
完成 => return true;
失败 => return false;
跳过 => return false;

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

【问题讨论】:

    标签: c# video unity3d ads


    【解决方案1】:

    其实你的回答是错误的,因为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
         }
       });
    }
    

    【讨论】:

    • 非常感谢。我想知道为什么 UnityAds 网站说没有跳过任何视频。
    • Juste 用一些实现精度更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多