Compare commits

..

12 Commits

Author SHA1 Message Date
784bc7c0ee release: 1.4.17 2026-07-01 18:09:08 +08:00
0958e1569a release: 1.4.16 2026-07-01 17:14:21 +08:00
f1084a5db9 release: 1.4.15 2026-06-10 21:52:43 +08:00
f0a21e33ec release: 1.4.14 2026-06-10 21:27:46 +08:00
aba204a310 Remove embedded EDM4U from TopOn package 2026-05-16 19:06:50 +08:00
19615385ec release: 1.4.12 2026-05-16 13:16:59 +08:00
212fec1d1d fix: merge android manifest replace entries 2026-05-16 13:05:06 +08:00
dfa6ce96af Release Topon package 1.4.10 2026-05-16 12:19:45 +08:00
d653b06c8d release: 1.4.9 2026-04-23 17:15:19 +08:00
9d431c66b6 release: 1.4.8 2026-04-22 20:59:37 +08:00
f29e06e3c5 chore: remove unused disabled Android templates 2026-04-22 17:49:00 +08:00
77db35289e release: 1.4.7 2026-04-22 17:44:49 +08:00
114 changed files with 3224 additions and 622 deletions

View File

@@ -229,6 +229,20 @@ namespace AnyThinkAds.Api
client.setLocation(longitude, latitude);
}
public static void start()
{
client.start();
}
public static bool isCnSDK()
{
return client.isCnSDK();
}
public static void setLocalStrategyAssetPath(string assetPath)
{
client.setLocalStrategyAssetPath(assetPath);
}
}
}

View File

@@ -31,5 +31,8 @@ namespace AnyThinkAds.Common
void getArea(ATGetAreaListener listener);
void setWXStatus(bool install);
void setLocation(double longitude, double latitude);
void start();
bool isCnSDK();
void setLocalStrategyAssetPath(string assetPath);
}
}

View File

@@ -10,6 +10,9 @@ namespace AnyThinkAds
{
public class ATAdsClientFactory
{
private static IATInterstitialAdClient _sharedInterstitialAdClient;
private static IATRewardedVideoAdClient _sharedRewardedVideoAdClient;
public static IATBannerAdClient BuildBannerAdClient()
{
#if UNITY_EDITOR
@@ -27,17 +30,25 @@ namespace AnyThinkAds
public static IATInterstitialAdClient BuildInterstitialAdClient()
{
if (_sharedInterstitialAdClient != null)
{
return _sharedInterstitialAdClient;
}
#if UNITY_EDITOR
// Testing UNITY_EDITOR first because the editor also responds to the currently
// selected platform.
#elif UNITY_ANDROID
return new AnyThinkAds.Android.ATInterstitialAdClient();
_sharedInterstitialAdClient = new AnyThinkAds.Android.ATInterstitialAdClient();
return _sharedInterstitialAdClient;
#elif (UNITY_5 && UNITY_IOS) || UNITY_IPHONE
return new AnyThinkAds.iOS.ATInterstitialAdClient();
_sharedInterstitialAdClient = new AnyThinkAds.iOS.ATInterstitialAdClient();
return _sharedInterstitialAdClient;
#else
#endif
return new UnityInterstitialClient();
_sharedInterstitialAdClient = new UnityInterstitialClient();
return _sharedInterstitialAdClient;
}
public static IATNativeAdClient BuildNativeAdClient()
@@ -72,18 +83,26 @@ namespace AnyThinkAds
public static IATRewardedVideoAdClient BuildRewardedVideoAdClient()
{
if (_sharedRewardedVideoAdClient != null)
{
return _sharedRewardedVideoAdClient;
}
#if UNITY_EDITOR
// Testing UNITY_EDITOR first because the editor also responds to the currently
// selected platform.
#elif UNITY_ANDROID
return new AnyThinkAds.Android.ATRewardedVideoAdClient();
_sharedRewardedVideoAdClient = new AnyThinkAds.Android.ATRewardedVideoAdClient();
return _sharedRewardedVideoAdClient;
#elif (UNITY_5 && UNITY_IOS) || UNITY_IPHONE
return new AnyThinkAds.iOS.ATRewardedVideoAdClient();
_sharedRewardedVideoAdClient = new AnyThinkAds.iOS.ATRewardedVideoAdClient();
return _sharedRewardedVideoAdClient;
#else
#endif
return new UnityRewardedVideoAdClient();
_sharedRewardedVideoAdClient = new UnityRewardedVideoAdClient();
return _sharedRewardedVideoAdClient;
}
public static IATSDKAPIClient BuildSDKAPIClient()
@@ -162,6 +181,9 @@ namespace AnyThinkAds
public void getArea(ATGetAreaListener listener) { }
public void setWXStatus(bool install) { }
public void setLocation(double longitude, double latitude) { }
public void start() { }
public bool isCnSDK() { return false; }
public void setLocalStrategyAssetPath(string assetPath) { }
public void showDebuggerUI() {}
public void showDebuggerUI(string debugKey) {}
}

View File

@@ -156,7 +156,7 @@ namespace AnyThinkAds.Android
}catch(System.Exception e){
System.Console.WriteLine("Exception caught: {0}", e);
Debug.Log ("ATInterstitialAdClient : error."+e.Message);
throw;
}
}
@@ -403,6 +403,7 @@ namespace AnyThinkAds.Android
{
System.Console.WriteLine("Exception caught: {0}", e);
Debug.Log("Unity: ATInterstitialAdClient:showAutoAd() : error." + e.Message);
throw;
}
}

View File

@@ -160,7 +160,7 @@ namespace AnyThinkAds.Android
}catch(System.Exception e){
System.Console.WriteLine("Exception caught: {0}", e);
Debug.Log ("ATRewardedVideoAdClient : error."+e.Message);
throw;
}
}
@@ -390,6 +390,7 @@ namespace AnyThinkAds.Android
{
System.Console.WriteLine("Exception caught: {0}", e);
Debug.Log("Unity: ATRewardedVideoAdClient:showAutoAd() : error." + e.Message);
throw;
}
}

View File

@@ -9,11 +9,13 @@ namespace AnyThinkAds.Android
public class ATSDKAPIClient : AndroidJavaProxy, IATSDKAPIClient
{
private AndroidJavaObject sdkInitHelper;
private AndroidJavaClass sdkClass;
private ATSDKInitListener sdkInitListener;
public ATSDKAPIClient () : base("com.anythink.unitybridge.sdkinit.SDKInitListener")
{
this.sdkInitHelper = new AndroidJavaObject(
"com.anythink.unitybridge.sdkinit.SDKInitHelper", this);
this.sdkClass = new AndroidJavaClass("com.anythink.core.api.ATSDK");
}
public void initSDK(string appId, string appKey)
@@ -390,5 +392,59 @@ namespace AnyThinkAds.Android
Debug.Log("ATSDKAPIClient : error." + e.Message);
}
}
public void start()
{
try
{
if (this.sdkClass != null)
{
this.sdkClass.CallStatic("start");
}
}
catch (System.Exception e)
{
System.Console.WriteLine("Exception caught: {0}", e);
Debug.Log("ATSDKAPIClient : start error." + e.Message);
}
}
public bool isCnSDK()
{
try
{
if (this.sdkClass != null)
{
return this.sdkClass.CallStatic<bool>("isCnSDK");
}
}
catch (System.Exception e)
{
System.Console.WriteLine("Exception caught: {0}", e);
Debug.Log("ATSDKAPIClient : isCnSDK error." + e.Message);
}
return false;
}
public void setLocalStrategyAssetPath(string assetPath)
{
try
{
if (this.sdkClass != null)
{
using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
using (AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"))
{
this.sdkClass.CallStatic("setLocalStrategyAssetPath", currentActivity, assetPath);
}
}
}
catch (System.Exception e)
{
System.Console.WriteLine("Exception caught: {0}", e);
Debug.Log("ATSDKAPIClient : setLocalStrategyAssetPath error." + e.Message);
}
}
}
}

View File

@@ -194,6 +194,21 @@ namespace AnyThinkAds.iOS {
ATManager.setLocation(longitude, latitude);
}
public void start()
{
Debug.Log("Unity:ATSDKAPIClient::start() noop on iOS");
}
public bool isCnSDK()
{
return false;
}
public void setLocalStrategyAssetPath(string assetPath)
{
Debug.Log("Unity:ATSDKAPIClient::setLocalStrategyAssetPath() noop on iOS");
}
//iOS显示Debugger UI
public void showDebuggerUI()
{

View File

@@ -3,7 +3,7 @@
<repositories>
<repository>https://jfrog.takuad.com/artifactory/china_sdk</repository>
</repositories>
<androidPackage spec="com.anythink.sdk:core-taku:6.5.52"/>
<androidPackage spec="com.anythink.sdk:core-taku:6.5.73.1"/>
<androidPackage spec="com.android.support:appcompat-v7:28.0.0"/>
</androidPackages>
</dependencies>

View File

@@ -1,6 +1,6 @@
<dependencies>
<androidPackages>
<androidPackage spec="com.anythink.sdk:adapter-taku-sdm:6.5.54.1.0"/>
<androidPackage spec="com.smartdigimkttech.sdk:sdm-sdk-cn:6.5.54"/>
<androidPackage spec="com.anythink.sdk:adapter-taku-sdm:6.5.66.1.0"/>
<androidPackage spec="com.smartdigimkttech.sdk:sdm-sdk-cn:6.5.66"/>
</androidPackages>
</dependencies>

View File

@@ -1,6 +1,6 @@
<dependencies>
<androidPackages>
<androidPackage spec="com.anythink.sdk:adapter-taku-baidu:9.432.1.0"/>
<androidPackage spec="mobi.baidu.sdk:mobads:9.432"/>
<androidPackage spec="com.anythink.sdk:adapter-taku-baidu:9.450.1.0"/>
<androidPackage spec="mobi.baidu.sdk:mobads:9.450"/>
</androidPackages>
</dependencies>

View File

@@ -1 +1 @@
{"name":"baidu","version":"9.432","country":1,"path":"Assets/AnyThinkPlugin/AnyThinkAds\\Plugins/Android/China/mediation/baidu"}
{"name":"baidu","version":"9.450","country":1,"path":"Assets/AnyThinkPlugin/Script/IntegrationManager/Editor/../../..//AnyThinkAds\\Plugins/Android/China/mediation/baidu"}

View File

@@ -1 +1 @@
{"name":"csj","version":"7.5.1.0","country":1,"path":"Assets/AnyThinkPlugin/AnyThinkAds\\Plugins/Android/China/mediation/csj"}
{"name":"csj","version":"7.6.1.1","country":1,"path":"Assets/AnyThinkPlugin/AnyThinkAds\\Plugins/Android/China/mediation/csj"}

View File

@@ -1,6 +1,6 @@
<dependencies>
<androidPackages>
<androidPackage spec="com.anythink.sdk:adapter-taku-gdt:4.671.1541.1.0"/>
<androidPackage spec="com.qq.e.union:union:4.671.1541"/>
<androidPackage spec="com.anythink.sdk:adapter-taku-gdt:4.680.1550.1.0"/>
<androidPackage spec="com.qq.e.union:union:4.680.1550"/>
</androidPackages>
</dependencies>

View File

@@ -1 +1 @@
{"name":"gdt","version":"4.671.1541","country":1,"path":"Assets/AnyThinkPlugin/AnyThinkAds\\Plugins/Android/China/mediation/gdt"}
{"name":"gdt","version":"4.680.1550","country":1,"path":"Assets/AnyThinkPlugin/Script/IntegrationManager/Editor/../../..//AnyThinkAds\\Plugins/Android/China/mediation/gdt"}

View File

@@ -3,7 +3,7 @@
<repositories>
<repository>https://dl-maven-android.mintegral.com/repository/mbridge_android_sdk_support</repository>
</repositories>
<androidPackage spec="com.anythink.sdk:adapter-taku-mintegral-china:16.3.67.1.0"/>
<androidPackage spec="com.anythink.sdk:adapter-taku-mintegral-china:16.3.67.1.1"/>
<androidPackage spec="com.mbridge.msdk.support:reward:16.3.67"/>
<androidPackage spec="com.mbridge.msdk.support:newinterstitial:16.3.67"/>
<androidPackage spec="com.mbridge.msdk.support:mbnative:16.3.67"/>

View File

@@ -1 +1 @@
{"name":"gtm","version":"16.3.67","country":1,"path":"Assets/AnyThinkPlugin/AnyThinkAds\\Plugins/Android/China/mediation/gtm"}
{"name":"gtm","version":"16.3.67","country":1,"path":"Assets/AnyThinkPlugin/Script/IntegrationManager/Editor/../../..//AnyThinkAds\\Plugins/Android/China/mediation/gtm"}

View File

@@ -1,6 +1,6 @@
<dependencies>
<androidPackages>
<androidPackage spec="com.anythink.sdk:adapter-taku-kuaishou:4.12.20.1.1.0"/>
<androidPackage spec="com.anythink.sdk:adapter-taku-kuaishou:4.12.20.1.1.2"/>
<androidPackage spec="com.anythink.sdk:sdk-ads-kuaishou:4.12.20.1"/>
<androidPackage spec="com.android.support:design:28.0.0"/>
</androidPackages>

View File

@@ -1 +1 @@
{"name":"kuaishou","version":"4.12.20.1","country":1,"path":"Assets/AnyThinkPlugin/AnyThinkAds\\Plugins/Android/China/mediation/kuaishou"}
{"name":"kuaishou","version":"4.12.20.1","country":1,"path":"Assets/AnyThinkPlugin/Script/IntegrationManager/Editor/../../..//AnyThinkAds\\Plugins/Android/China/mediation/kuaishou"}

View File

@@ -1,7 +1,7 @@
<dependencies>
<androidPackages>
<androidPackage spec="com.anythink.sdk:adapter-taku-tap:4.1.2.7.1.1"/>
<androidPackage spec="com.anythink.sdk:sdk-ads-tap:4.1.2.7"/>
<androidPackage spec="com.anythink.sdk:adapter-taku-tap:4.2.1.1.1.1"/>
<androidPackage spec="com.anythink.sdk:sdk-ads-tap:4.2.1.1"/>
<androidPackage spec="com.squareup.okhttp3:okhttp:3.12.1"/>
<androidPackage spec="com.github.bumptech.glide:glide:4.9.0"/>
<androidPackage spec="com.android.support:appcompat-v7:28.0.0"/>

View File

@@ -1 +1 @@
{"name":"tap","version":"4.1.2.7","country":1,"path":"Assets/AnyThinkPlugin/AnyThinkAds\\Plugins/Android/China/mediation/tap"}
{"name":"tap","version":"4.2.1.1","country":1,"path":"Assets/AnyThinkPlugin/Script/IntegrationManager/Editor/../../..//AnyThinkAds\\Plugins/Android/China/mediation/tap"}

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: e9115931d711f214aa6aa79f3faae8d7
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 884850fa610017146a55d9579149e619
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: db06d62c9d0894385a59b5fb103ab275
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: f6bea76eddb364121b83ad86a0338601
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<dependencies>
<iosPods>
<iosPod name="AnyThinkMediationBaiduAdapter" version="10.050.0" />
</iosPods>
</dependencies>

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 0d8df9936bce14501b0ce7acb8f0e486
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1 @@
{"name":"baidu","version":"10.050","country":1,"path":"Assets/AnyThinkPlugin/Script/IntegrationManager/Editor/../../..//AnyThinkAds\\Plugins/iOS/China/baidu"}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: c479be6d2cfff5f49b743fd4e7d014f2
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 4a5a23d591de040028521674fa54d20c
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 8eebe69ca7fb743d2b5665bb700c28db
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<dependencies>
<iosPods>
<iosPod name="AnyThinkiOS" version="6.5.45" />
<iosPod name="AnyThinkMediationAdxSmartdigimktCNAdapter" version="6.5.65.0" />
</iosPods>
</dependencies>

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 50c9dea184d284d84bc7e0822bb870d9
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ad0abde879bdd410199166a9164ebc16
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 965cd469bf04d4cc9a8d2cc8c7daf270
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<dependencies>
<iosPods>
<iosPod name="AnyThinkMediationTTAdapter" version="7.5.0.1.1" />
</iosPods>
</dependencies>

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 6437e098bd08a44b7885c53c03330621
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1 @@
{"name":"csj","version":"7.5.0.1","country":1,"path":"Assets/AnyThinkPlugin/Script/IntegrationManager/Editor/../../..//AnyThinkAds\\Plugins/iOS/China/csj"}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 32015d391988d1247929856b6469e6f3
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: b29b0c13c4c4844d4b1be5760b6811f6
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ebeba71cc398047fe879c71be3a53d0d
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<dependencies>
<iosPods>
<iosPod name="AnyThinkMediationGDTAdapter" version="4.15.80.2" />
</iosPods>
</dependencies>

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 215f3a5690c3b4ea3bc7abeec1cd916b
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1 @@
{"name":"gdt","version":"4.15.80","country":1,"path":"Assets/AnyThinkPlugin/Script/IntegrationManager/Editor/../../..//AnyThinkAds\\Plugins/iOS/China/gdt"}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: aa206b00090001e4a8ddb3b2a8820f60
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: a5b213b3361cc47a19e52a0bc28b5927
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 871f2af504cd74b97a9fd8253a21aedd
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<dependencies>
<iosPods>
<iosPod name="AnyThinkMediationKuaiShouAdapter" version="4.12.20.3.3" />
</iosPods>
</dependencies>

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 801f4c656a41d4485b9d77ecff1ea8b5
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1 @@
{"name":"kuaishou","version":"4.12.20.3","country":1,"path":"Assets/AnyThinkPlugin/Script/IntegrationManager/Editor/../../..//AnyThinkAds\\Plugins/iOS/China/kuaishou"}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 8de46792959b74b43b6178a1daae3d82
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1 +1 @@
{"curCountry":1,"china":{"android_version":"6.5.52","ios_version":"","androidXSetting":1,"country":1,"android_admob_app_id":"","ios_admob_app_id":""},"nonchina":{"android_version":"","ios_version":"","androidXSetting":0,"country":2,"android_admob_app_id":"","ios_admob_app_id":""}}
{"curCountry":1,"china":{"android_version":"6.5.73","ios_version":"6.5.45","androidXSetting":1,"country":1,"android_admob_app_id":"","ios_admob_app_id":""},"nonchina":{"android_version":"","ios_version":"","androidXSetting":0,"country":2,"android_admob_app_id":"","ios_admob_app_id":""}}

View File

@@ -44,6 +44,8 @@ namespace AnyThink.Scripts.Editor
get
{
var dynamicLibraryPathsToEmbed = new List<string>();
dynamicLibraryPathsToEmbed.Add(Path.Combine("Pods/", "AnyThinkiOS/core/AnyThinkSDK.xcframework"));
dynamicLibraryPathsToEmbed.Add(Path.Combine("Pods/", "SmartdigimktCNSDK/KuYingSDK/SmartdigimktSDK.xcframework"));
dynamicLibraryPathsToEmbed.Add(Path.Combine("Pods/", "KSAdSDK/KSAdSDK.xcframework"));
dynamicLibraryPathsToEmbed.Add(Path.Combine("Pods/", "StartAppSDK/StartApp.xcframework"));
dynamicLibraryPathsToEmbed.Add(Path.Combine("Pods/", "BigoADS/BigoADS/BigoADS.xcframework"));

97
CHANGELOG.md Normal file
View File

@@ -0,0 +1,97 @@
# [1.4.17]
### 修复
* iOS 导出后处理会把 `AnyThinkSDK.xcframework``SmartdigimktSDK.xcframework` 加入主 App target 的 Embed Frameworks避免真机启动时 `UnityFramework.framework` 因缺少动态依赖而加载失败并直接退出。
### 新增
* `TopOn 配置` 页签新增 iOS DebugUI Pod 开关,测试包可按需写入 `AnyThinkDebugUISDK 1.0.7`,正式包默认不带调试工具。
# [1.4.16]
### 新增
* 增加 Taku/AnyThink 中国区 iOS Pod 依赖声明,覆盖 core、CSJ、GDT、百度、快手网络。
* 同步记录 iOS SDK core 版本 `6.5.45`,让 Integration Manager 能识别当前 iOS 安装状态。
### 维护
* 发布包依赖的 `com.foldcc.cc-framework.commercialization` 对齐到 `1.0.16`,并切换为当前可解析的 `18650` Git UPM 地址。
* `TopOn 配置` 构建页签在宿主未安装新版构建窗口 API 时自动跳过编译,避免基础框架版本差异导致编辑器编译失败。
# [1.4.15]
### 修复
* Release 默认仍关闭 `com.anythink.sdk:debugger-ui`,但不再把 `com.verbto.tools:util` 当作 DebugUI 附属库排除。
* `TopOn 配置` 页签新增独立的 `verbto util` 强制坐标配置,默认强制声明 `com.verbto.tools:util:1.1.3`;后续 Taku 修复后可取消勾选,交给宿主项目自动解析。
* Android Gradle 后处理在强制 util 时改写旧的 `com.verbto.tools:util:*` 声明,并只清理非目标版本的本地 util 产物。
# [1.4.14]
### 修复
* Release 默认不再通过 EDM4U 声明 `com.anythink.sdk:debugger-ui:+`,避免 `com.verbto.tools:util:1.0.6` 进入正式包触发 `anr_data.db` 降级崩溃。
* 新增 `TopOn 配置` 构建页签,可按构建配置启用 DebugUI关闭时构建后处理会从生成的 Gradle 工程剔除 `debugger-ui``verbto util`
* 启用 DebugUI 时同步声明 `com.verbto.tools:util:1.1.3` 作为诊断库兜底版本。
# [1.4.13]
### 修复
* 移除包内嵌的 EDM4U 1.2.177,避免消费项目启动导入阶段重复初始化 Google Version Handler 并写入 `ProjectSettings/GvhProjectSettings.xml`
* 保留 `Dependencies.xml` 依赖声明,由宿主项目统一安装和管理 EDM4U 版本。
# [1.4.12]
### 修复
* Android 构建后处理在 launcher `application` 已存在 `android:appComponentFactory` 时,同步合并 `tools:replace="android:appComponentFactory"`,避免 TapTap AndroidX manifest merger 冲突。
# [1.4.11]
### 修复
* Android 构建后处理合并 `tools:replace` 声明,避免覆盖宿主项目已有的 `android:appComponentFactory` 冲突处理。
# [1.4.10]
### 更新
* 升级 Taku Android 依赖到 `6.5.73` 系列,并同步更新国内广告网络依赖版本。
* 更新 CSJ/GroMore 本地整合包到 `7.6.1.1` 系列,保留此前本地 AAR 接入方式。
# [1.4.9]
### 新增
* 示例改为 `Samples~` 可选导入内容,业务项目默认引用主包时不再自动带入 sample 菜单和调试场景。
### 修复
* 重构激励视频与插屏展示阶段状态机,补齐 `show/showAutoAd` 同步异常后的失败收口,避免卡死在播放前遮罩。
* 按官方语义调整激励视频生命周期:奖励回调只记录奖励结果,关闭回调统一完成会话结算。
* 去除广告源级失败对主链的误判,`AdSource` 加载/竞价失败不再错误打断播放器流程。
# [1.4.8]
### 修复
* 统一奖励视频与插屏的 manual/auto 底层 client 回调源,修复自动加载模式下生命周期回调丢失问题。
* 修复奖励视频播放结束后 `mask` 未正常关闭的问题。
* 修复插屏成功关闭时误触发 `GLOBAL_ShowAwardVideoComplete` 的问题。
# [1.4.7]
### 新增
* 支持中国区 `ATSDK.start()`、本地策略资源路径和自动加载相关配置。
* 新增激励/插屏广告场景显式上报能力,播放链不再自动补记场景到达。
* 增加 Android IMGUI 调试样例场景、日志导出和官方 DebugUI 手动入口。
### 修复
* 激励和插屏切换为更稳的自动加载/预热策略,补强首次播放容错。
* 修复插屏关闭、展示失败和播放失败回调链不完整的问题。
* 调整 debug 行为:`topon.debug=true` 仅开启日志,不再自动弹出官方 DebugUI。

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 1c49d887d5952a944a51f93410b4c40c
guid: 6a68c48c5f3f3b747973e6acc508080e
TextScriptImporter:
externalObjects: {}
userData:

View File

@@ -1,36 +0,0 @@
fileFormatVersion: 2
guid: 5552c54c11d94016bcfe740f27df44a6
labels:
- gvh
- gvh_version-1.2.177
- gvhp_exportpath-ExternalDependencyManager/Editor/1.2.177/Google.IOSResolver.dll
- gvhp_targets-editor
timeCreated: 1480838400
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
isPreloaded: 0
isOverridable: 0
platformData:
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,36 +0,0 @@
fileFormatVersion: 2
guid: 1f4f113972f04c3695341dfb3ba48d3b
labels:
- gvh
- gvh_version-1.2.177
- gvhp_exportpath-ExternalDependencyManager/Editor/1.2.177/Google.JarResolver.dll
- gvhp_targets-editor
timeCreated: 1480838400
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
isPreloaded: 0
isOverridable: 0
platformData:
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,36 +0,0 @@
fileFormatVersion: 2
guid: 413ed4abd14645c38ebbd8c5ff26e9de
labels:
- gvh
- gvh_version-1.2.177
- gvhp_exportpath-ExternalDependencyManager/Editor/1.2.177/Google.PackageManagerResolver.dll
- gvhp_targets-editor
timeCreated: 1480838400
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
isPreloaded: 0
isOverridable: 0
platformData:
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,36 +0,0 @@
fileFormatVersion: 2
guid: 38d0b40a7b2d44c6a6a2362599bfc41e
labels:
- gvh
- gvh_version-1.2.177
- gvhp_exportpath-ExternalDependencyManager/Editor/1.2.177/Google.VersionHandlerImpl.dll
- gvhp_targets-editor
timeCreated: 1480838400
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
isPreloaded: 0
isOverridable: 0
platformData:
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,36 +0,0 @@
fileFormatVersion: 2
guid: 86460262ea60447dbb6a62d21167790f
labels:
- gvh
- gvh_version-1.2.177
- gvhp_exportpath-ExternalDependencyManager/Editor/Google.VersionHandler.dll
- gvhp_targets-editor
timeCreated: 1480838400
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
isPreloaded: 0
isOverridable: 0
platformData:
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,13 +0,0 @@
Assets/ExternalDependencyManager/Editor/1.2.177/Google.IOSResolver.dll
Assets/ExternalDependencyManager/Editor/1.2.177/Google.IOSResolver.dll.mdb
Assets/ExternalDependencyManager/Editor/1.2.177/Google.JarResolver.dll
Assets/ExternalDependencyManager/Editor/1.2.177/Google.JarResolver.dll.mdb
Assets/ExternalDependencyManager/Editor/1.2.177/Google.PackageManagerResolver.dll
Assets/ExternalDependencyManager/Editor/1.2.177/Google.PackageManagerResolver.dll.mdb
Assets/ExternalDependencyManager/Editor/1.2.177/Google.VersionHandlerImpl.dll
Assets/ExternalDependencyManager/Editor/1.2.177/Google.VersionHandlerImpl.dll.mdb
Assets/ExternalDependencyManager/Editor/CHANGELOG.md
Assets/ExternalDependencyManager/Editor/Google.VersionHandler.dll
Assets/ExternalDependencyManager/Editor/Google.VersionHandler.dll.mdb
Assets/ExternalDependencyManager/Editor/LICENSE
Assets/ExternalDependencyManager/Editor/README.md

View File

@@ -1,15 +0,0 @@
fileFormatVersion: 2
guid: 2764c5ea3b354f3cb7ca80028fd08da2
labels:
- gvh
- gvh_manifest
- gvh_version-1.2.177
- gvhp_exportpath-ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.177_manifest.txt
- gvhp_manifestname-0External Dependency Manager
- gvhp_manifestname-play-services-resolver
timeCreated: 1474401009
licenseType: Pro
TextScriptImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.unity3d.player"
xmlns:tools="http://schemas.android.com/tools">
<application tools:replace="android:networkSecurityConfig">
<!--这个设置主要是为了适配9.0以上的机器(必须使用)-->
<uses-library android:name="org.apache.http.legacy" android:required="false" />
</application>
</manifest>

View File

@@ -1,29 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.unity3d.player"
xmlns:tools="http://schemas.android.com/tools"
android:installLocation="preferExternal">
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true"/>
<application android:label="@string/app_name"
android:icon="@mipmap/app_icon">
<provider
android:name="com.bytedance.sdk.openadsdk.TTFileProvider"
android:authorities="${applicationId}.TTFileProvider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="android:authorities">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/alex_tt_file_path" />
</provider>
</application>
</manifest>

View File

@@ -1,32 +0,0 @@
fileFormatVersion: 2
guid: 89da22c2144f47ea823de749873367b4
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Android: Android
second:
enabled: 1
settings: {}
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,32 +0,0 @@
fileFormatVersion: 2
guid: 417c2272592f46b0b62da859413203f3
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Android: Android
second:
enabled: 1
settings: {}
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,29 +0,0 @@
allprojects {
buildscript {
repositories {**ARTIFACTORYREPOSITORY**
google()
jcenter()
}
dependencies {
// If you are changing the Android Gradle Plugin version, make sure it is compatible with the Gradle version preinstalled with Unity
// See which Gradle version is preinstalled with Unity here https://docs.unity3d.com/Manual/android-gradle-overview.html
// See official Gradle and Android Gradle Plugin compatibility table here https://developer.android.com/studio/releases/gradle-plugin#updating-gradle
// To specify a custom Gradle version in Unity, go do "Preferences > External Tools", uncheck "Gradle Installed with Unity (recommended)" and specify a path to a custom Gradle version
classpath 'com.android.tools.build:gradle:4.0.1'
**BUILD_SCRIPT_DEPS**
}
}
repositories {**ARTIFACTORYREPOSITORY**
google()
jcenter()
flatDir {
dirs "${project(':unityLibrary').projectDir}/libs"
}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}

View File

@@ -1,5 +0,0 @@
org.gradle.jvmargs=-Xmx**JVM_HEAP_SIZE**M
org.gradle.parallel=true
android.enableR8=**MINIFY_WITH_R_EIGHT**
unityStreamingAssets=**STREAMING_ASSETS**
**ADDITIONAL_PROPERTIES**

View File

@@ -1,61 +0,0 @@
apply plugin: 'com.android.application'
dependencies {
implementation project(':unityLibrary')
}
android {
compileSdkVersion **APIVERSION**
buildToolsVersion '**BUILDTOOLS**'
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
defaultConfig {
minSdkVersion **MINSDKVERSION**
targetSdkVersion **TARGETSDKVERSION**
applicationId '**APPLICATIONID**'
ndk {
abiFilters **ABIFILTERS**
}
versionCode **VERSIONCODE**
versionName '**VERSIONNAME**'
multiDexEnabled true //添加此配置是为了当代码行数超过64k的时候设置的
}
aaptOptions {
noCompress = **BUILTIN_NOCOMPRESS** + unityStreamingAssets.tokenize(', ')
ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~"
}**SIGN**
lintOptions {
abortOnError false
}
buildTypes {
debug {
minifyEnabled **MINIFY_DEBUG**
proguardFiles getDefaultProguardFile('proguard-android.txt')**SIGNCONFIG**
jniDebuggable true
}
release {
minifyEnabled **MINIFY_RELEASE**
proguardFiles getDefaultProguardFile('proguard-android.txt')**SIGNCONFIG**
}
}**PACKAGING_OPTIONS****PLAY_ASSET_PACKS****SPLITS**
**BUILT_APK_LOCATION**
bundle {
language {
enableSplit = false
}
density {
enableSplit = false
}
abi {
enableSplit = true
}
}
}**SPLITS_VERSION_CODE****LAUNCHER_SOURCE_BUILD_SETUP**

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: dbbfc9e2efadb8c43b6c710eeff4abd9
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,75 +0,0 @@
// Android Resolver Repos Start
([rootProject] + (rootProject.subprojects as List)).each { project ->
project.repositories {
def unityProjectPath = $/file:///**DIR_UNITYPROJECT**/$.replace("\\", "/")
maven {
url "https://maven.google.com"
}
maven {
url "https://artifact.bytedance.com/repository/pangle" // Assets/AnyThinkAds/Plugins/Android/China/Editor/Gromore/Dependencies.xml:6
}
maven {
url "https://jfrog.anythinktech.com/artifactory/debugger" // Assets/Topon_Adapter/Editor/ToponTestDependencies.xml:6
}
mavenLocal()
mavenCentral()
}
}
// Android Resolver Repos End
apply plugin: 'com.android.library'
**APPLY_PLUGINS**
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
// Android Resolver Dependencies Start
implementation 'com.android.support:appcompat-v7:28.0.0' // Assets/AnyThinkAds/Plugins/Android/China/Editor/Dependencies.xml:3
implementation 'com.anythink.sdk:debugger-ui:1.0.0' // Assets/Topon_Adapter/Editor/ToponTestDependencies.xml:8
implementation 'com.pangle.cn:mediation-sdk:5.6.1.6' // Assets/AnyThinkAds/Plugins/Android/China/Editor/Gromore/Dependencies.xml:8
implementation 'com.tencent.mm.opensdk:wechat-sdk-android:6.8.0' // Assets/Topon_Adapter/Editor/WXDependencies.xml:3
// Android Resolver Dependencies End
**DEPS**}
// Android Resolver Exclusions Start
android {
packagingOptions {
exclude ('/lib/arm64-v8a/*' + '*')
exclude ('/lib/armeabi/*' + '*')
exclude ('/lib/mips/*' + '*')
exclude ('/lib/mips64/*' + '*')
exclude ('/lib/x86/*' + '*')
exclude ('/lib/x86_64/*' + '*')
}
}
// Android Resolver Exclusions End
android {
compileSdkVersion **APIVERSION**
buildToolsVersion '**BUILDTOOLS**'
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
defaultConfig {
minSdkVersion **MINSDKVERSION**
targetSdkVersion **TARGETSDKVERSION**
ndk {
abiFilters **ABIFILTERS**
}
versionCode **VERSIONCODE**
versionName '**VERSIONNAME**'
consumerProguardFiles 'proguard-unity.txt'**USER_PROGUARD**
}
lintOptions {
abortOnError false
}
aaptOptions {
noCompress = **BUILTIN_NOCOMPRESS** + unityStreamingAssets.tokenize(', ')
ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~"
}**PACKAGING_OPTIONS**
}**REPOSITORIES**
**IL_CPP_BUILD_SETUP**
**SOURCE_BUILD_SETUP**
**EXTERNAL_SOURCES**

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 47364f35dc20c164fab7f26e8a03dd67
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 90c597385ff9346a89d38256315fb735
guid: 744cdc59a095c7f43a810b4344dfbdf4
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 773d3f2446f5440bb892ec25e114d547
guid: eeb4602ce24931f4b85a300e6c6826ed
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 9ee3e98fba8c1468bbdf8cfa0803a7d8
guid: 1385bb12efc24cb43a93bb40ace7ea14
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@@ -0,0 +1,48 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 98b31b835f394db4a51957c3f0f3ac32, type: 3}
m_Name: IAAAdDebugSampleConfig
m_EditorClassIdentifier:
ConfigName: IAA Ad Debug Sample
Id: your_taku_app_id
Key: your_taku_app_key
Key2:
BaseAwardAdKeyValue:
key: rewarded
value: your_rewarded_placement_id
BaseInteractionAdKeyValue:
key: interstitial
value: your_interstitial_placement_id
BaseSplashAdKeyValue:
key: splash
value: optional_splash_placement
CommonKeyValues:
- key: topon.debug
value: true
- key: topon.auto_open_debugger_ui
value: false
- key: topon.rewarded_auto_load
value: true
- key: topon.rewarded_prewarm_on_init
value: true
- key: topon.rewarded_max_load_attempts
value: 3
- key: topon.rewarded_load_retry_delay_ms
value: 1000
- key: topon.interstitial_auto_load
value: true
- key: topon.interstitial_prewarm_on_init
value: true
- key: topon.interstitial_max_load_attempts
value: 2
- key: topon.interstitial_load_retry_delay_ms
value: 500

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 5acf750d60576674597ee314d6a39cf8
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,124 @@
# IAA Ad Debug Sample
## 文件位置
- 场景:
- `Assets/Samples/IAAAdDebugSample/Scenes/IAAAdDebugSample.unity`
- 示例配置:
- `Assets/Samples/IAAAdDebugSample/Configs/IAAAdDebugSampleConfig.asset`
## 使用步骤
1. 打开示例配置资产 `IAAAdDebugSampleConfig.asset`
2. 填入以下字段:
- `Id` = Taku AppId
- `Key` = Taku AppKey
- `BaseAwardAdKeyValue.value` = 激励视频广告位ID
- `BaseInteractionAdKeyValue.value` = 插屏广告位ID
3. 打开示例场景 `IAAAdDebugSample.unity`
4. 运行到 Android 或 iOS 真机测试
## iOS DebugUI 启用
1.`Build/Modular Build System``TopOn 配置` 页签开启 `启用 iOS DebugUI Pod`
2. iOS DebugUI 版本保持默认 `1.0.7`
3. 导出 Xcode 工程后执行 `pod install --repo-update`
4. 在 Taku 后台获取 `SDK Debug Key`
5. 在示例配置 `CommonKeyValues` 中设置 `topon.debugger_key=<SDK Debug Key>`
6. 真机首次请求 IDFA 时选择允许
7. 点击 `Initialize ADManager`
8. 点击 `Open DebugUI`
## 当前默认策略
- SDK Debug
- `topon.debug=true`
- `topon.auto_open_debugger_ui=false`
- 激励视频
- 自动加载:开启
- 初始化预热:开启
- 最大加载尝试次数3
- 首轮失败补偿1000ms
- 插屏广告
- 自动加载:开启
- 初始化预热:开启
- 最大加载尝试次数2
- 首轮失败补偿500ms
## 场景里的 IMGUI 面板支持
- 初始化 ADManager
- 打开官方 DebugUI
- 手动 Enter Rewarded / Interstitial Scene
- 手动 Load 激励 / 插屏
- AsyncPlay 激励 / 插屏
- 查看当前屏幕分辨率和 SafeArea
- 查看当前策略状态
- 手动刷新状态快照,避免高频状态查询刷满日志
- 查看 Rewarded / Interstitial 的状态 JSON
- 一键复制全部日志
- 自动写入本地 session log 文件
- 一键导出当前面板可见日志到单独文件
- 一键复制日志文件路径
- 查看诊断日志
## 关于 Debug 模式
- `topon.debug=true` 只用于打开 SDK 调试日志
- 不会再因为 debug 模式自动弹出官方 DebugUI
- 官方 DebugUI 改为手动点击 `Open DebugUI`
- iOS 需要构建期启用 `AnyThinkDebugUISDK` Pod并配置 `topon.debugger_key`
## 场景到达测试方式
推荐验证两条链路:
1. 先点击 `Enter Rewarded Scene`,再点击 `Async Play Rewarded`
2. 不点击 `Enter Rewarded Scene`,直接点击 `Async Play Rewarded`
当前实现逻辑:
- 如果提前调用了 `EnterAdScenario`
- 播放时不会重复上报场景
- 如果没有提前调用
- 播放时不再自动补“场景到达”统计
## 建议测试流程
1. 打开场景并运行到真机
2. 点击 `Initialize ADManager`
3. 点击 `Open DebugUI`,确认 SDK Debug 面板可打开
4. 点击 `Enter Rewarded Scene`
5. 点击 `Async Play Rewarded`
6. 点击 `Enter Interstitial Scene`
7. 点击 `Async Play Interstitial`
8. 点击 `Copy All Logs`
9. 将日志直接粘贴给 Codex 分析
如果日志太长,不适合走剪贴板:
1. 点击 `Export Logs To File`
2. 点击 `Copy Log File Path`
3. 到真机的 `Application.persistentDataPath/IAAAdDebugLogs` 下取出日志文件
4. 将文件内容发给 Codex 分析
## 关于分辨率
当前 IMGUI 布局按 `1080 x 2340` 纵向手机做参考设计,并根据 `SafeArea` 自动缩放,适合作为真机调试面板。
## 关于签名
当前示例只负责在 Unity 内和 Android 调试时验证广告链路。
- 不需要官方提供签名
- 只有在你要正式导出 APK / AAB 时,才需要你自己的包名和签名配置
## 关于日志文件位置
- 运行时会自动创建一份 session log
- 目录:`Application.persistentDataPath/IAAAdDebugLogs`
- Android 上通常类似:
- `/storage/emulated/0/Android/data/<包名>/files/IAAAdDebugLogs`
- 当前测试包名是:
- `com.foldcc.starveg`

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: e61f19774db0d2c4489400341a504c1f
guid: a116cafc1b2af4441a5b9b3213aa0b1a
TextScriptImporter:
externalObjects: {}
userData:

View File

@@ -0,0 +1,664 @@
using System;
using System.Collections.Generic;
using System.IO;
using AnyThinkAds.Api;
using Runtime.ADAggregator;
using UnityEngine;
using UnityEngine.EventSystems;
public sealed class IAAAdDebugSampleGui : MonoBehaviour
{
private const float ReferenceWidth = 1080f;
private const float ReferenceHeight = 2340f;
private const int MaxLogEntries = 120;
private const float StatusRefreshInterval = 1f;
public ADConfig adConfig;
public string userId = "debug_user_001";
public string rewardedScenario = "reward_debug";
public string interstitialScenario = "interstitial_debug";
public bool autoInitialize = true;
public bool forcePortrait = true;
public bool captureUnityLogs = true;
public bool showVerboseState = true;
public bool openDebugUiOnButton = true;
public bool autoWriteLogsToFile = true;
private readonly List<string> _logs = new List<string>(MaxLogEntries);
private Vector2 _pageScroll;
private Vector2 _logScroll;
private Vector2 _rewardedStatusScroll;
private Vector2 _interstitialStatusScroll;
private bool _initInvoked;
private bool _initCallbackReceived;
private bool _stylesInitialized;
private GUIStyle _titleStyle;
private GUIStyle _sectionStyle;
private GUIStyle _textStyle;
private GUIStyle _buttonStyle;
private GUIStyle _textFieldStyle;
private GUIStyle _logStyle;
private bool _rewardedReadyCache;
private bool _interstitialReadyCache;
private bool _maskOpen;
private string _lastEventLog = "<none>";
private string _rewardedStatusCache = "Not refreshed yet.";
private string _interstitialStatusCache = "Not refreshed yet.";
private float _nextStatusRefreshTime;
private string _sessionLogFilePath;
private string _sessionLogDirectory;
private void Awake()
{
Application.targetFrameRate = 60;
Screen.sleepTimeout = SleepTimeout.NeverSleep;
if (forcePortrait)
{
Screen.orientation = ScreenOrientation.Portrait;
}
if (captureUnityLogs)
{
Application.logMessageReceived += OnLogMessageReceived;
}
ADManager.Instance.GLOBAL_ShowAwardVideoBefore += OnRewardedBefore;
ADManager.Instance.GLOBAL_ShowAwardVideoComplete += OnRewardedComplete;
InitializeLogFile();
AppendLog("IAA Ad Debug Sample is ready.");
}
private void Start()
{
if (autoInitialize)
{
TryInitialize();
}
RefreshStatusCaches(true);
}
private void OnDestroy()
{
if (captureUnityLogs)
{
Application.logMessageReceived -= OnLogMessageReceived;
}
ADManager.Instance.GLOBAL_ShowAwardVideoBefore -= OnRewardedBefore;
ADManager.Instance.GLOBAL_ShowAwardVideoComplete -= OnRewardedComplete;
}
private void OnGUI()
{
EnsureStyles();
var safeArea = Screen.safeArea;
var scaleX = safeArea.width / ReferenceWidth;
var scaleY = safeArea.height / ReferenceHeight;
var previousMatrix = GUI.matrix;
GUI.matrix = Matrix4x4.TRS(
new Vector3(safeArea.x, safeArea.y, 0f),
Quaternion.identity,
new Vector3(scaleX, scaleY, 1f));
GUILayout.BeginArea(new Rect(24f, 24f, ReferenceWidth - 48f, ReferenceHeight - 48f), GUI.skin.box);
_pageScroll = GUILayout.BeginScrollView(_pageScroll, false, true);
DrawHeader();
DrawSetupSection();
DrawStatusSection();
DrawControlSection();
DrawLogSection();
GUILayout.EndScrollView();
GUILayout.EndArea();
GUI.matrix = previousMatrix;
}
private void DrawHeader()
{
GUILayout.Label("IAA Ad Debug Sample", _titleStyle);
GUILayout.Label(
$"Screen: {Screen.width} x {Screen.height} | SafeArea: {Screen.safeArea.width:0} x {Screen.safeArea.height:0}",
_textStyle);
GUILayout.Label(
$"Reference Layout: {ReferenceWidth:0} x {ReferenceHeight:0} | Orientation: {Screen.orientation}",
_textStyle);
GUILayout.Space(10f);
}
private void DrawSetupSection()
{
GUILayout.Label("Setup", _sectionStyle);
GUILayout.Label(
$"ADConfig Asset: {(adConfig != null ? adConfig.name : "Missing")} | Init Invoked: {_initInvoked} | Init Callback: {_initCallbackReceived}",
_textStyle);
userId = DrawLabeledTextField("User ID", userId);
rewardedScenario = DrawLabeledTextField("Rewarded Scenario", rewardedScenario);
interstitialScenario = DrawLabeledTextField("Interstitial Scenario", interstitialScenario);
var rewardedPlacement = adConfig?.BaseAwardAdKeyValue?.value ?? string.Empty;
var interstitialPlacement = adConfig?.BaseInteractionAdKeyValue?.value ?? string.Empty;
GUILayout.Label($"Rewarded Placement: {DisplayValue(rewardedPlacement)}", _textStyle);
GUILayout.Label($"Interstitial Placement: {DisplayValue(interstitialPlacement)}", _textStyle);
GUILayout.Space(6f);
GUILayout.BeginHorizontal();
if (GUILayout.Button("Initialize ADManager", _buttonStyle, GUILayout.Height(78f)))
{
TryInitialize();
}
if (GUILayout.Button("Open DebugUI", _buttonStyle, GUILayout.Height(78f)))
{
if (EnsureInitialized("Open DebugUI"))
{
OpenDebugUi();
}
}
GUILayout.EndHorizontal();
GUILayout.Space(10f);
}
private void DrawStatusSection()
{
GUILayout.Label("Runtime Status", _sectionStyle);
if (_initInvoked)
{
RefreshStatusCaches();
GUILayout.Label($"Rewarded Ready: {_rewardedReadyCache}", _textStyle);
GUILayout.Label($"Interstitial Ready: {_interstitialReadyCache}", _textStyle);
GUILayout.Label($"Mask Open: {_maskOpen}", _textStyle);
GUILayout.Label($"Last EventLog: {_lastEventLog}", _textStyle);
}
else
{
GUILayout.Label("Rewarded Ready: not initialized", _textStyle);
GUILayout.Label("Interstitial Ready: not initialized", _textStyle);
}
var options = ToponAdController.CurrentOptions;
if (options != null)
{
GUILayout.Label(
$"Rewarded Auto/Prewarm/Retry: {options.RewardedAutoLoad}/{options.RewardedPrewarmOnInit}/{options.RewardedMaxLoadAttempts}@{options.RewardedLoadRetryDelayMs}ms",
_textStyle);
GUILayout.Label(
$"Interstitial Auto/Prewarm/Retry: {options.InterstitialAutoLoad}/{options.InterstitialPrewarmOnInit}/{options.InterstitialMaxLoadAttempts}@{options.InterstitialLoadRetryDelayMs}ms",
_textStyle);
GUILayout.Label(
$"Local Strategy Asset: {DisplayValue(options.LocalStrategyAssetPath)}",
_textStyle);
}
if (showVerboseState && _initInvoked)
{
RefreshStatusCaches();
GUILayout.Space(6f);
if (GUILayout.Button("Refresh Status Snapshot", _buttonStyle, GUILayout.Height(64f)))
{
RefreshStatusCaches(true);
AppendLog("Manual status snapshot refreshed.");
}
GUILayout.Label("Rewarded Status", _sectionStyle);
_rewardedStatusScroll = GUILayout.BeginScrollView(_rewardedStatusScroll, GUILayout.Height(240f));
GUILayout.Label(_rewardedStatusCache, _logStyle);
GUILayout.EndScrollView();
GUILayout.Label("Interstitial Status", _sectionStyle);
_interstitialStatusScroll = GUILayout.BeginScrollView(_interstitialStatusScroll, GUILayout.Height(220f));
GUILayout.Label(_interstitialStatusCache, _logStyle);
GUILayout.EndScrollView();
}
GUILayout.Space(10f);
}
private void DrawControlSection()
{
GUILayout.Label("Ad Actions", _sectionStyle);
GUILayout.BeginHorizontal();
if (GUILayout.Button("Enter Rewarded Scene", _buttonStyle, GUILayout.Height(84f)))
{
if (EnsureInitialized("Enter Rewarded Scene"))
{
ADManager.Instance.EnterAdScenario(AD_Type.AwardVideo, rewardedScenario);
AppendLog($"Enter rewarded scene requested. scenario={rewardedScenario}");
}
}
if (GUILayout.Button("Enter Interstitial Scene", _buttonStyle, GUILayout.Height(84f)))
{
if (EnsureInitialized("Enter Interstitial Scene"))
{
ADManager.Instance.EnterAdScenario(AD_Type.Interaction, interstitialScenario);
AppendLog($"Enter interstitial scene requested. scenario={interstitialScenario}");
}
}
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
if (GUILayout.Button("Load Rewarded", _buttonStyle, GUILayout.Height(84f)))
{
if (EnsureInitialized("Load Rewarded"))
{
ADManager.Instance.LoadAD(AD_Type.AwardVideo);
AppendLog("Manual rewarded load requested.");
}
}
if (GUILayout.Button("Async Play Rewarded", _buttonStyle, GUILayout.Height(84f)))
{
if (EnsureInitialized("Play Rewarded"))
{
ADManager.Instance.AsyncPlayAD(AD_Type.AwardVideo, rewardedScenario, result =>
{
AppendLog($"Rewarded callback: {result}");
});
AppendLog($"AsyncPlayAD rewarded requested. scenario={rewardedScenario}");
}
}
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
if (GUILayout.Button("Load Interstitial", _buttonStyle, GUILayout.Height(84f)))
{
if (EnsureInitialized("Load Interstitial"))
{
ADManager.Instance.LoadAD(AD_Type.Interaction);
AppendLog("Manual interstitial load requested.");
}
}
if (GUILayout.Button("Async Play Interstitial", _buttonStyle, GUILayout.Height(84f)))
{
if (EnsureInitialized("Play Interstitial"))
{
ADManager.Instance.AsyncPlayAD(AD_Type.Interaction, interstitialScenario, result =>
{
AppendLog($"Interstitial callback: {result}");
});
AppendLog($"AsyncPlayAD interstitial requested. scenario={interstitialScenario}");
}
}
GUILayout.EndHorizontal();
GUILayout.Space(10f);
}
private void DrawLogSection()
{
GUILayout.Label("Diagnostics", _sectionStyle);
GUILayout.BeginHorizontal();
if (GUILayout.Button("Clear Logs", _buttonStyle, GUILayout.Height(70f)))
{
_logs.Clear();
AppendLog("Logs cleared.");
}
if (GUILayout.Button("Copy All Logs", _buttonStyle, GUILayout.Height(70f)))
{
GUIUtility.systemCopyBuffer = string.Join("\n", _logs);
AppendLog($"Copied {_logs.Count} log lines to clipboard.");
}
if (GUILayout.Button("Log Current Strategy", _buttonStyle, GUILayout.Height(70f)))
{
var options = ToponAdController.CurrentOptions;
if (options == null)
{
AppendLog("Current strategy unavailable: controller not initialized.");
}
else
{
AppendLog(
$"Strategy => RewardedAuto={options.RewardedAutoLoad}, RewardedPrewarm={options.RewardedPrewarmOnInit}, InterAuto={options.InterstitialAutoLoad}, InterPrewarm={options.InterstitialPrewarmOnInit}");
}
}
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
if (GUILayout.Button("Export Logs To File", _buttonStyle, GUILayout.Height(70f)))
{
ExportVisibleLogsToFile();
}
if (GUILayout.Button("Copy Log File Path", _buttonStyle, GUILayout.Height(70f)))
{
if (string.IsNullOrWhiteSpace(_sessionLogFilePath))
{
AppendLog("Log file path unavailable.");
}
else
{
GUIUtility.systemCopyBuffer = _sessionLogFilePath;
AppendLog($"Copied log file path: {_sessionLogFilePath}");
}
}
GUILayout.EndHorizontal();
GUILayout.Label($"Log File: {DisplayValue(_sessionLogFilePath)}", _textStyle);
_logScroll = GUILayout.BeginScrollView(_logScroll, GUILayout.Height(520f));
foreach (var line in _logs)
{
GUILayout.Label(line, _logStyle);
}
GUILayout.EndScrollView();
}
private string DrawLabeledTextField(string label, string value)
{
GUILayout.BeginHorizontal();
GUILayout.Label(label, _textStyle, GUILayout.Width(260f));
value = GUILayout.TextField(value ?? string.Empty, _textFieldStyle, GUILayout.Height(64f));
GUILayout.EndHorizontal();
return value;
}
private bool TryInitialize()
{
if (_initInvoked)
{
AppendLog("Initialize skipped: ADManager already initialized by sample.");
return true;
}
if (adConfig == null)
{
AppendLog("Initialize failed: sample ADConfig asset is missing.");
return false;
}
if (string.IsNullOrWhiteSpace(adConfig.Id) || string.IsNullOrWhiteSpace(adConfig.Key))
{
AppendLog("Initialize warning: Taku AppId/AppKey is empty. Please fill the sample ADConfig asset.");
}
_initInvoked = true;
var controller = new SampleToponAdController(
onMaskChanged: isOpen =>
{
_maskOpen = isOpen;
AppendLog($"Mask changed => open={isOpen}");
},
onEventLog: (eventTable, eventValue, eventMessage) =>
{
_lastEventLog = $"{eventTable}:{eventValue}:{eventMessage}";
AppendLog($"EventLog => table={eventTable}, value={eventValue}, message={eventMessage}");
});
ADManager.Instance.Init(() =>
{
_initCallbackReceived = true;
AppendLog("ADManager.Init callback received.");
}, userId, adConfig, controller);
AppendLog($"ADManager.Init invoked with userId={userId}");
AppendLog($"Rewarded placement={adConfig.BaseAwardAdKeyValue?.value}, interstitial placement={adConfig.BaseInteractionAdKeyValue?.value}");
return true;
}
private bool EnsureInitialized(string actionName)
{
if (TryInitialize())
{
return true;
}
AppendLog($"{actionName} cancelled: initialization failed.");
return false;
}
private void RefreshStatusCaches(bool force = false)
{
if (!force && Time.unscaledTime < _nextStatusRefreshTime)
{
return;
}
_nextStatusRefreshTime = Time.unscaledTime + StatusRefreshInterval;
_rewardedReadyCache = _initInvoked && ADManager.Instance.IsRealy(AD_Type.AwardVideo);
_interstitialReadyCache = _initInvoked && ADManager.Instance.IsRealy(AD_Type.Interaction);
_rewardedStatusCache = GetRewardedStatusText();
_interstitialStatusCache = GetInterstitialStatusText();
}
private string GetRewardedStatusText()
{
var placement = adConfig?.BaseAwardAdKeyValue?.value;
if (string.IsNullOrWhiteSpace(placement))
{
return "No rewarded placement configured.";
}
var options = ToponAdController.CurrentOptions;
if (options?.RewardedAutoLoad ?? true)
{
return ATRewardedAutoVideo.Instance.checkAutoAdStatus(placement);
}
return ATRewardedVideo.Instance.checkAdStatus(placement);
}
private string GetInterstitialStatusText()
{
var placement = adConfig?.BaseInteractionAdKeyValue?.value;
if (string.IsNullOrWhiteSpace(placement))
{
return "No interstitial placement configured.";
}
var options = ToponAdController.CurrentOptions;
if (options?.InterstitialAutoLoad ?? true)
{
return ATInterstitialAutoAd.Instance.checkAutoAdStatus(placement);
}
return ATInterstitialAd.Instance.checkAdStatus(placement);
}
private void OnRewardedBefore(string placementId, string scenario)
{
AppendLog($"Rewarded before show => placement={placementId}, scenario={scenario}");
}
private void OnRewardedComplete(bool completed)
{
AppendLog($"Rewarded global complete => reward={completed}");
}
private void OnLogMessageReceived(string condition, string stackTrace, LogType type)
{
if (type != LogType.Error && type != LogType.Exception && type != LogType.Warning)
{
if (!condition.Contains("[Topon]") &&
!condition.Contains("ATSDK") &&
!condition.Contains("Rewarded") &&
!condition.Contains("Interstitial") &&
!condition.Contains("Taku"))
{
return;
}
}
AppendLog($"[{type}] {condition}");
}
private void OpenDebugUi()
{
var options = ToponAdController.CurrentOptions;
if (!openDebugUiOnButton)
{
AppendLog("DebugUI launch disabled by sample toggle.");
return;
}
if (options != null && !string.IsNullOrWhiteSpace(options.DebuggerKey))
{
ATSDKAPI.showDebuggerUI(options.DebuggerKey);
AppendLog($"Open DebugUI with debugger key={options.DebuggerKey}");
return;
}
ATSDKAPI.showDebuggerUI();
AppendLog("Open DebugUI with current SDK configuration.");
}
private void AppendLog(string message)
{
var line = $"{DateTime.Now:HH:mm:ss} {message}";
if (_logs.Count >= MaxLogEntries)
{
_logs.RemoveAt(0);
}
_logs.Add(line);
TryAppendLineToFile(line);
_logScroll.y = float.MaxValue;
}
private void InitializeLogFile()
{
try
{
_sessionLogDirectory = Path.Combine(Application.persistentDataPath, "IAAAdDebugLogs");
Directory.CreateDirectory(_sessionLogDirectory);
var fileName = $"iaa-ad-debug-{DateTime.Now:yyyyMMdd-HHmmss}.log";
_sessionLogFilePath = Path.Combine(_sessionLogDirectory, fileName);
File.WriteAllText(_sessionLogFilePath,
$"IAA Ad Debug Sample Log{Environment.NewLine}" +
$"Created: {DateTime.Now:yyyy-MM-dd HH:mm:ss}{Environment.NewLine}" +
$"persistentDataPath: {Application.persistentDataPath}{Environment.NewLine}" +
$"----------------------------------------{Environment.NewLine}");
}
catch (Exception exception)
{
_sessionLogFilePath = null;
Debug.LogWarning($"[IAA Sample] Failed to initialize log file: {exception.Message}");
}
}
private void TryAppendLineToFile(string line)
{
if (!autoWriteLogsToFile || string.IsNullOrWhiteSpace(_sessionLogFilePath))
{
return;
}
try
{
File.AppendAllText(_sessionLogFilePath, line + Environment.NewLine);
}
catch (Exception exception)
{
Debug.LogWarning($"[IAA Sample] Failed to append log file: {exception.Message}");
}
}
private void ExportVisibleLogsToFile()
{
try
{
if (string.IsNullOrWhiteSpace(_sessionLogDirectory))
{
InitializeLogFile();
}
var exportPath = Path.Combine(
_sessionLogDirectory ?? Application.persistentDataPath,
$"iaa-ad-debug-export-{DateTime.Now:yyyyMMdd-HHmmss}.log");
File.WriteAllLines(exportPath, _logs);
AppendLog($"Exported {_logs.Count} visible log lines to file: {exportPath}");
}
catch (Exception exception)
{
AppendLog($"Export log file failed: {exception.Message}");
}
}
private static string DisplayValue(string value)
{
return string.IsNullOrWhiteSpace(value) ? "<empty>" : value;
}
private void EnsureStyles()
{
if (_stylesInitialized)
{
return;
}
_stylesInitialized = true;
_titleStyle = new GUIStyle(GUI.skin.label)
{
fontSize = 54,
fontStyle = FontStyle.Bold,
alignment = TextAnchor.MiddleCenter,
wordWrap = true
};
_sectionStyle = new GUIStyle(GUI.skin.label)
{
fontSize = 34,
fontStyle = FontStyle.Bold,
wordWrap = true
};
_textStyle = new GUIStyle(GUI.skin.label)
{
fontSize = 28,
wordWrap = true
};
_buttonStyle = new GUIStyle(GUI.skin.button)
{
fontSize = 28,
wordWrap = true
};
_textFieldStyle = new GUIStyle(GUI.skin.textField)
{
fontSize = 28
};
_logStyle = new GUIStyle(GUI.skin.label)
{
fontSize = 24,
wordWrap = true,
richText = false
};
}
private sealed class SampleToponAdController : IAdController
{
private readonly ToponAdController _inner = new ToponAdController();
private readonly Action<bool> _onMaskChanged;
private readonly Action<string, string, string> _onEventLog;
public SampleToponAdController(Action<bool> onMaskChanged, Action<string, string, string> onEventLog)
{
_onMaskChanged = onMaskChanged;
_onEventLog = onEventLog;
}
public void Init(ADConfig adConfig, object[] args)
{
_inner.Init(adConfig, args);
}
public ADPlayer CreateAdPlayer(AD_Type type)
{
return _inner.CreateAdPlayer(type);
}
public void EventLog(string eventTable, string eventValue, string eventMessage = null)
{
_onEventLog?.Invoke(eventTable, eventValue, eventMessage);
_inner.EventLog(eventTable, eventValue, eventMessage);
}
public void SetMask(bool isOpen)
{
_onMaskChanged?.Invoke(isOpen);
_inner.SetMask(isOpen);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 53b297b9bf0d4cfca2b77af0fd74c95c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,5 +1,6 @@
fileFormatVersion: 2
guid: bbc875056594cf9438be790ffcde5a38
guid: 79b714e45b20df34490a0062dcbafdd6
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:

View File

@@ -0,0 +1,274 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!29 &1
OcclusionCullingSettings:
m_ObjectHideFlags: 0
serializedVersion: 2
m_OcclusionBakeSettings:
smallestOccluder: 5
smallestHole: 0.25
backfaceThreshold: 100
m_SceneGUID: 00000000000000000000000000000000
m_OcclusionCullingData: {fileID: 0}
--- !u!104 &2
RenderSettings:
m_ObjectHideFlags: 0
serializedVersion: 9
m_Fog: 0
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
m_FogMode: 3
m_FogDensity: 0.01
m_LinearFogStart: 0
m_LinearFogEnd: 300
m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
m_AmbientIntensity: 1
m_AmbientMode: 3
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
m_SkyboxMaterial: {fileID: 0}
m_HaloStrength: 0.5
m_FlareStrength: 1
m_FlareFadeSpeed: 3
m_HaloTexture: {fileID: 0}
m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
m_DefaultReflectionMode: 0
m_DefaultReflectionResolution: 128
m_ReflectionBounces: 1
m_ReflectionIntensity: 1
m_CustomReflection: {fileID: 0}
m_Sun: {fileID: 0}
m_UseRadianceAmbientProbe: 0
--- !u!157 &3
LightmapSettings:
m_ObjectHideFlags: 0
serializedVersion: 12
m_GIWorkflowMode: 1
m_GISettings:
serializedVersion: 2
m_BounceScale: 1
m_IndirectOutputScale: 1
m_AlbedoBoost: 1
m_EnvironmentLightingMode: 0
m_EnableBakedLightmaps: 0
m_EnableRealtimeLightmaps: 0
m_LightmapEditorSettings:
serializedVersion: 12
m_Resolution: 2
m_BakeResolution: 40
m_AtlasSize: 1024
m_AO: 0
m_AOMaxDistance: 1
m_CompAOExponent: 1
m_CompAOExponentDirect: 0
m_ExtractAmbientOcclusion: 0
m_Padding: 2
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: 1
m_PVRSampling: 1
m_PVRDirectSampleCount: 32
m_PVRSampleCount: 512
m_PVRBounces: 2
m_PVREnvironmentSampleCount: 256
m_PVREnvironmentReferencePointCount: 2048
m_PVRFilteringMode: 1
m_PVRDenoiserTypeDirect: 1
m_PVRDenoiserTypeIndirect: 1
m_PVRDenoiserTypeAO: 1
m_PVRFilterTypeDirect: 0
m_PVRFilterTypeIndirect: 0
m_PVRFilterTypeAO: 0
m_PVREnvironmentMIS: 1
m_PVRCulling: 1
m_PVRFilteringGaussRadiusDirect: 1
m_PVRFilteringGaussRadiusIndirect: 5
m_PVRFilteringGaussRadiusAO: 2
m_PVRFilteringAtrousPositionSigmaDirect: 0.5
m_PVRFilteringAtrousPositionSigmaIndirect: 2
m_PVRFilteringAtrousPositionSigmaAO: 1
m_ExportTrainingData: 0
m_TrainingDataDestination: TrainingData
m_LightProbeSampleCountMultiplier: 4
m_LightingDataAsset: {fileID: 0}
m_LightingSettings: {fileID: 0}
--- !u!196 &4
NavMeshSettings:
serializedVersion: 2
m_ObjectHideFlags: 0
m_BuildSettings:
serializedVersion: 3
agentTypeID: 0
agentRadius: 0.5
agentHeight: 2
agentSlope: 45
agentClimb: 0.4
ledgeDropHeight: 0
maxJumpAcrossDistance: 0
minRegionArea: 2
manualCellSize: 0
cellSize: 0.16666667
manualTileSize: 0
tileSize: 256
buildHeightMesh: 0
maxJobWorkers: 0
preserveTilesOutsideBounds: 0
debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
--- !u!1 &320557560
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 320557563}
- component: {fileID: 320557562}
- component: {fileID: 320557561}
m_Layer: 0
m_Name: Main Camera
m_TagString: MainCamera
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!81 &320557561
AudioListener:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 320557560}
m_Enabled: 1
--- !u!20 &320557562
Camera:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 320557560}
m_Enabled: 1
serializedVersion: 2
m_ClearFlags: 1
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
m_projectionMatrixMode: 1
m_GateFitMode: 2
m_FOVAxisMode: 0
m_Iso: 200
m_ShutterSpeed: 0.005
m_Aperture: 16
m_FocusDistance: 10
m_FocalLength: 50
m_BladeCount: 5
m_Curvature: {x: 2, y: 11}
m_BarrelClipping: 0.25
m_Anamorphism: 0
m_SensorSize: {x: 36, y: 24}
m_LensShift: {x: 0, y: 0}
m_NormalizedViewPortRect:
serializedVersion: 2
x: 0
y: 0
width: 1
height: 1
near clip plane: 0.3
far clip plane: 1000
field of view: 60
orthographic: 1
orthographic size: 5
m_Depth: -1
m_CullingMask:
serializedVersion: 2
m_Bits: 4294967295
m_RenderingPath: -1
m_TargetTexture: {fileID: 0}
m_TargetDisplay: 0
m_TargetEye: 3
m_HDR: 1
m_AllowMSAA: 1
m_AllowDynamicResolution: 0
m_ForceIntoRT: 0
m_OcclusionCulling: 1
m_StereoConvergence: 10
m_StereoSeparation: 0.022
--- !u!4 &320557563
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 320557560}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: -10}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &924544598
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 924544600}
- component: {fileID: 924544599}
m_Layer: 0
m_Name: IAA Ad Debug Sample
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &924544599
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 924544598}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 53b297b9bf0d4cfca2b77af0fd74c95c, type: 3}
m_Name:
m_EditorClassIdentifier:
adConfig: {fileID: 11400000, guid: 5acf750d60576674597ee314d6a39cf8, type: 2}
userId: debug_user_001
rewardedScenario: reward_debug
interstitialScenario: interstitial_debug
autoInitialize: 1
forcePortrait: 1
captureUnityLogs: 1
showVerboseState: 1
--- !u!4 &924544600
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 924544598}
serializedVersion: 2
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: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1660057539 &9223372036854775807
SceneRoots:
m_ObjectHideFlags: 0
m_Roots:
- {fileID: 320557563}
- {fileID: 924544600}

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6850df6d809fd9a4e8a58c0061503168
guid: f2af01c304b689445904b3b93d20ff83
DefaultImporter:
externalObjects: {}
userData:

View File

@@ -121,7 +121,7 @@ namespace Topon_Adapter.Editor
elementlauncherApplication.Add (CreateCSJGromore ());
SetOrAddAttribute (elementlauncherApplication, AndroidNamespace + "allowBackup", "false");
SetOrAddAttribute (elementlauncherApplication, ToolsNamespace + "replace", "android:allowBackup");
MergeToolsReplaceAttribute (elementlauncherApplication, GetLauncherApplicationReplaceValues (elementlauncherApplication));
var elementMainManifest = manifest.Element ("manifest");
var elementMainApplication = elementMainManifest.Element ("application");
@@ -263,6 +263,41 @@ namespace Topon_Adapter.Editor
attribute.SetValue (value);
}
private static string[] GetLauncherApplicationReplaceValues (XElement element)
{
List<string> replaceValues = new List<string> { "android:allowBackup" };
if (element.Attribute (AndroidNamespace + "appComponentFactory") != null)
{
replaceValues.Add ("android:appComponentFactory");
}
return replaceValues.ToArray ();
}
private static void MergeToolsReplaceAttribute (XElement element, params string[] replaceValues)
{
XName replaceAttributeName = ToolsNamespace + "replace";
List<string> mergedValues = new List<string> ();
var currentValue = element.Attribute (replaceAttributeName)?.Value;
if (string.IsNullOrWhiteSpace (currentValue) == false)
{
mergedValues.AddRange (currentValue.Split (',')
.Select (value => value.Trim ())
.Where (value => string.IsNullOrWhiteSpace (value) == false));
}
foreach (var replaceValue in replaceValues)
{
if (mergedValues.Contains (replaceValue) == false)
{
mergedValues.Add (replaceValue);
}
}
element.SetAttributeValue (replaceAttributeName, string.Join (",", mergedValues));
}
public int callbackOrder { get; }
}
}

View File

@@ -0,0 +1,306 @@
#if UNITY_ANDROID
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using UnityEditor.Android;
using UnityEngine;
namespace Topon_Adapter.Editor
{
public sealed class ToponAndroidDebuggerDependencyPostProcessor : IPostGenerateGradleAndroidProject
{
private const string Tag = "[TopOn Build]";
private const string DebuggerDependency = "com.anythink.sdk:debugger-ui:+";
private const string DebuggerDependencyMarker = "com.anythink.sdk:debugger-ui";
private const string VerbtoDependencyMarker = "com.verbto.tools:util";
private const string DebuggerRepositoryUrl = "https://jfrog.anythinktech.com/artifactory/debugger";
private const string DepsStart = "// TopOn Debugger UI Dependencies Start";
private const string DepsEnd = "// TopOn Debugger UI Dependencies End";
private const string VerbtoDepsStart = "// TopOn Verbto Util Dependency Start";
private const string VerbtoDepsEnd = "// TopOn Verbto Util Dependency End";
private const string ReposStart = "// TopOn Debugger UI Repository Start";
private const string ReposEnd = "// TopOn Debugger UI Repository End";
public int callbackOrder => int.MaxValue;
public void OnPostGenerateGradleAndroidProject(string path)
{
var settings = ToponBuildSettingsStore.GetActiveForCurrentBuild();
try
{
ProcessGeneratedProject(path, settings);
}
finally
{
ToponBuildSettingsStore.ClearActiveBuildSettings();
}
}
public static void ProcessGeneratedProject(string path, ToponBuildSettings settings)
{
if (settings == null)
{
settings = ToponBuildSettingsStore.CreateDefault();
}
var gradleRoot = GetGradleRoot(path);
var gradleFiles = new[]
{
Path.Combine(path, "build.gradle"),
Path.Combine(gradleRoot, "launcher", "build.gradle"),
Path.Combine(gradleRoot, "build.gradle")
};
var forceVerbtoUtilVersion = settings.forceVerbtoUtilVersion;
var verbtoDependency = ToponBuildSettingsStore.GetVerbtoUtilDependency(settings);
foreach (var gradleFile in gradleFiles)
{
StripManagedDependenciesFromGradleFile(gradleFile, forceVerbtoUtilVersion);
}
StripManagedDependenciesFromGradleFile(Path.Combine(gradleRoot, "settings.gradle"), forceVerbtoUtilVersion);
if (settings.enableDebuggerUI || forceVerbtoUtilVersion)
{
InjectRepository(Path.Combine(gradleRoot, "settings.gradle"));
InjectRepository(Path.Combine(gradleRoot, "build.gradle"));
}
if (settings.enableDebuggerUI)
{
InjectDebuggerDependency(Path.Combine(path, "build.gradle"));
Debug.Log($"{Tag} DebugUI dependency enabled for this build.");
}
else
{
if (settings.stripResolvedDebuggerArtifacts)
{
RemoveGeneratedDebuggerArtifacts(gradleRoot);
}
Debug.Log($"{Tag} DebugUI dependency disabled for this build.");
}
if (forceVerbtoUtilVersion)
{
InjectVerbtoUtilDependency(Path.Combine(path, "build.gradle"), verbtoDependency);
RemoveGeneratedStaleVerbtoUtilArtifacts(gradleRoot, verbtoDependency);
Debug.Log($"{Tag} Verbto util dependency forced to {verbtoDependency}.");
}
else
{
Debug.Log($"{Tag} Verbto util dependency is not modified by TopOn build settings.");
}
}
private static string GetGradleRoot(string unityLibraryPath)
{
#if UNITY_2019_3_OR_NEWER
return Path.GetFullPath(Path.Combine(unityLibraryPath, ".."));
#else
return Path.GetFullPath(unityLibraryPath);
#endif
}
private static void StripManagedDependenciesFromGradleFile(string filePath, bool forceVerbtoUtilVersion)
{
if (string.IsNullOrEmpty(filePath) || !File.Exists(filePath))
{
return;
}
var content = File.ReadAllText(filePath);
var original = content;
content = RemoveMarkedBlock(content, DepsStart, DepsEnd);
content = RemoveMarkedBlock(content, VerbtoDepsStart, VerbtoDepsEnd);
content = RemoveMarkedBlock(content, ReposStart, ReposEnd);
content = RemoveLinesContaining(content, DebuggerDependencyMarker);
if (forceVerbtoUtilVersion)
{
content = RemoveLinesContaining(content, VerbtoDependencyMarker);
}
if (!string.Equals(original, content, StringComparison.Ordinal))
{
File.WriteAllText(filePath, content);
}
}
private static void InjectDebuggerDependency(string buildGradlePath)
{
InjectDependencyBlock(buildGradlePath, DepsStart, DepsEnd, DebuggerDependency);
}
private static void InjectVerbtoUtilDependency(string buildGradlePath, string dependency)
{
InjectDependencyBlock(buildGradlePath, VerbtoDepsStart, VerbtoDepsEnd, dependency);
}
private static void InjectDependencyBlock(string buildGradlePath, string startMarker, string endMarker, string dependency)
{
if (!File.Exists(buildGradlePath))
{
Debug.LogWarning($"{Tag} build.gradle not found: {buildGradlePath}");
return;
}
if (string.IsNullOrWhiteSpace(dependency))
{
Debug.LogWarning($"{Tag} dependency is empty, skip injecting {startMarker}.");
return;
}
var content = File.ReadAllText(buildGradlePath);
var block = new StringBuilder();
block.AppendLine(startMarker);
block.AppendLine($" implementation '{dependency.Trim()}'");
block.AppendLine($" {endMarker}");
var pattern = new Regex(@"(dependencies\s*\{)");
if (!pattern.IsMatch(content))
{
Debug.LogWarning($"{Tag} dependencies block not found: {buildGradlePath}");
return;
}
content = pattern.Replace(content, match => match.Groups[1].Value + "\n " + block, 1);
File.WriteAllText(buildGradlePath, content);
}
private static void InjectRepository(string gradlePath)
{
if (!File.Exists(gradlePath))
{
return;
}
var content = File.ReadAllText(gradlePath);
if (content.Contains(DebuggerRepositoryUrl))
{
return;
}
var block = $"{ReposStart}\n maven {{ url '{DebuggerRepositoryUrl}' }}\n {ReposEnd}";
Regex pattern;
if (Path.GetFileName(gradlePath).Equals("settings.gradle", StringComparison.OrdinalIgnoreCase))
{
pattern = new Regex(@"(dependencyResolutionManagement\s*\{[\s\S]*?repositories\s*\{)");
}
else
{
block = $"{ReposStart}\n maven {{ url '{DebuggerRepositoryUrl}' }}\n {ReposEnd}";
pattern = new Regex(@"(repositories\s*\{)");
}
if (!pattern.IsMatch(content))
{
return;
}
content = pattern.Replace(content, match => match.Groups[1].Value + "\n " + block, 1);
File.WriteAllText(gradlePath, content);
}
private static void RemoveGeneratedDebuggerArtifacts(string gradleRoot)
{
if (string.IsNullOrWhiteSpace(gradleRoot) || !Directory.Exists(gradleRoot))
{
return;
}
var root = Path.GetFullPath(gradleRoot).TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
foreach (var path in Directory.GetFiles(root, "*", SearchOption.AllDirectories))
{
if (!ToponBuildSettingsStore.IsDebuggerArtifactFileName(Path.GetFileName(path)))
{
continue;
}
var fullPath = Path.GetFullPath(path);
if (!fullPath.StartsWith(root, StringComparison.OrdinalIgnoreCase))
{
continue;
}
try
{
File.Delete(fullPath);
Debug.Log($"{Tag} Removed generated debugger artifact: {fullPath}");
}
catch (Exception exception)
{
Debug.LogWarning($"{Tag} Failed to remove generated debugger artifact: {exception.Message}");
}
}
}
private static void RemoveGeneratedStaleVerbtoUtilArtifacts(string gradleRoot, string expectedDependency)
{
if (string.IsNullOrWhiteSpace(gradleRoot) || !Directory.Exists(gradleRoot))
{
return;
}
var root = Path.GetFullPath(gradleRoot).TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
foreach (var path in Directory.GetFiles(root, "*", SearchOption.AllDirectories))
{
var fileName = Path.GetFileName(path);
if (!ToponBuildSettingsStore.IsVerbtoUtilArtifactFileName(fileName) ||
ToponBuildSettingsStore.IsExpectedVerbtoUtilArtifactFileName(fileName, expectedDependency))
{
continue;
}
var fullPath = Path.GetFullPath(path);
if (!fullPath.StartsWith(root, StringComparison.OrdinalIgnoreCase))
{
continue;
}
try
{
File.Delete(fullPath);
Debug.Log($"{Tag} Removed stale verbto util artifact: {fullPath}");
}
catch (Exception exception)
{
Debug.LogWarning($"{Tag} Failed to remove stale verbto util artifact: {exception.Message}");
}
}
}
private static string RemoveMarkedBlock(string content, string startMarker, string endMarker)
{
var pattern = new Regex($@"\s*{Regex.Escape(startMarker)}[\s\S]*?{Regex.Escape(endMarker)}\s*");
return pattern.Replace(content, "\n");
}
private static string RemoveLinesContaining(string content, params string[] markers)
{
var lines = content.Replace("\r\n", "\n").Replace('\r', '\n').Split('\n');
var kept = new List<string>();
foreach (var line in lines)
{
var remove = false;
foreach (var marker in markers)
{
if (line.Contains(marker))
{
remove = true;
break;
}
}
if (!remove)
{
kept.Add(line);
}
}
return string.Join("\n", kept);
}
}
}
#endif

Some files were not shown because too many files have changed in this diff Show More