我最近在我的工作游戏中添加了统一广告,我想知道如何使用奖励的视频广告展示位置,以确保我只在不跳过视频时给予奖励。 我已经有了统一广告,这是我的代码:
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
)
这是具有多个广告网络的级联的一部分,这就是我希望它返回真或假的原因。
答案 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
}
});
}