Unity AppLovin Max Tutorial Fully Code

  1. Get Unity AppLovin Plug-in. In Unity, select Assets > Import Package > Custom Package….
2. Create public class AdsAppLovin

using System;
using System.Collections;
using System.Collections.Generic;

#if USE_APPLOVIN
//using AppLovinMax.Internal.API;
#endif

#if UNITY_IPHONE
using Unity.Advertisement.IosSupport;
#endif

using UnityEngine;

public class AdsAppLovin : MonoBehaviour
{

}
Declare Variables

    [Header("SDK INFORMATION")]
    [SerializeField] string SDK_KEY = "SDK KEY";
    [SerializeField] string USER_ID = "USER_ID";
    int retryAttempt;
    int retryAttemptReward;
    //
    bool isBannerShowing;
    bool isBannerLoaded;
    bool isIntersitialLoaded;
    bool isRewardedLoaded;
    // Start is called before the first frame update
    [Header("iOS PLACEMENT")]
    [SerializeField] string BANNER_IOS_ID;
    [SerializeField] string INTER_IOS_ID;
    // [SerializeField] string NATIVE_IOS_ID;
    [SerializeField] string REWARDED_IOS_ID;
    [Header("ANDROID PLACEMENT")]
    [SerializeField] string BANNER_ANDROID_ID;
    [SerializeField] string INTER_ANDROID_ID;
    //   [SerializeField] string NATIVE_ANDROID_ID;
    [SerializeField] string REWARDED_ANDROID_ID;
    [SerializeField] bool isAllowRewarded;
    private string BANNER_ID;
    private string INTER_ID;
    private string REWARDED_ID;

    public static AdsAppLovin THIS;

    public Action rewardAdsLoadedEvent;
    public Action rewardAdsHideEvent;
    public Action InitAdsEvent;
    public Action insterAdsLoadedEvent;
    public Action InsterAdsShowCompletedEvent;
    MaxSdkBase.AdViewPosition bannerPos;
Init AppLovin Service
 private void Awake()
    {
        if (THIS != null)
        {
            Destroy(THIS);
        }

        THIS = this;
        DontDestroyOnLoad(this);
    }

    public void InitAppLovinService()
    {
        isBannerLoaded = false;
        isIntersitialLoaded = false;
        isRewardedLoaded = false;

#if UNITY_ANDROID
        BANNER_ID = BANNER_ANDROID_ID;
        INTER_ID = INTER_ANDROID_ID;
        REWARDED_ID = REWARDED_ANDROID_ID;
#elif UNITY_IPHONE
        BANNER_ID = BANNER_IOS_ID;
        INTER_ID = INTER_IOS_ID;
        REWARDED_ID = REWARDED_IOS_ID;
#else
        BANNER_ID = BANNER_ANDROID_ID;
        INTER_ID = INTER_ANDROID_ID;
        REWARDED_ID = REWARDED_ANDROID_ID;
#endif

        Debug.Log("Start AppLovin SDK with BANNER_ID " + BANNER_ID);
        Debug.Log("Start AppLovin SDK with INTER_ID " + INTER_ID);

        MaxSdkCallbacks.OnSdkInitializedEvent += (MaxSdkBase.SdkConfiguration sdkConfiguration) =>
        {
            // AppLovin SDK is initialized, start loading ads
            //Debug.Log("AppLovin SDK is initialized, start loading ads");
            //   InitAdsEvent += SceneManager._This.startApp;
            InitializeInterstitialAds();
            if (isAllowRewarded) InitializeRewardedAds();
            if (InitAdsEvent != null) InitAdsEvent();

        };

        //MaxSdk.SetSdkKey(SDK_KEY);
        MaxSdk.SetHasUserConsent(true);
        MaxSdk.SetDoNotSell(true);
        MaxSdk.InitializeSdk();
        isBannerShowing = false;
    }

Show Banner Ads

    // BANNER
    public void showBanner()
    {
        MaxSdk.ShowBanner(BANNER_ID);
    }

    public void hideBanner()
    {
        // stopBannerAutoRefesh();

        MaxSdk.HideBanner(BANNER_ID);

    }

    public void destroyBanner()
    {
        MaxSdk.DestroyBanner(BANNER_ID);
    }

    public void loadBanner(MaxSdkBase.AdViewPosition pos)
    {
        bannerPos = pos;
        InitializeBannerAds();
    }

    public bool isBannerShow()
    {
        return isBannerShowing;
    }

    public void stopBannerAutoRefesh()
    {
        MaxSdk.StopBannerAutoRefresh(BANNER_ID);
    }


    private void InitializeBannerAds()
    {
        isBannerShowing = false;

        // Banners are automatically sized to 320×50 on phones and 728×90 on tablets
        // You may call the utility method MaxSdkUtils.isTablet() to help with view sizing adjustments
        MaxSdkBase.AdViewConfiguration adViewConfiguration = new MaxSdkBase.AdViewConfiguration(bannerPos);
        MaxSdk.CreateBanner(BANNER_ID, adViewConfiguration);

        // Set background or background color for banners to be fully functional
        MaxSdk.SetBannerBackgroundColor(BANNER_ID, Color.clear);

        MaxSdkCallbacks.Banner.OnAdLoadedEvent += OnBannerAdLoadedEvent;
        MaxSdkCallbacks.Banner.OnAdLoadFailedEvent += OnBannerAdLoadFailedEvent;
        MaxSdkCallbacks.Banner.OnAdClickedEvent += OnBannerAdClickedEvent;
        MaxSdkCallbacks.Banner.OnAdRevenuePaidEvent += OnBannerAdRevenuePaidEvent;
        MaxSdkCallbacks.Banner.OnAdExpandedEvent += OnBannerAdExpandedEvent;
        MaxSdkCallbacks.Banner.OnAdCollapsedEvent += OnBannerAdCollapsedEvent;
        MaxSdk.LoadBanner(BANNER_ID);
        showBanner();


    }

    private void OnBannerAdLoadedEvent(string adUnitId, MaxSdkBase.AdInfo adInfo)
    {
        //        Debug.Log("OnBannerAdLoadedEvent Load Banner success");

        isBannerShowing = true;
        isBannerLoaded = true;

    }

    private void OnBannerAdLoadFailedEvent(string adUnitId, MaxSdkBase.ErrorInfo errorInfo) { isBannerLoaded = false; }

    private void OnBannerAdClickedEvent(string adUnitId, MaxSdkBase.AdInfo adInfo) { }

    private void OnBannerAdRevenuePaidEvent(string adUnitId, MaxSdkBase.AdInfo adInfo) { }

    private void OnBannerAdExpandedEvent(string adUnitId, MaxSdkBase.AdInfo adInfo) { }

    private void OnBannerAdCollapsedEvent(string adUnitId, MaxSdkBase.AdInfo adInfo) { }

Show Interstitial Ads
// INTER

    public void showInterstitialAds()
    {
        MaxSdk.ShowInterstitial(INTER_ID);
    }

    public bool isInterstitialAdsReady()
    {
        return isIntersitialLoaded;
    }

    private void InitializeInterstitialAds()
    {
        // Attach callback
        MaxSdkCallbacks.Interstitial.OnAdLoadedEvent += OnInterstitialLoadedEvent;
        MaxSdkCallbacks.Interstitial.OnAdLoadFailedEvent += OnInterstitialLoadFailedEvent;
        MaxSdkCallbacks.Interstitial.OnAdDisplayedEvent += OnInterstitialDisplayedEvent;
        MaxSdkCallbacks.Interstitial.OnAdClickedEvent += OnInterstitialClickedEvent;
        MaxSdkCallbacks.Interstitial.OnAdHiddenEvent += OnInterstitialHiddenEvent;
        MaxSdkCallbacks.Interstitial.OnAdDisplayFailedEvent += OnInterstitialAdFailedToDisplayEvent;

        // Load the first interstitial
        LoadInterstitial();
    }

    private void LoadInterstitial()
    {

        MaxSdk.LoadInterstitial(INTER_ID);
    }

    private void OnInterstitialLoadedEvent(string adUnitId, MaxSdkBase.AdInfo adInfo)
    {
        // Interstitial ad is ready for you to show. MaxSdk.IsInterstitialReady(adUnitId) now returns 'true'

        // Reset retry attempt
        isIntersitialLoaded = true;
        if (insterAdsLoadedEvent != null)
        {
            insterAdsLoadedEvent();
            Debug.Log("Interstitial ad insterAdsLoadedEvent");
        }
        retryAttempt = 0;
    }

    private void OnInterstitialLoadFailedEvent(string adUnitId, MaxSdkBase.ErrorInfo errorInfo)
    {
        // Interstitial ad failed to load 
        // AppLovin recommends that you retry with exponentially higher delays, up to a maximum delay (in this case 64 seconds)
        isIntersitialLoaded = false;
        retryAttempt++;
        double retryDelay = Math.Pow(2, Math.Min(6, retryAttempt));

        Invoke("LoadInterstitial", (float)retryDelay);
    }

    private void OnInterstitialDisplayedEvent(string adUnitId, MaxSdkBase.AdInfo adInfo)
    {
        Time.timeScale = 0f;
    }

    private void OnInterstitialAdFailedToDisplayEvent(string adUnitId, MaxSdkBase.ErrorInfo errorInfo, MaxSdkBase.AdInfo adInfo)
    {
        // Interstitial ad failed to display. AppLovin recommends that you load the next ad.
        if (InsterAdsShowCompletedEvent != null) InsterAdsShowCompletedEvent();
        Time.timeScale = 1f;
        LoadInterstitial();
    }

    private void OnInterstitialClickedEvent(string adUnitId, MaxSdkBase.AdInfo adInfo) { Time.timeScale = 1f; }

    private void OnInterstitialHiddenEvent(string adUnitId, MaxSdkBase.AdInfo adInfo)
    {
        // Interstitial ad is hidden. Pre-load the next ad.
        if (InsterAdsShowCompletedEvent != null) InsterAdsShowCompletedEvent();
        Time.timeScale = 1f;
        LoadInterstitial();
    }
Show Rewarded Ads
// REWARDED

    Action<bool, int> rewaredCallBack;

    public void showRewardedVideo(Action<bool, int> callBack)
    {
        rewaredCallBack = callBack;

        MaxSdk.ShowRewardedAd(REWARDED_ID);
    }

    public void showRewardedVideo2()
    {

        rewaredCallBack = null;
        MaxSdk.ShowRewardedAd(REWARDED_ID);
    }


    public bool isAdsRewardedReady()
    {
        return isRewardedLoaded;
    }

    private void InitializeRewardedAds()
    {
        // Attach callback
        MaxSdkCallbacks.Rewarded.OnAdLoadedEvent += OnRewardedAdLoadedEvent;
        MaxSdkCallbacks.Rewarded.OnAdLoadFailedEvent += OnRewardedAdLoadFailedEvent;
        MaxSdkCallbacks.Rewarded.OnAdDisplayedEvent += OnRewardedAdDisplayedEvent;
        MaxSdkCallbacks.Rewarded.OnAdClickedEvent += OnRewardedAdClickedEvent;
        MaxSdkCallbacks.Rewarded.OnAdRevenuePaidEvent += OnRewardedAdRevenuePaidEvent;
        MaxSdkCallbacks.Rewarded.OnAdHiddenEvent += OnRewardedAdHiddenEvent;
        MaxSdkCallbacks.Rewarded.OnAdDisplayFailedEvent += OnRewardedAdFailedToDisplayEvent;
        MaxSdkCallbacks.Rewarded.OnAdReceivedRewardEvent += OnRewardedAdReceivedRewardEvent;

        // Load the first rewarded ad
        LoadRewardedAd();
    }

    private void LoadRewardedAd()
    {
        MaxSdk.LoadRewardedAd(REWARDED_ID);
    }

    private void OnRewardedAdLoadedEvent(string adUnitId, MaxSdkBase.AdInfo adInfo)
    {
        // Rewarded ad is ready for you to show. MaxSdk.IsRewardedAdReady(adUnitId) now returns 'true'.
        if (rewardAdsLoadedEvent != null)
        {
            rewardAdsLoadedEvent();
        }
        // Reset retry attempt
        isRewardedLoaded = true;
        retryAttemptReward = 0;
    }

    private void OnRewardedAdLoadFailedEvent(string adUnitId, MaxSdkBase.ErrorInfo errorInfo)
    {
        // Rewarded ad failed to load 
        // AppLovin recommends that you retry with exponentially higher delays, up to a maximum delay (in this case 64 seconds).
        isRewardedLoaded = false;
        retryAttemptReward++;
        double retryDelay = Math.Pow(2, Math.Min(6, retryAttemptReward));

        Invoke("LoadRewardedAd", (float)retryDelay);
    }

    private void OnRewardedAdDisplayedEvent(string adUnitId, MaxSdkBase.AdInfo adInfo)
    {
        Time.timeScale = 0f;
        isRewardedLoaded = false;
    }

    private void OnRewardedAdFailedToDisplayEvent(string adUnitId, MaxSdkBase.ErrorInfo errorInfo, MaxSdkBase.AdInfo adInfo)
    {
        // Rewarded ad failed to display. AppLovin recommends that you load the next ad.
        Time.timeScale = 1f;
        isRewardedLoaded = false;
        retryAttemptReward++;
        double retryDelay = Math.Pow(2, Math.Min(6, retryAttemptReward));

        Invoke("LoadRewardedAd", (float)retryDelay);
    }

    private void OnRewardedAdClickedEvent(string adUnitId, MaxSdkBase.AdInfo adInfo)
    {
        Time.timeScale = 1f;
    }

    private void OnRewardedAdHiddenEvent(string adUnitId, MaxSdkBase.AdInfo adInfo)
    {
        // Rewarded ad is hidden. Pre-load the next ad
        Time.timeScale = 1f;
        if (rewardAdsHideEvent != null)
        {
            rewardAdsHideEvent();
        }
        retryAttemptReward++;
        double retryDelay = Math.Pow(2, Math.Min(6, retryAttemptReward));

        Invoke("LoadRewardedAd", (float)retryDelay);
    }

    private void OnRewardedAdReceivedRewardEvent(string adUnitId, MaxSdk.Reward reward, MaxSdkBase.AdInfo adInfo)
    {
        // The rewarded ad displayed and the user should receive the reward.
        if (rewaredCallBack != null)
        {
            rewaredCallBack(true, 10);
        }
        Time.timeScale = 1f;

    }

    private void OnRewardedAdRevenuePaidEvent(string adUnitId, MaxSdkBase.AdInfo adInfo)
    {
        /*
        if (rewaredCallBack != null)
        {
            rewaredCallBack(true, 10);
        }
        Time.timeScale = 1f;
        */
    }