多次注册的 Unity 奖励视频广告。统一广告
Unity rewarded video ad registering multiple times. Unity Ads
这是我的奖励视频脚本。它附加到 UI
按钮。
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Advertisements;
using UnityEngine.SceneManagement;
[RequireComponent(typeof(Button))]
public class RewardedAdsButton : MonoBehaviour, IUnityAdsListener
{
#if UNITY_IOS
private string gameId = "1234567";
#elif UNITY_ANDROID
private string gameId = "7654321";
#endif
Button myButton;
public string myPlacementId = "rewardedVideo";
void Start()
{
myButton = GetComponent<Button>();
// Set interactivity to be dependent on the Placement’s status:
myButton.interactable = Advertisement.IsReady(myPlacementId);
// Map the ShowRewardedVideo function to the button’s click listener:
if (myButton) myButton.onClick.AddListener(ShowRewardedVideo);
// Initialize the Ads listener and service:
Advertisement.AddListener(this);
Advertisement.Initialize(gameId, true);
}
// Implement a function for showing a rewarded video ad:
void ShowRewardedVideo()
{
Advertisement.Show(myPlacementId);
}
// Implement IUnityAdsListener interface methods:
public void OnUnityAdsReady(string placementId)
{
// If the ready Placement is rewarded, activate the button:
if (placementId == myPlacementId)
{
myButton.interactable = true;
}
}
public void OnUnityAdsDidFinish(string placementId, ShowResult showResult)
{
// Define conditional logic for each ad completion status:
if (SceneManager.GetActiveScene().name == "GameplayScene")
{
if (showResult == ShowResult.Finished)
{
GameObject.Find("GameManager").GetComponent<GameManagerScript>().ResumeGame();
}
else if (showResult == ShowResult.Skipped)
{
SceneManager.LoadScene("MenuScene");
}
else if (showResult == ShowResult.Failed)
{
Debug.LogWarning("The ad did not finish due to an error.");
}
}
if(SceneManager.GetActiveScene().name == "CharacterScene")
{
if (showResult == ShowResult.Finished)
{
PlayerPrefs.SetInt("coin", PlayerPrefs.GetInt("coin", 0) + 50);
}
else if (showResult == ShowResult.Skipped)
{
//Do nothing.
}
else if (showResult == ShowResult.Failed)
{
Debug.LogWarning("The ad did not finish due to an error.");
}
}
}
public void OnUnityAdsDidError(string message)
{
// Log the error.
}
public void OnUnityAdsDidStart(string placementId)
{
// Optional actions to take when the end-users triggers an ad.
}
}
它应该只添加 50 个硬币,但至少添加 100 个或 50 次的倍数,按钮正在注册多次点击。知道发生了什么吗?
我从 unity 网站上复制了代码,所以我不确定发生了什么。但这是解决方案。我们正在订阅一个事件。每次在场景开始时调用此脚本,都会订阅另一个新事件。因此,当您切换场景时,请“取消订阅”该事件。而且不会出现这个问题。
我遇到了同样的问题,我解决了添加这两行:
Advertisement.RemoveListener (this);
myButton.onClick.RemoveListener(ShowRewardedVideo);
在每个广告完成状态的条件逻辑之后。
完整的事件应该是这样的:
public void OnUnityAdsDidFinish(string placementId, ShowResult showResult)
{
// Define conditional logic for each ad completion status:
if (showResult == ShowResult.Finished)
{
// Reward the user for watching the ad to completion.
}
else if (showResult == ShowResult.Skipped)
{
// Do not reward the user for skipping the ad.
}
else if (showResult == ShowResult.Failed)
{
Debug.LogWarning("The ad did not finish due to an error.");
}
else
{
Debug.LogError("Error");
}
Advertisement.RemoveListener (this);
myButton.onClick.RemoveListener(ShowRewardedVideo);
}
我建议把代码放在错误事件中:
public void OnUnityAdsDidError (string message)
{
// Log the error.
Advertisement.RemoveListener (this);
myButton.onClick.RemoveListener(ShowRewardedVideo);
}
thirteen4054是正确的,有同样问题的朋友,可能的解决方法是加上这个方法:
public void OnDestroy ()
{
Advertisement.RemoveListener (this);
}
这样,如果您转到另一个场景并return到它,只会订阅最后创建的元素。
@Nicola,我不会将它添加到 OnUnityAdsDidFinish,因为无论结果如何,订阅都会在第一次调用后被删除。
这是我的奖励视频脚本。它附加到 UI
按钮。
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Advertisements;
using UnityEngine.SceneManagement;
[RequireComponent(typeof(Button))]
public class RewardedAdsButton : MonoBehaviour, IUnityAdsListener
{
#if UNITY_IOS
private string gameId = "1234567";
#elif UNITY_ANDROID
private string gameId = "7654321";
#endif
Button myButton;
public string myPlacementId = "rewardedVideo";
void Start()
{
myButton = GetComponent<Button>();
// Set interactivity to be dependent on the Placement’s status:
myButton.interactable = Advertisement.IsReady(myPlacementId);
// Map the ShowRewardedVideo function to the button’s click listener:
if (myButton) myButton.onClick.AddListener(ShowRewardedVideo);
// Initialize the Ads listener and service:
Advertisement.AddListener(this);
Advertisement.Initialize(gameId, true);
}
// Implement a function for showing a rewarded video ad:
void ShowRewardedVideo()
{
Advertisement.Show(myPlacementId);
}
// Implement IUnityAdsListener interface methods:
public void OnUnityAdsReady(string placementId)
{
// If the ready Placement is rewarded, activate the button:
if (placementId == myPlacementId)
{
myButton.interactable = true;
}
}
public void OnUnityAdsDidFinish(string placementId, ShowResult showResult)
{
// Define conditional logic for each ad completion status:
if (SceneManager.GetActiveScene().name == "GameplayScene")
{
if (showResult == ShowResult.Finished)
{
GameObject.Find("GameManager").GetComponent<GameManagerScript>().ResumeGame();
}
else if (showResult == ShowResult.Skipped)
{
SceneManager.LoadScene("MenuScene");
}
else if (showResult == ShowResult.Failed)
{
Debug.LogWarning("The ad did not finish due to an error.");
}
}
if(SceneManager.GetActiveScene().name == "CharacterScene")
{
if (showResult == ShowResult.Finished)
{
PlayerPrefs.SetInt("coin", PlayerPrefs.GetInt("coin", 0) + 50);
}
else if (showResult == ShowResult.Skipped)
{
//Do nothing.
}
else if (showResult == ShowResult.Failed)
{
Debug.LogWarning("The ad did not finish due to an error.");
}
}
}
public void OnUnityAdsDidError(string message)
{
// Log the error.
}
public void OnUnityAdsDidStart(string placementId)
{
// Optional actions to take when the end-users triggers an ad.
}
}
它应该只添加 50 个硬币,但至少添加 100 个或 50 次的倍数,按钮正在注册多次点击。知道发生了什么吗?
我从 unity 网站上复制了代码,所以我不确定发生了什么。但这是解决方案。我们正在订阅一个事件。每次在场景开始时调用此脚本,都会订阅另一个新事件。因此,当您切换场景时,请“取消订阅”该事件。而且不会出现这个问题。
我遇到了同样的问题,我解决了添加这两行:
Advertisement.RemoveListener (this);
myButton.onClick.RemoveListener(ShowRewardedVideo);
在每个广告完成状态的条件逻辑之后。 完整的事件应该是这样的:
public void OnUnityAdsDidFinish(string placementId, ShowResult showResult)
{
// Define conditional logic for each ad completion status:
if (showResult == ShowResult.Finished)
{
// Reward the user for watching the ad to completion.
}
else if (showResult == ShowResult.Skipped)
{
// Do not reward the user for skipping the ad.
}
else if (showResult == ShowResult.Failed)
{
Debug.LogWarning("The ad did not finish due to an error.");
}
else
{
Debug.LogError("Error");
}
Advertisement.RemoveListener (this);
myButton.onClick.RemoveListener(ShowRewardedVideo);
}
我建议把代码放在错误事件中:
public void OnUnityAdsDidError (string message)
{
// Log the error.
Advertisement.RemoveListener (this);
myButton.onClick.RemoveListener(ShowRewardedVideo);
}
thirteen4054是正确的,有同样问题的朋友,可能的解决方法是加上这个方法:
public void OnDestroy ()
{
Advertisement.RemoveListener (this);
}
这样,如果您转到另一个场景并return到它,只会订阅最后创建的元素。
@Nicola,我不会将它添加到 OnUnityAdsDidFinish,因为无论结果如何,订阅都会在第一次调用后被删除。