using System; using System.Collections; using System.Collections.Generic; using System.Globalization; using AppsFlyerSDK; using DG.Tweening; using IgnoreOPS; using Newtonsoft.Json; using SGModule.NetKit; // using AppsFlyerSDK; // using AppsFlyerSDK; using UnityEngine; using UnityEngine.Events; using ZrZYFo6bYXYM71YyLSDK; namespace BallKingdomCrush { public class MaxADKit { public static string SDKKey = "oXM0CzVDi7P1HstOpKvFMInPMOzpQ9uA6t3x75q5f5wQvsEy9vuiiiM94ZJCJSV7PcZGroSSInQCTGsu04QEiE"; public static string interstitialADUnitID = "450445216a84fb16"; public static string rewardedADUnitID = "b979e20045011cb6"; private const float RevenueThreshold = 0; public static void Init() { #if !UNITY_EDITOR // 注册 ab事件,0或1,0为自然量版本,1为激励版本 ZrZYFo6bYXYM71YyLSDKCONTROLLER.Instance.RegistIosParam((i => { SuperApplication.Instance.attribution = i == 0 ? "organic" : "non_organic"; Debug.Log($"ios ab param : {i} attribution=== {SuperApplication.Instance.attribution}"); NetworkDispatcher.Instance.Dispatch(NetworkMsg.Login); })); void GameConfig(bool result, string config) { Debug.Log($"************* game config result : {result}, config : {config}"); } // SDK初始化方法 ZrZYFo6bYXYM71YyLSDKCONTROLLER.Instance.Init(null, null, GameConfig); #endif // MaxSdkCallbacks.OnSdkInitializedEvent += sdkConfiguration => // { // InitializeRewardedAds(); // InitializeInterstitialAds(); // }; // // // MaxSdk.SetSdkKey(SDKKey); // // // var loginModel = GameHelper.GetLoginModel(); // // user_id = loginModel.uid.ToString(); // // MaxSdk.SetUserId(loginModel.uid.ToString()); // // MaxSdk.SetIsAgeRestrictedUser(false); // MaxSdk.SetHasUserConsent(true); // MaxSdk.SetDoNotSell(false); // // MaxSdk.InitializeSdk(); // MaxSdk.ShowMediationDebugger(); // #if !UNITY_EDITOR // MBridgeSDKManager.initialize("368295", "fc0155e8f6e8bda23b06d22414379609"); // #endif } public static void SetUserID(string userID) { user_id = userID; MaxSdk.SetUserId(user_id); } #region 插屏广告相关 public static UnityAction onInterstitialAdCompleted = null; public static bool CheckInterstitialReady() { return ZrZYFo6bYXYM71YyLSDKCONTROLLER.Instance.IsInterReady(); } public static void ShowInterstitial(string placement = "DefaultInterstitial", UnityAction onCompleted = null) { if (CheckInterstitialReady()) { Debug.Log($"广告已经准备好,播放"); ZrZYFo6bYXYM71YyLSDKCONTROLLER.Instance.ShowInter(placement, () => { onCompleted?.Invoke(true); }); } else { Debug.Log($"广告未准备好,不播放"); onCompleted?.Invoke(false); } // if (MaxSdk.IsInterstitialReady(interstitialADUnitID)) // { // // Debug.Log($"广告已经准备好,播放"); // MaxSdk.ShowInterstitial(interstitialADUnitID, placement); // onInterstitialAdCompleted = onCompleted; // // } // else // { // // Debug.Log($"广告未准备好,不播放"); // // onCompleted?.Invoke(false); // } } static int retryAttemptInterstitial; public static void InitializeInterstitialAds() { MaxSdkCallbacks.Interstitial.OnAdLoadedEvent += OnInterstitialLoadedEvent; MaxSdkCallbacks.Interstitial.OnAdLoadFailedEvent += OnInterstitialLoadFailedEvent; MaxSdkCallbacks.Interstitial.OnAdDisplayedEvent += OnInterstitialDisplayedEvent; MaxSdkCallbacks.Interstitial.OnAdClickedEvent += OnInterstitialClickedEvent; MaxSdkCallbacks.Interstitial.OnAdHiddenEvent += OnInterstitialHiddenEvent; MaxSdkCallbacks.Interstitial.OnAdDisplayFailedEvent += OnInterstitialAdFailedToDisplayEvent; MaxSdkCallbacks.Interstitial.OnAdRevenuePaidEvent += OnInterstitialAdRevenueEvent; LoadInterstitial(); } private static void LoadInterstitial() { MaxSdk.LoadInterstitial(interstitialADUnitID); // BIManager.Instance.TrackAdEvent(BIEvent.AD_REQUEST, "Interstitial"); } private static void OnInterstitialLoadedEvent(string adUnitId, MaxSdkBase.AdInfo adInfo) { retryAttemptInterstitial = 0; // BIManager.Instance.TrackAdEvent(BIEvent.AD_INVENTORY, "Interstitial", adInfo.Placement, adInfo.NetworkName); } private static void OnInterstitialLoadFailedEvent(string adUnitId, MaxSdkBase.ErrorInfo errorInfo) { retryAttemptInterstitial++; double retryDelay = Math.Pow(2, Math.Min(6, retryAttemptInterstitial)); CrazyAsyKit.StartAction("LoadInterstitial", LoadInterstitial, (float)retryDelay); } private static void OnInterstitialDisplayedEvent(string adUnitId, MaxSdkBase.AdInfo adInfo) { // BIManager.Instance.TrackAdEvent(BIEvent.AD_IMP, "Interstitial", adInfo.Placement, adInfo.NetworkName, // adInfo.Revenue, _placement); } private static void OnInterstitialAdFailedToDisplayEvent(string adUnitId, MaxSdkBase.ErrorInfo errorInfo, MaxSdkBase.AdInfo adInfo) { LoadInterstitial(); } private static void OnInterstitialClickedEvent(string adUnitId, MaxSdkBase.AdInfo adInfo) { // BIManager.Instance.TrackAdEvent(BIEvent.AD_CLICK, "Interstitial", adInfo.Placement, adInfo.NetworkName); } private static void OnInterstitialHiddenEvent(string adUnitId, MaxSdkBase.AdInfo adInfo) { LoadInterstitial(); onInterstitialAdCompleted?.Invoke(true); onInterstitialAdCompleted = null; } #endregion #region 激励视频广告相关 public static bool CheckRewardedReady() { return ZrZYFo6bYXYM71YyLSDKCONTROLLER.Instance.IsVideoReady(); } public static UnityAction onVideoAdCompleted = null; private static string _placement = ""; private static Coroutine _waitForVideoAd = null; public static void ShowVideo(string placement = "DefaultVideo", UnityAction onCompleted = null) { onVideoAdCompleted = onCompleted; _placement = placement; #if UNITY_EDITOR onVideoAdCompleted?.Invoke(true); #else TrackKit.SendEvent(VideoBehaviorTrack.Event, VideoBehaviorTrack.Property.watch_ad_people); TrackKit.SendEvent(VideoBehaviorTrack.Event, VideoBehaviorTrack.Property.Rewarded_videos_trigger_number); if (CheckRewardedReady()) { ZrZYFo6bYXYM71YyLSDKCONTROLLER.Instance.ShowRewardVideo(_placement, b => { onVideoAdCompleted?.Invoke(b); }, ()=> { Debug.Log($"激励广告关闭"); if (GameHelper.IsGiftSwitch() && !SaveData.GetSaveObject().is_get_removead && (UnityEngine.Random.Range(0, 100) < GameHelper.GetCommonModel().rewardinsertion)) { TrackKit.SendEvent(ADEventTrack.AD_Event, ADEventTrack.Property.afterRewardAdShow); GameHelper.ShowInterstitial("AfterReward"); } }); } else { onVideoAdCompleted?.Invoke(false); } // if (MaxSdk.IsRewardedAdReady(rewardedADUnitID)) // { // MaxSdk.ShowRewardedAd(rewardedADUnitID, _placement); // } // else // { // if (_waitForVideoAd != null) // { // CrazyAsyKit.StopCoroutine(_waitForVideoAd); // } // _waitForVideoAd = CrazyAsyKit.StartCoroutine(WaitForVideoAd()); // } #endif } private static IEnumerator WaitForVideoAd() { UICtrlDispatcher.Instance.Dispatch(UICtrlMsg.PayloadingUI_Open); var count = 0; var result = false; while (count < 6) { if (MaxSdk.IsRewardedAdReady(rewardedADUnitID)) { result = true; MaxSdk.ShowRewardedAd(rewardedADUnitID, _placement); break; } count++; yield return new WaitForSeconds(0.5f); } if (!result) { onVideoAdCompleted?.Invoke(result); } UICtrlDispatcher.Instance.Dispatch(UICtrlMsg.PayloadingUI_Close); _waitForVideoAd = null; } static int retryAttempt; public static void InitializeRewardedAds() { 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; MaxSdkCallbacks.Rewarded.OnAdRevenuePaidEvent += OnRewardedAdRevenueEvent; LoadRewardedAd(); } private static void LoadRewardedAd() { MaxSdk.LoadRewardedAd(rewardedADUnitID); // BIManager.Instance.TrackAdEvent(BIEvent.AD_REQUEST, "RewardedVideo"); } private static void OnInterstitialAdRevenueEvent(string adUnitId, MaxSdkBase.AdInfo adInfo) { DOVirtual.DelayedCall(0.01f, () => { OnAdRevenuePaidEvent(adUnitId, adInfo, 2); }); } private static void OnRewardedAdRevenueEvent(string adUnitId, MaxSdkBase.AdInfo adInfo) { DOVirtual.DelayedCall(0.01f, () => { OnAdRevenuePaidEvent(adUnitId, adInfo, 1); }); } public static string user_id = ""; private static void OnAdRevenuePaidEvent(string adUnitId, MaxSdkBase.AdInfo adInfo, int adType) { //string countryCode = MaxSdk.GetSdkConfiguration().CountryCode; // "US" for the United States, etc - Note: Do not confuse this with currency code which is "USD" // //string networkName = adInfo.NetworkName; // Display name of the network that showed the ad // // string adUnitIdentifier = adInfo.AdUnitIdentifier; // The MAX Ad Unit ID // //string placement = adInfo.Placement; // The placement this ad's postbacks are tied to //广告收益上传(用户收益,每次上传) double revenue = adInfo.Revenue; if (revenue > 0) { GameHelper.AdOverRevenueEvent(adType,(float)revenue); } Debug.Log($"[OnAdRevenuePaidEvent] revenue: {revenue} \n adInfo.Revenue: {JsonConvert.SerializeObject(adInfo)}"); if (revenue >= RevenueThreshold) { var adCallbackInfo = new Dictionary { { "af_revenue", revenue.ToString(CultureInfo.InvariantCulture) } }; AppsFlyer.sendEvent("af_ad_revenue", adCallbackInfo); PlayerPrefs.SetString($"adInfoRevenue_{user_id}", "0"); FireBaseManger.OnAdRevenuePaid(adUnitId, adInfo); } int highSend; if (!PlayerPrefs.HasKey($"sendHighRevenue_{user_id}")) { highSend = 0; // 如果不存在,则初始化为 0 } else { highSend = PlayerPrefs.GetInt($"sendHighRevenue_{user_id}", 0); // 从 PlayerPrefs 中获取 } // 判断是否需要发送高收入事件 // Debug.Log($"highSend=====: {highSend}"); if (highSend == 0) { float limitNum = GameHelper.GetCommonModel().afSendLimit; var totalNum = Convert.ToDouble(PlayerPrefs.GetString($"adRevenueTotal_{user_id}", "0")); totalNum += adInfo.Revenue; // Debug.Log($"totalNum=====: {totalNum} {limitNum}"); if (totalNum >= limitNum) { GameHelper.sendHighRevenueToAF(); // 发送高收入事件 PlayerPrefs.SetInt($"sendHighRevenue_{user_id}", 1); // 标记已发送 } else { PlayerPrefs.SetString($"adRevenueTotal_{user_id}", totalNum.ToString()); } } /* ATTRIBUTION_PLATFORM_APPSFLYER = "AppsFlyer"; ATTRIBUTION_PLATFORM_ADJUST = "Adjust"; ATTRIBUTION_PLATFORM_TENJIN = "Tenjin"; ATTRIBUTION_PLATFORM_SINGULAR = "Singular"; ATTRIBUTION_PLATFORM_KOCHAVA = "Kochava"; ATTRIBUTION_PLATFORM_BRANCH = "Branch"; ATTRIBUTION_PLATFORM_REYUN = "Reyun"; ATTRIBUTION_PLATFORM_SOLAR_ENGINE = "SolarEngine"; ... ... */ //这里需要改成自己的归因平台名称,这里以Adjust为例,"userid"替换为归因平台UID // MBridgeRevenueParamsEntity mBridgeRevenueParamsEntity = new MBridgeRevenueParamsEntity(MBridgeRevenueParamsEntity.ATTRIBUTION_PLATFORM_ADJUST, PlayerPrefs.GetString("adjust_adid", "default")); ///MaxSdkBase.AdInfo类型的adInfo // mBridgeRevenueParamsEntity.SetMaxAdInfo(adInfo); // MBridgeRevenueManager.Track(mBridgeRevenueParamsEntity); } private static void OnRewardedAdLoadedEvent(string adUnitId, MaxSdkBase.AdInfo adInfo) { retryAttempt = 0; TrackKit.SendEvent(ADEventTrack.AD_Event, $"{ADEventTrack.Property.ad_load_code}Succeed"); // BIManager.Instance.TrackAdEvent(BIEvent.AD_INVENTORY, "RewardedVideo", adInfo.Placement, // adInfo.NetworkName); } private static void OnRewardedAdLoadFailedEvent(string adUnitId, MaxSdkBase.ErrorInfo errorInfo) { retryAttempt++; double retryDelay = Math.Pow(2, Math.Min(3, retryAttempt)); TrackKit.SendEvent(ADEventTrack.AD_Event, $"{ADEventTrack.Property.ad_load_code}{errorInfo.Code}"); CrazyAsyKit.StartAction("LoadRewardedAd", LoadRewardedAd, (float)retryDelay); } private static void OnRewardedAdDisplayedEvent(string adUnitId, MaxSdkBase.AdInfo adInfo) { TrackKit.SendEvent(ADEventTrack.AD_Event, $"{ADEventTrack.Property.ad_show_code}Succeed"); // BIManager.Instance.TrackAdEvent(BIEvent.AD_IMP, "RewardedVideo", adInfo.Placement, adInfo.NetworkName, // adInfo.Revenue, _placement); } private static void OnRewardedAdFailedToDisplayEvent(string adUnitId, MaxSdkBase.ErrorInfo errorInfo, MaxSdkBase.AdInfo adInfo) { TrackKit.SendEvent(ADEventTrack.AD_Event, $"{ADEventTrack.Property.ad_show_code}{errorInfo.Code}"); LoadRewardedAd(); } private static void OnRewardedAdClickedEvent(string adUnitId, MaxSdkBase.AdInfo adInfo) { // BIManager.Instance.TrackAdEvent(BIEvent.AD_CLICK, "RewardedVideo", adInfo.Placement, adInfo.NetworkName); } private static void OnRewardedAdHiddenEvent(string adUnitId, MaxSdkBase.AdInfo adInfo) { LoadRewardedAd(); if (_hasReceivedReward && onVideoAdCompleted != null) { onVideoAdCompleted(true); } onVideoAdCompleted = null; _hasReceivedReward = false; if (GameHelper.IsGiftSwitch() && !SaveData.GetSaveObject().is_get_removead && (UnityEngine.Random.Range(0, 100) < GameHelper.GetCommonModel().rewardinsertion)) { TrackKit.SendEvent(ADEventTrack.AD_Event, ADEventTrack.Property.afterRewardAdShow); GameHelper.ShowInterstitial("AfterReward"); } } private static bool _hasReceivedReward = false; private static void OnRewardedAdReceivedRewardEvent(string adUnitId, MaxSdk.Reward reward, MaxSdkBase.AdInfo adInfo) { _hasReceivedReward = true; #if !GAME_RELEASE GameHelper.AdOverRevenueEvent(1,0.1f); #endif } private static void OnRewardedAdRevenuePaidEvent(string adUnitId, MaxSdkBase.AdInfo adInfo) { } #endregion } }