2026-05-09 09:37:34 +08:00
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 < bool > onInterstitialAdCompleted = null ;
public static bool CheckInterstitialReady ()
{
return ZrZYFo6bYXYM71YyLSDKCONTROLLER . Instance . IsInterReady ();
}
public static void ShowInterstitial ( string placement = "DefaultInterstitial" ,
UnityAction < bool > 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 < bool > onVideoAdCompleted = null ;
private static string _placement = "" ;
private static Coroutine _waitForVideoAd = null ;
public static void ShowVideo ( string placement = "DefaultVideo" , UnityAction < bool > 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 ( $"激励广告关闭" );
});
}
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 < string , string >
{
{ "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
}
2026-04-20 12:06:34 +08:00
}