using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class AdTest : MonoBehaviour { [Header("Rewarded")] [SerializeField] private string androidRewardedAdUnitId = "c6c49a100de8496c"; [SerializeField] private string iosRewardedAdUnitId = "ec3c8fd688cdb5e2"; [Header("Interstitial")] [SerializeField] private string androidInterstitialAdUnitId = "0dcd37fa0885aa1f"; [SerializeField] private string iosInterstitialAdUnitId = "interstitial_test_ios"; [Header("UI")] [SerializeField] private Button initMaxButton; [SerializeField] private Button loadRewardedButton; [SerializeField] private Button showRewardedButton; [SerializeField] private Button forceShowRewardedButton; [SerializeField] private Button checkRewardedReadyButton; [SerializeField] private Button loadInterstitialButton; [SerializeField] private Button showInterstitialButton; [SerializeField] private Button forceShowInterstitialButton; [SerializeField] private Button checkInterstitialReadyButton; [SerializeField] private Button mediationDebuggerButton; [SerializeField] private Button clearLogButton; [SerializeField] private Text logText; private const int MaxLogLines = 80; private readonly List logLines = new List(); private bool callbacksRegistered; private bool sdkInitializeRequested; private int rewardedLoadFailCount; private int interstitialLoadFailCount; private string RewardedAdUnitId { get { #if UNITY_IOS return iosRewardedAdUnitId; #else return androidRewardedAdUnitId; #endif } } private string InterstitialAdUnitId { get { #if UNITY_IOS return iosInterstitialAdUnitId; #else return androidInterstitialAdUnitId; #endif } } public void Configure( Button initMax, Button loadRewarded, Button showRewarded, Button forceShowRewarded, Button checkRewardedReady, Button loadInterstitial, Button showInterstitial, Button forceShowInterstitial, Button checkInterstitialReady, Button mediationDebugger, Button clearLog, Text output) { initMaxButton = initMax; loadRewardedButton = loadRewarded; showRewardedButton = showRewarded; forceShowRewardedButton = forceShowRewarded; checkRewardedReadyButton = checkRewardedReady; loadInterstitialButton = loadInterstitial; showInterstitialButton = showInterstitial; forceShowInterstitialButton = forceShowInterstitial; checkInterstitialReadyButton = checkInterstitialReady; mediationDebuggerButton = mediationDebugger; clearLogButton = clearLog; logText = output; } private void Start() { Bind(initMaxButton, InitMax); Bind(loadRewardedButton, LoadRewarded); Bind(showRewardedButton, ShowRewarded); Bind(forceShowRewardedButton, ForceShowRewarded); Bind(checkRewardedReadyButton, CheckRewardedReady); Bind(loadInterstitialButton, LoadInterstitial); Bind(showInterstitialButton, ShowInterstitial); Bind(forceShowInterstitialButton, ForceShowInterstitial); Bind(checkInterstitialReadyButton, CheckInterstitialReady); Bind(mediationDebuggerButton, ShowMediationDebugger); Bind(clearLogButton, ClearLog); AppendLog("AdTest ready."); } private void OnDestroy() { if (!callbacksRegistered) { return; } MaxSdkCallbacks.OnSdkInitializedEvent -= OnSdkInitialized; MaxSdkCallbacks.Rewarded.OnAdLoadedEvent -= OnRewardedAdLoaded; MaxSdkCallbacks.Rewarded.OnAdLoadFailedEvent -= OnRewardedAdLoadFailed; MaxSdkCallbacks.Rewarded.OnAdDisplayedEvent -= OnRewardedAdDisplayed; MaxSdkCallbacks.Rewarded.OnAdDisplayFailedEvent -= OnRewardedAdDisplayFailed; MaxSdkCallbacks.Rewarded.OnAdHiddenEvent -= OnRewardedAdHidden; MaxSdkCallbacks.Rewarded.OnAdReceivedRewardEvent -= OnRewardedAdReceivedReward; MaxSdkCallbacks.Rewarded.OnAdRevenuePaidEvent -= OnRewardedAdRevenuePaid; MaxSdkCallbacks.Interstitial.OnAdLoadedEvent -= OnInterstitialAdLoaded; MaxSdkCallbacks.Interstitial.OnAdLoadFailedEvent -= OnInterstitialAdLoadFailed; MaxSdkCallbacks.Interstitial.OnAdDisplayedEvent -= OnInterstitialAdDisplayed; MaxSdkCallbacks.Interstitial.OnAdDisplayFailedEvent -= OnInterstitialAdDisplayFailed; MaxSdkCallbacks.Interstitial.OnAdHiddenEvent -= OnInterstitialAdHidden; MaxSdkCallbacks.Interstitial.OnAdRevenuePaidEvent -= OnInterstitialAdRevenuePaid; } private void Bind(Button button, Action action) { if (button == null) { return; } button.onClick.AddListener(() => action()); } public void InitMax() { RegisterCallbacks(); if (sdkInitializeRequested) { AppendLog("MAX initialization already requested."); return; } sdkInitializeRequested = true; MaxSdk.SetHasUserConsent(true); MaxSdk.SetDoNotSell(false); #if UNITY_IOS MaxSdk.SetExtraParameter("disable_b2b_ad_unit_ids", "ec3c8fd688cdb5e2,00442f7962682a80"); #else MaxSdk.SetExtraParameter("disable_b2b_ad_unit_ids", "c6c49a100de8496c,0dcd37fa0885aa1f"); #endif MaxSdk.InitializeSdk(); AppendLog("MAX initialization requested."); } public void LoadRewarded() { EnsureInitialized(); AppendLog($"Load rewarded: {RewardedAdUnitId}"); MaxSdk.LoadRewardedAd(RewardedAdUnitId); } public void ShowRewarded() { EnsureInitialized(); bool isReady = MaxSdk.IsRewardedAdReady(RewardedAdUnitId); AppendLog($"Show rewarded requested. IsReady={isReady}"); if (isReady) { MaxSdk.ShowRewardedAd(RewardedAdUnitId); return; } LoadRewarded(); } public void ForceShowRewarded() { EnsureInitialized(); AppendLog($"Force show rewarded without ready check: {RewardedAdUnitId}"); MaxSdk.ShowRewardedAd(RewardedAdUnitId); } public void CheckRewardedReady() { EnsureInitialized(); bool isReady = MaxSdk.IsRewardedAdReady(RewardedAdUnitId); AppendReadyCheck("Rewarded", RewardedAdUnitId, isReady); } public void LoadInterstitial() { EnsureInitialized(); if (string.IsNullOrEmpty(InterstitialAdUnitId)) { AppendWarning("Interstitial ad unit ID is empty."); return; } AppendLog($"Load interstitial: {InterstitialAdUnitId}"); MaxSdk.LoadInterstitial(InterstitialAdUnitId); } public void ShowInterstitial() { EnsureInitialized(); if (string.IsNullOrEmpty(InterstitialAdUnitId)) { AppendWarning("Interstitial ad unit ID is empty."); return; } bool isReady = MaxSdk.IsInterstitialReady(InterstitialAdUnitId); AppendLog($"Show interstitial requested. IsReady={isReady}"); if (isReady) { MaxSdk.ShowInterstitial(InterstitialAdUnitId); return; } LoadInterstitial(); } public void ForceShowInterstitial() { EnsureInitialized(); if (string.IsNullOrEmpty(InterstitialAdUnitId)) { AppendWarning("Interstitial ad unit ID is empty."); return; } AppendLog($"Force show interstitial without ready check: {InterstitialAdUnitId}"); MaxSdk.ShowInterstitial(InterstitialAdUnitId); } public void CheckInterstitialReady() { EnsureInitialized(); if (string.IsNullOrEmpty(InterstitialAdUnitId)) { AppendWarning("Interstitial ad unit ID is empty."); return; } bool isReady = MaxSdk.IsInterstitialReady(InterstitialAdUnitId); AppendReadyCheck("Interstitial", InterstitialAdUnitId, isReady); } public void ClearLog() { logLines.Clear(); if (logText != null) { logText.text = string.Empty; } } public void ShowMediationDebugger() { AppendLog("Show mediation debugger requested."); MaxSdk.ShowMediationDebugger(); } private void EnsureInitialized() { if (!sdkInitializeRequested) { InitMax(); } } private void RegisterCallbacks() { if (callbacksRegistered) { return; } callbacksRegistered = true; MaxSdkCallbacks.OnSdkInitializedEvent += OnSdkInitialized; MaxSdkCallbacks.Rewarded.OnAdLoadedEvent += OnRewardedAdLoaded; MaxSdkCallbacks.Rewarded.OnAdLoadFailedEvent += OnRewardedAdLoadFailed; MaxSdkCallbacks.Rewarded.OnAdDisplayedEvent += OnRewardedAdDisplayed; MaxSdkCallbacks.Rewarded.OnAdDisplayFailedEvent += OnRewardedAdDisplayFailed; MaxSdkCallbacks.Rewarded.OnAdHiddenEvent += OnRewardedAdHidden; MaxSdkCallbacks.Rewarded.OnAdReceivedRewardEvent += OnRewardedAdReceivedReward; MaxSdkCallbacks.Rewarded.OnAdRevenuePaidEvent += OnRewardedAdRevenuePaid; MaxSdkCallbacks.Interstitial.OnAdLoadedEvent += OnInterstitialAdLoaded; MaxSdkCallbacks.Interstitial.OnAdLoadFailedEvent += OnInterstitialAdLoadFailed; MaxSdkCallbacks.Interstitial.OnAdDisplayedEvent += OnInterstitialAdDisplayed; MaxSdkCallbacks.Interstitial.OnAdDisplayFailedEvent += OnInterstitialAdDisplayFailed; MaxSdkCallbacks.Interstitial.OnAdHiddenEvent += OnInterstitialAdHidden; MaxSdkCallbacks.Interstitial.OnAdRevenuePaidEvent += OnInterstitialAdRevenuePaid; } private void OnSdkInitialized(MaxSdkBase.SdkConfiguration configuration) { AppendLog($"MAX initialized. Success={configuration.IsSuccessfullyInitialized}"); } private void OnRewardedAdLoaded(string adUnitId, MaxSdkBase.AdInfo adInfo) { rewardedLoadFailCount = 0; AppendLog($"Rewarded loaded callback: {adUnitId}"); bool isReady = MaxSdk.IsRewardedAdReady(adUnitId); AppendReadyCheck("Rewarded", adUnitId, isReady); } private void OnRewardedAdLoadFailed(string adUnitId, MaxSdkBase.ErrorInfo errorInfo) { rewardedLoadFailCount++; AppendWarning($"Rewarded load failed: {adUnitId}, attempt={rewardedLoadFailCount}, message={errorInfo.Message}"); } private void OnRewardedAdDisplayed(string adUnitId, MaxSdkBase.AdInfo adInfo) { AppendLog($"Rewarded displayed: {adUnitId}"); } private void OnRewardedAdDisplayFailed(string adUnitId, MaxSdkBase.ErrorInfo errorInfo, MaxSdkBase.AdInfo adInfo) { AppendWarning($"Rewarded display failed: {adUnitId}, message={errorInfo.Message}"); LoadRewarded(); } private void OnRewardedAdHidden(string adUnitId, MaxSdkBase.AdInfo adInfo) { AppendLog($"Rewarded hidden: {adUnitId}"); LoadRewarded(); } private void OnRewardedAdReceivedReward(string adUnitId, MaxSdkBase.Reward reward, MaxSdkBase.AdInfo adInfo) { AppendLog($"Rewarded received reward: {adUnitId}, label={reward.Label}, amount={reward.Amount}"); } private void OnRewardedAdRevenuePaid(string adUnitId, MaxSdkBase.AdInfo adInfo) { AppendLog($"Rewarded revenue paid: {adUnitId}, revenue={adInfo.Revenue}"); } private void OnInterstitialAdLoaded(string adUnitId, MaxSdkBase.AdInfo adInfo) { interstitialLoadFailCount = 0; AppendLog($"Interstitial loaded callback: {adUnitId}"); bool isReady = MaxSdk.IsInterstitialReady(adUnitId); AppendReadyCheck("Interstitial", adUnitId, isReady); } private void OnInterstitialAdLoadFailed(string adUnitId, MaxSdkBase.ErrorInfo errorInfo) { interstitialLoadFailCount++; AppendWarning($"Interstitial load failed: {adUnitId}, attempt={interstitialLoadFailCount}, message={errorInfo.Message}"); } private void OnInterstitialAdDisplayed(string adUnitId, MaxSdkBase.AdInfo adInfo) { AppendLog($"Interstitial displayed: {adUnitId}"); } private void OnInterstitialAdDisplayFailed(string adUnitId, MaxSdkBase.ErrorInfo errorInfo, MaxSdkBase.AdInfo adInfo) { AppendWarning($"Interstitial display failed: {adUnitId}, message={errorInfo.Message}"); LoadInterstitial(); } private void OnInterstitialAdHidden(string adUnitId, MaxSdkBase.AdInfo adInfo) { AppendLog($"Interstitial hidden: {adUnitId}"); LoadInterstitial(); } private void OnInterstitialAdRevenuePaid(string adUnitId, MaxSdkBase.AdInfo adInfo) { AppendLog($"Interstitial revenue paid: {adUnitId}, revenue={adInfo.Revenue}"); } private void AppendReadyCheck(string format, string adUnitId, bool isReady) { string line = AdReadyStateLog.FormatReadyCheck(format, adUnitId, isReady); if (isReady) { AppendLog(line); } else { AppendWarning(line); } } private void AppendWarning(string message) { AppendLog(message, true); } private void AppendLog(string message, bool warning = false) { string line = $"[{DateTime.Now:HH:mm:ss}] {message}"; logLines.Add(line); while (logLines.Count > MaxLogLines) { logLines.RemoveAt(0); } if (logText != null) { logText.text = string.Join("\n", logLines); } // This scene is for device-side manual QA, so the UI log is the source of truth. } }