| 
									
										
										
										
											2025-09-01 10:32:50 +00:00
										 |  |  |  | using System.Collections; | 
					
						
							|  |  |  |  | using System.Collections.Generic; | 
					
						
							|  |  |  |  | using Firebase.RemoteConfig; | 
					
						
							|  |  |  |  | using GoogleMobileAds.Api; | 
					
						
							|  |  |  |  | using GoogleMobileAds.Common; | 
					
						
							| 
									
										
										
										
											2025-09-02 13:42:07 +00:00
										 |  |  |  | using Unity.VisualScripting; | 
					
						
							| 
									
										
										
										
											2025-09-01 10:32:50 +00:00
										 |  |  |  | using UnityEngine; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | namespace WZ | 
					
						
							|  |  |  |  | { | 
					
						
							| 
									
										
										
										
											2025-09-01 12:53:08 +00:00
										 |  |  |  |     public class AdsSplashManager : D_MonoSingleton<AdsSplashManager> | 
					
						
							| 
									
										
										
										
											2025-09-01 10:32:50 +00:00
										 |  |  |  |     { | 
					
						
							|  |  |  |  |         public float backgroundTime = 0; | 
					
						
							|  |  |  |  |         private int timeoutDuration = 5; | 
					
						
							|  |  |  |  |         private bool _coldLaunch = true; | 
					
						
							|  |  |  |  |         public void InitSplash() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             timeoutDuration = GetSplashConfigItem().loadtime; | 
					
						
							|  |  |  |  |             StartCoroutine(LoadSplashAdAdWithTimeout()); | 
					
						
							| 
									
										
										
										
											2025-09-02 13:42:07 +00:00
										 |  |  |  |             LoggerUtils.Debug(" [AppOpen]  加载开屏:"+timeoutDuration); | 
					
						
							| 
									
										
										
										
											2025-09-01 10:32:50 +00:00
										 |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-02 13:42:07 +00:00
										 |  |  |  |         private void OnApplicationPause(bool pauseStatus) | 
					
						
							| 
									
										
										
										
											2025-09-01 10:32:50 +00:00
										 |  |  |  |         { | 
					
						
							| 
									
										
										
										
											2025-09-02 13:42:07 +00:00
										 |  |  |  |             if (!pauseStatus)    //从后台返回前台 | 
					
						
							| 
									
										
										
										
											2025-09-01 10:32:50 +00:00
										 |  |  |  |             { | 
					
						
							| 
									
										
										
										
											2025-09-02 13:42:07 +00:00
										 |  |  |  |                 LoggerUtils.Debug(" [AppOpen]  进入前台"); | 
					
						
							|  |  |  |  |                 if (AdmobAdsManager.Instance._splashLoaded) | 
					
						
							|  |  |  |  |                 {  | 
					
						
							|  |  |  |  |                     StartCoroutine(DelayedAction()); | 
					
						
							|  |  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2025-09-01 10:32:50 +00:00
										 |  |  |  |             } | 
					
						
							| 
									
										
										
										
											2025-09-02 13:42:07 +00:00
										 |  |  |  |             else | 
					
						
							| 
									
										
										
										
											2025-09-01 10:32:50 +00:00
										 |  |  |  |             { | 
					
						
							|  |  |  |  |                 backgroundTime = Time.realtimeSinceStartup; | 
					
						
							| 
									
										
										
										
											2025-09-02 13:42:07 +00:00
										 |  |  |  |                 LoggerUtils.Debug(" [AppOpen] 进入后台 :" + backgroundTime); | 
					
						
							| 
									
										
										
										
											2025-09-01 10:32:50 +00:00
										 |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private IEnumerator LoadSplashAdAdWithTimeout() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             // 开始加载广告 | 
					
						
							|  |  |  |  |             AdsSDKManager.Instance.LoadSplashAd(); | 
					
						
							|  |  |  |  |             // 等待5秒或直到广告加载完成 | 
					
						
							|  |  |  |  |             float elapsedTime = 0f; | 
					
						
							|  |  |  |  |             while (elapsedTime < timeoutDuration && !AdsSDKManager.Instance.IsSplashAvailable()) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 elapsedTime += Time.deltaTime; | 
					
						
							|  |  |  |  |                 yield return null; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             CheckSplashAdlash(true); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         IEnumerator DelayedAction() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             yield return new WaitForSeconds(1f); | 
					
						
							|  |  |  |  |             CheckSplashAdlash(false); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private void CheckSplashAdlash(bool isCold) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             if (!isCold) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 // 热启动 | 
					
						
							|  |  |  |  |                 // 当前有其他类型广告在展示 | 
					
						
							|  |  |  |  |                 LoggerUtils.Debug(" [AppOpen] 热启动 是否有广告在展示:" + AdsSDKManager.Instance.otherAdsOnShow); | 
					
						
							|  |  |  |  |                 if (AdsSDKManager.Instance.otherAdsOnShow) return; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // 热启动开关 | 
					
						
							|  |  |  |  |                 var hotSplashSwitch = GetSplashConfigItem().hot_splash_switch == 1; | 
					
						
							|  |  |  |  |                 LoggerUtils.Debug(" [AppOpen] 热启动 开关:" + hotSplashSwitch); | 
					
						
							|  |  |  |  |                 if (!hotSplashSwitch) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     return; | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // 后台运行时间 | 
					
						
							|  |  |  |  |                 float resultTime = Time.realtimeSinceStartup - backgroundTime; | 
					
						
							|  |  |  |  |                 float onlineTime = GetSplashConfigItem().hot_timegap; | 
					
						
							|  |  |  |  |                 LoggerUtils.Debug(" [AppOpen] 后台运行时间差值:" + resultTime + " 在线参数值:" + onlineTime); | 
					
						
							|  |  |  |  |                 if (resultTime < onlineTime) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     return; | 
					
						
							|  |  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2025-09-04 09:19:05 +00:00
										 |  |  |  |                 Invoke(nameof(TrackAdImpression), 10); | 
					
						
							| 
									
										
										
										
											2025-09-01 10:32:50 +00:00
										 |  |  |  |                 if (!AdsSDKManager.Instance.IsSplashAvailable()) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     LoggerUtils.Debug(" [AppOpen] 热启动 广告是否准备好:"); | 
					
						
							| 
									
										
										
										
											2025-09-05 02:15:32 +00:00
										 |  |  |  |                     AdsActionEvents.TrackAdFailToShow(AdsType.Splash, "", AdsShowFailType.NoFill); | 
					
						
							| 
									
										
										
										
											2025-09-01 10:32:50 +00:00
										 |  |  |  |                     AdsSDKManager.Instance.LoadSplashAd(); | 
					
						
							|  |  |  |  |                     return; | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 // 展示热启动开屏 | 
					
						
							|  |  |  |  |                 AdsSDKManager.Instance.ShowSplashAd(); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             else | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 // 冷启动 | 
					
						
							|  |  |  |  |                 // 首次启动 | 
					
						
							| 
									
										
										
										
											2025-09-04 09:19:05 +00:00
										 |  |  |  |                 Invoke(nameof(TrackAdImpression), 10); | 
					
						
							| 
									
										
										
										
											2025-09-01 10:32:50 +00:00
										 |  |  |  |                 var isNew = PlayerPrefsUtils.GetPlayerPrefsInt("Firstcold_Splash_Switch", 0) == 0; | 
					
						
							|  |  |  |  |                 // 首次冷启动开关 | 
					
						
							|  |  |  |  |                 var isFirstShow = GetSplashConfigItem().firstcold_splash_switch == 1; | 
					
						
							|  |  |  |  |                 // 冷启动开关 | 
					
						
							|  |  |  |  |                 var coldSplashSwitch = GetSplashConfigItem().cold_splash_switch == 1; | 
					
						
							|  |  |  |  |                 LoggerUtils.Debug(" [AppOpen] 冷启动 开关:" + coldSplashSwitch + " 首次启动是否展示开屏:" + isFirstShow + " 新用户:" + isNew); | 
					
						
							|  |  |  |  |                 // 新用户首次启动 | 
					
						
							|  |  |  |  |                 if (isNew) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     PlayerPrefsUtils.SavePlayerPrefsInt("Firstcold_Splash_Switch", 1); | 
					
						
							|  |  |  |  |                     if (!isFirstShow) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         // 新用户首次不展示 | 
					
						
							|  |  |  |  |                         AdsSDKManager.Instance.OnSplashAdCloseCallback?.Invoke(); | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                     else | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         // 新用户首次展示 | 
					
						
							|  |  |  |  |                         if (AdsSDKManager.Instance.IsSplashAvailable()) | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             AdsSDKManager.Instance.ShowSplashAd(); | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                         else | 
					
						
							|  |  |  |  |                         { | 
					
						
							| 
									
										
										
										
											2025-09-05 02:15:32 +00:00
										 |  |  |  |                             AdsActionEvents.TrackAdFailToShow(AdsType.Splash, "", AdsShowFailType.NoFill); | 
					
						
							| 
									
										
										
										
											2025-09-01 10:32:50 +00:00
										 |  |  |  |                             AdsSDKManager.Instance.OnSplashAdCloseCallback?.Invoke(); | 
					
						
							|  |  |  |  |                             AdsSDKManager.Instance.LoadSplashAd(); | 
					
						
							|  |  |  |  |                             LoggerUtils.Debug(" [AppOpen] 冷启动广告未准备好"); | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |                 else | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     // 非首次启动 | 
					
						
							|  |  |  |  |                     if (coldSplashSwitch) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         // 展示冷启动 | 
					
						
							|  |  |  |  |                         if (AdsSDKManager.Instance.IsSplashAvailable()) | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             AdsSDKManager.Instance.ShowSplashAd(); | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                         else | 
					
						
							|  |  |  |  |                         { | 
					
						
							| 
									
										
										
										
											2025-09-05 02:15:32 +00:00
										 |  |  |  |                             AdsActionEvents.TrackAdFailToShow(AdsType.Splash, "", AdsShowFailType.NoFill); | 
					
						
							| 
									
										
										
										
											2025-09-01 10:32:50 +00:00
										 |  |  |  |                             AdsSDKManager.Instance.OnSplashAdCloseCallback?.Invoke(); | 
					
						
							|  |  |  |  |                             AdsSDKManager.Instance.LoadSplashAd(); | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                     else | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         AdsSDKManager.Instance.OnSplashAdCloseCallback?.Invoke(); | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-04 09:19:05 +00:00
										 |  |  |  |         private void TrackAdImpression() | 
					
						
							|  |  |  |  |         {  | 
					
						
							|  |  |  |  |             AdsActionEvents.TrackAdPosition(AdsType.Splash,""); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-01 10:32:50 +00:00
										 |  |  |  |         private static string Splash_AD_RULES = "Splash_AD_RULES"; | 
					
						
							|  |  |  |  |         private static string Splash_AD_RULES_DEFAULT_VALUE = "[{\"firstcold_splash_switch\":1,\"cold_splash_switch\":1,\"hot_splash_switch\":1,\"hot_timegap\":30,\"loadtime\":5}]"; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         public SplashConfigItem GetSplashConfigItem() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             string jsonData = FireBaseRemoteConfigManager.Instance.GetRemoteConfigString(Splash_AD_RULES, Splash_AD_RULES_DEFAULT_VALUE); | 
					
						
							|  |  |  |  |             SplashConfigItem[] configItems = DataUtils.FromJsonArray<SplashConfigItem>(jsonData); | 
					
						
							|  |  |  |  |             if (configItems.Length == 0 || configItems == null) | 
					
						
							|  |  |  |  |             { | 
					
						
							| 
									
										
										
										
											2025-09-02 13:42:07 +00:00
										 |  |  |  |                 return new SplashConfigItem() { firstcold_splash_switch = 1, cold_splash_switch = 1, hot_splash_switch = 1, hot_timegap = 30, loadtime = 15 }; | 
					
						
							| 
									
										
										
										
											2025-09-01 10:32:50 +00:00
										 |  |  |  |             } | 
					
						
							|  |  |  |  |             else | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 return configItems[0]; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         [System.Serializable] | 
					
						
							|  |  |  |  |         public class SplashConfigItem | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             public int firstcold_splash_switch; | 
					
						
							|  |  |  |  |             public int cold_splash_switch; | 
					
						
							|  |  |  |  |             public int hot_splash_switch; | 
					
						
							|  |  |  |  |             public int hot_timegap; | 
					
						
							|  |  |  |  |             public int loadtime; | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 |