我最近在一个正在运行的游戏中添加了统一广告,我想弄清楚如何使用奖励视频广告位置来确保我只在不跳过视频时提供奖励。 我已经有了统一广告,这是我的代码:
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
来确保等待视频结束,但我不知道如何实现它。
所以,我想要的结果是:
完成 => 返回 true;
失败 => 返回 false;
跳过 => 返回 false;
注释:
我使用 PlayerPrefs
存储不同广告展示位置的 ID (adString
)。
这是多个广告网络级联的一部分,这就是为什么我希望它返回 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
}
});
}
关于c# - Unity 广告的 resultCallback 仅在视频完成时奖励,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29137373/