Unity广告的结果回复仅在视频完成后才会奖励

时间:2015-03-19 04:45:21

标签: c# video unity3d advertisement

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

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;
Skipped => return false;

注意:
我使用PlayerPrefs来存储不同广告展示位置的ID(adString) 这是具有多个广告网络的级联的一部分,这就是我希望它返回真或假的原因。

1 个答案:

答案 0 :(得分:3)

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