Unity 奖励视频广告多次注册。统一广告

Posted

技术标签:

【中文标题】Unity 奖励视频广告多次注册。统一广告【英文标题】:Unity rewarded video ad registering multiple times. Unity Ads 【发布时间】:2020-04-23 12:18:48 【问题描述】:

这是我的奖励视频脚本。它附加到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 次的倍数,该按钮正在记录多次点击。知道发生了什么吗?

【问题讨论】:

使用广告创收并不是视频游戏的主题。如果你的游戏还不足以靠自己赚钱,而不仅仅是一款出色的游戏,那么你就不应该制作游戏。将此视为建设性的批评。如果您想在人群中脱颖而出,请不要使用广告。 我不明白你的意思。你是说游戏不应该免费玩,或者如果是的话,它应该要求玩家购买东西以在游戏中获得优势?而不是投放广告。任何事情的重点。 【参考方案1】:

是正确的thirteen4054,对于有同样问题的人,一个可能的解决方案是添加这个方法:

public void OnDestroy ()

   Advertisement.RemoveListener (this);

这样,如果你去另一个场景并返回它,只会订阅最后创建的元素。


@Nicola,我不会将其添加到 OnUnityAdsDidFinish 中,因为无论结果如何,第一次调用后订阅都会被删除。

【讨论】:

【参考方案2】:

我遇到了同样的问题,我通过添加这两行来解决:

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);        

【讨论】:

【参考方案3】:

我从统一网站复制了代码,所以我不确定发生了什么。但这是解决方案。我们正在订阅一个事件。每次在场景开始时调用此脚本时,都会订阅另一个新事件。因此,当您切换场景时,请“取消订阅”该事件。而且这个问题不会发生。

【讨论】:

以上是关于Unity 奖励视频广告多次注册。统一广告的主要内容,如果未能解决你的问题,请参考以下文章

Unity + Admob奖励广告:活动没有解雇

应用购买中的“移除广告”应该删除奖励广告以及横幅广告和插页式广告吗?

如何限制奖励视频广告长度(admob)?

Android - 奖励视频广告在应用关闭后不再加载

Admob奖励视频广告

基于 iOS ADMOB 奖励的视频广告加载失败