Unity вознаграждают видео рекламу, регистрирующуюся несколько раз Unity Ads - PullRequest
0 голосов
/ 05 января 2020

Это мой вознагражденный видео скрипт. Он прикреплен к кнопке 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 раз, кнопка регистрирует несколько нажатий. Есть идеи, что происходит?

Ответы [ 3 ]

1 голос
/ 08 марта 2020

У меня была та же проблема, что я решил, добавив эти две строки:

Advertisement.RemoveListener (this);
myButton.onClick.RemoveListener(ShowRewardedVideo);

после условного лога c для каждого статуса завершения объявления. Завершить событие должно быть так:

   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);        
}
1 голос
/ 06 января 2020

Я скопировал код с сайта Unity и поэтому не был уверен, что происходит. Но вот решение. Мы подписываемся на событие. И каждый раз, когда мы запускали этот сценарий в начале сцены, подписывалось новое событие. Поэтому, когда вы переключаете сцену, отмените подписку на событие. И проблема не произойдет.

0 голосов
/ 08 апреля 2020

Правильно тринадцать4054, для тех, у кого такая же проблема, возможное решение - добавить этот метод:

public void OnDestroy ()
{
   Advertisement.RemoveListener (this);
}

Таким образом, если вы go перейдете в другую сцену и вернетесь к ней будет подписан только последний созданный элемент.


@ Nicola, я бы не стал добавлять его в OnUnityAdsDidFini sh, поскольку тогда подписка будет удалена после первого вызова независимо от результата.

...