From 8b51352e5ac5eb01bdc5eb0c38f4262234c9546c Mon Sep 17 00:00:00 2001 From: luojian Date: Tue, 2 Sep 2025 10:07:10 +0800 Subject: [PATCH] native --- Assets/Scenes/GameScene.unity | 159 +++++++++++++++++- Assets/Script/Common/IAdService.cs | 32 +++- .../AdmobAdsManager/AdmobAdsManager.cs | 41 +++-- .../AdmobAdsManager/AdmobNativeAdManager.cs | 9 +- .../SDKManager/AdsSDKManager/AdsSDKManager.cs | 14 +- .../BigoAdsManager/BigoAdsManager.cs | 23 ++- .../MaxAdsManager/MaxAdsManager.cs | 22 ++- .../TpnAdsManager/TpnAdsManager.cs | 20 +++ Assets/Script/Test.cs | 32 +++- 9 files changed, 310 insertions(+), 42 deletions(-) diff --git a/Assets/Scenes/GameScene.unity b/Assets/Scenes/GameScene.unity index 1b674dd..621fa24 100644 --- a/Assets/Scenes/GameScene.unity +++ b/Assets/Scenes/GameScene.unity @@ -13,7 +13,7 @@ OcclusionCullingSettings: --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 10 + serializedVersion: 9 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -38,12 +38,12 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} m_UseRadianceAmbientProbe: 0 --- !u!157 &3 LightmapSettings: m_ObjectHideFlags: 0 serializedVersion: 12 + m_GIWorkflowMode: 1 m_GISettings: serializedVersion: 2 m_BounceScale: 1 @@ -66,6 +66,9 @@ LightmapSettings: m_LightmapParameters: {fileID: 0} m_LightmapsBakeMode: 1 m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 m_ReflectionCompression: 2 m_MixedBakeMode: 2 m_BakeBackend: 0 @@ -645,6 +648,8 @@ RectTransform: m_Children: - {fileID: 231270963} - {fileID: 2018301549} + - {fileID: 1979832641} + - {fileID: 1439137377} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -664,6 +669,81 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 8a53fe0e9eb9de04e86fd13d32d89b42, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!1 &1439137376 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1439137377} + - component: {fileID: 1439137379} + - component: {fileID: 1439137378} + m_Layer: 5 + m_Name: NativeAd-medium + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1439137377 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1439137376} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1332931146} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -334.5} + m_SizeDelta: {x: 0, y: 669} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1439137378 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1439137376} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.98039216, g: 0.99607843, b: 0.45882353, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1439137379 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1439137376} + m_CullTransparentMesh: 1 --- !u!1 &1715967757 GameObject: m_ObjectHideFlags: 0 @@ -743,6 +823,81 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1715967757} m_CullTransparentMesh: 1 +--- !u!1 &1979832640 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1979832641} + - component: {fileID: 1979832643} + - component: {fileID: 1979832642} + m_Layer: 5 + m_Name: NativeAd-small + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1979832641 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1979832640} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1332931146} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 134.5} + m_SizeDelta: {x: 0, y: 269} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1979832642 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1979832640} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.98039216, g: 0.99607843, b: 0.45882353, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1979832643 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1979832640} + m_CullTransparentMesh: 1 --- !u!1 &2018301548 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Script/Common/IAdService.cs b/Assets/Script/Common/IAdService.cs index 8169e4a..0374026 100644 --- a/Assets/Script/Common/IAdService.cs +++ b/Assets/Script/Common/IAdService.cs @@ -1,6 +1,8 @@ using System; using GoogleMobileAds.Api; -using UnityEditor.Media; +using UnityEngine; + +// using UnityEditor.Media; namespace WZ { @@ -134,23 +136,23 @@ namespace WZ /// /// 检查原生广告是否可用 /// - bool IsNativeAvailable(); + bool IsNativeAvailable(string adUnitId); /// /// 显示原生广告 /// /// 广告位置和尺寸信息 - void DisplayNative(NativeAdPosition position); + void DisplayNative(string _adPos, string adUnitId, NativeAdPosition position); /// /// 移除原生广告 /// - void RemoveNative(); + void RemoveNative(string adUnitId); /// /// 获取原生广告收益信息 /// - double GetNativeRevenue(); + double GetNativeRevenue(string adUnitId); #endregion } @@ -199,6 +201,26 @@ namespace WZ public int Height; public NativeTemplateStyle NativeTemplateStyle; + + + public static NativeAdPosition Create(NativeTemplateStyle nativeTemplateStyle,RectTransform pRect, Camera pCam = null) + { + var tWorldCorners = new Vector3[4]; + pRect.GetWorldCorners(tWorldCorners); + + var tTopLeft = RectTransformUtility.WorldToScreenPoint(pCam, tWorldCorners[1]); + var tBottomRight = RectTransformUtility.WorldToScreenPoint(pCam, tWorldCorners[3]); + var tWidth = Mathf.Abs(tBottomRight.x - tTopLeft.x); + var tHeight = Mathf.Abs(tBottomRight.y - tTopLeft.y); + return new NativeAdPosition + { + X = (int)tTopLeft.x, + Y = (int)(Screen.height - tTopLeft.y), + Width = (int)tWidth, + Height = (int)tHeight, + NativeTemplateStyle = nativeTemplateStyle + }; + } } [System.Serializable] diff --git a/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobAdsManager.cs b/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobAdsManager.cs index 4f5954a..dfb0dbb 100644 --- a/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobAdsManager.cs +++ b/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobAdsManager.cs @@ -37,17 +37,23 @@ namespace WZ public void Initialize() { if (_initialized) return; + _initialized = true; MobileAds.RaiseAdEventsOnUnityMainThread = true; - + // MobileAds.Initialize(initStatus => { if (_bannerAdUnits.Count > 0) LoadBanner(); if (_interstitialAdUnits.Count > 0) LoadInterstitial(); if (_rewardedAdUnits.Count > 0) LoadRewarded(); if(_splashAdUnits.Count > 0) AdsSplashManager.Instance.InitSplash(); - _initialized = true; LoggerUtils.Debug("[Admob] init success"); - }); + }); + + _nativeAdUnits.Add("ca-app-pub-3940256099942544/2247696110"); + if (_nativeAdUnits.Count > 0) + { + LoadNative(); + } } public void RefreshAdsData() @@ -294,24 +300,31 @@ namespace WZ #region 原生广告功能 public void LoadNative() { - } - public double GetNativeRevenue() - { - return 0; - } - public void DisplayNative(NativeAdPosition position) - { - + _admobNativeAdManager?.Destroy(); + _admobNativeAdManager = new AdmobNativeAdManager(); + _admobNativeAdManager.InitializeAdUnits( + _nativeAdUnits + ); } - public bool IsNativeAvailable() + public bool IsNativeAvailable(string adUnitId) { - return false; + return _admobNativeAdManager.IsAdAvailable(adUnitId); } - public void RemoveNative() + public void DisplayNative(string _adPos, string adUnitId, NativeAdPosition position) { + _admobNativeAdManager.ShowAd(position, adUnitId); + } + public void RemoveNative(string adUnitId) + { + _admobNativeAdManager.RemoveNative(adUnitId); + } + + public double GetNativeRevenue(string adUnitId) + { + return _admobBannerAdManager.GetAdRevenue(adUnitId); } #endregion diff --git a/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobNativeAdManager.cs b/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobNativeAdManager.cs index 2121e2a..2f62d03 100644 --- a/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobNativeAdManager.cs +++ b/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobNativeAdManager.cs @@ -39,9 +39,14 @@ namespace WZ NativeOverlayAd.Load(adUnitId, new AdRequest(), new NativeAdOptions(), (NativeOverlayAd ad, LoadAdError error) => { + LoggerUtils.Debug($"[Admob] Native Ad unit {adUnitId} loaded {ad} error {error}"); if (error != null || ad == null) { - _retryCounters[adUnitId]++; + if (!_retryCounters.TryAdd(adUnitId, 0)) + { + _retryCounters[adUnitId]++; + } + var retryDelay = Math.Pow(2, Math.Min(6, _retryCounters[adUnitId])); TimerUtils.Instance.DelayExecute((float)retryDelay, () => { LoadAd(adUnitId); }); LoggerUtils.Debug("[Admob] Native ad failed to load an ad with error : " + error + " \n retryDelay :" + retryDelay); @@ -119,7 +124,7 @@ namespace WZ // 检查特定广告位是否可用 - private bool IsAdAvailable(string adUnitId) + public bool IsAdAvailable(string adUnitId) { return _nativeAds.TryGetValue(adUnitId, out _); } diff --git a/Assets/Script/SDKManager/AdsSDKManager/AdsSDKManager.cs b/Assets/Script/SDKManager/AdsSDKManager/AdsSDKManager.cs index 308af49..ac0b9f8 100644 --- a/Assets/Script/SDKManager/AdsSDKManager/AdsSDKManager.cs +++ b/Assets/Script/SDKManager/AdsSDKManager/AdsSDKManager.cs @@ -179,23 +179,23 @@ namespace WZ #region 原生广告 - public bool IsNativeAdReady() + public bool IsNativeAdReady(string adUnitId) { - return AdmobAdsManager.Instance.IsNativeAvailable(); + return AdmobAdsManager.Instance.IsNativeAvailable(adUnitId); } - public void ShowNativeAd(NativeAdPosition position) + public void ShowNativeAd(string _adPos, string adUnitId, NativeAdPosition position) { - if (IsNativeAdReady()) + if (IsNativeAdReady(adUnitId)) { - AdmobAdsManager.Instance.DisplayNative(position); + AdmobAdsManager.Instance.DisplayNative(_adPos, adUnitId, position); AdPlayCountManager.IncrementAdPlayCount(AdsType.Native); } } - public void RemoveNativeAd() + public void RemoveNativeAd(string adUnitId) { - AdmobAdsManager.Instance.RemoveNative(); + AdmobAdsManager.Instance.RemoveNative(adUnitId); } #endregion diff --git a/Assets/Script/SDKManager/AdsSDKManager/BigoAdsManager/BigoAdsManager.cs b/Assets/Script/SDKManager/AdsSDKManager/BigoAdsManager/BigoAdsManager.cs index dd4f631..2b9a721 100644 --- a/Assets/Script/SDKManager/AdsSDKManager/BigoAdsManager/BigoAdsManager.cs +++ b/Assets/Script/SDKManager/AdsSDKManager/BigoAdsManager/BigoAdsManager.cs @@ -217,10 +217,25 @@ namespace WZ #region 原生广告功能 public void LoadNative() { } - public bool IsNativeAvailable() { return false; } - public void DisplayNative(NativeAdPosition position) { } - public void RemoveNative() { } - public double GetNativeRevenue() { return 0; } + public bool IsNativeAvailable(string adUnitId) + { + return false; + } + + public void DisplayNative(string _adPos, string adUnitId, NativeAdPosition position) + { + + } + + public void RemoveNative(string adUnitId) + { + + } + + public double GetNativeRevenue(string adUnitId) + { + return 0; + } #endregion diff --git a/Assets/Script/SDKManager/AdsSDKManager/MaxAdsManager/MaxAdsManager.cs b/Assets/Script/SDKManager/AdsSDKManager/MaxAdsManager/MaxAdsManager.cs index dc985db..a623893 100644 --- a/Assets/Script/SDKManager/AdsSDKManager/MaxAdsManager/MaxAdsManager.cs +++ b/Assets/Script/SDKManager/AdsSDKManager/MaxAdsManager/MaxAdsManager.cs @@ -271,10 +271,24 @@ namespace WZ #region 原生广告功能 public void LoadNative() { } - public double GetNativeRevenue() { return 0; } - public void DisplayNative(NativeAdPosition position) { } - public bool IsNativeAvailable() { return false; } - public void RemoveNative() { } + public bool IsNativeAvailable(string adUnitId) + { + return false; + } + + public void DisplayNative(string _adPos, string adUnitId, NativeAdPosition position) + { + } + + public void RemoveNative(string adUnitId) + { + + } + + public double GetNativeRevenue(string adUnitId) + { + return 0; + } #endregion diff --git a/Assets/Script/SDKManager/AdsSDKManager/TpnAdsManager/TpnAdsManager.cs b/Assets/Script/SDKManager/AdsSDKManager/TpnAdsManager/TpnAdsManager.cs index b9b079b..1136d96 100644 --- a/Assets/Script/SDKManager/AdsSDKManager/TpnAdsManager/TpnAdsManager.cs +++ b/Assets/Script/SDKManager/AdsSDKManager/TpnAdsManager/TpnAdsManager.cs @@ -245,6 +245,26 @@ namespace WZ #region 原生广告功能 public void LoadNative() { } + public bool IsNativeAvailable(string adUnitId) + { + return false; + } + + public void DisplayNative(string _adPos, string adUnitId, NativeAdPosition position) + { + + } + + public void RemoveNative(string adUnitId) + { + + } + + public double GetNativeRevenue(string adUnitId) + { + return 0; + } + public double GetNativeRevenue() { return 0; } public void DisplayNative(NativeAdPosition position) { } public bool IsNativeAvailable() { return false; } diff --git a/Assets/Script/Test.cs b/Assets/Script/Test.cs index aa85e8b..306a7cf 100644 --- a/Assets/Script/Test.cs +++ b/Assets/Script/Test.cs @@ -1,22 +1,46 @@ using System; using System.Collections; using System.Collections.Generic; +using GoogleMobileAds.Api; using UnityEngine; using WZ; public class Test : MonoBehaviour { + private List _rewardedAdUnits = new List(); -private List _rewardedAdUnits = new List(); public void OnShowAd() { AppSDKManager.Instance.Init(null); // KwaiAdsManager.Instance.ShowRewardAd(); - } public void OnShowInterstitial() { - KwaiAdsManager.Instance.OnInterstitialCallback(); + // KwaiAdsManager.Instance.OnInterstitialCallback(); + var small = gameObject.transform.Find("NativeAd-small").GetComponent(); + var medium = gameObject.transform.Find("NativeAd-medium").GetComponent(); + // var nativeAdPosition = NativeAdPosition.Create(new NativeTemplateStyle + // { + // TemplateId = NativeTemplateId.Medium + // }, medium); + + var nativeAdPosition = NativeAdPosition.Create(new NativeTemplateStyle + { + TemplateId = NativeTemplateId.Small + }, small); + Debug.Log($"luojian admob native ad start show {small} medium {medium} X:{nativeAdPosition.X} Y:{nativeAdPosition.Y} Height :{nativeAdPosition.Height} Width:{nativeAdPosition.Width}"); + if (AdsSDKManager.Instance.IsNativeAdReady("ca-app-pub-3940256099942544/2247696110")) + { + // var nativeAdPosition = NativeAdPosition.Create(new NativeTemplateStyle + // { + // TemplateId = NativeTemplateId.Medium + // }, medium); + AdsSDKManager.Instance.ShowNativeAd("test", "ca-app-pub-3940256099942544/2247696110", nativeAdPosition); + } + else + { + Debug.LogWarning("luojian admob native ad start show fail,not ready."); + } } -} +} \ No newline at end of file