跳到主要内容

Dirichlet 聚合 SDK Unity 接入文档

SDK 支持版本

  • Unity 2018.3 及以上(推荐 2019.4 LTS 或更新版本)
  • Android 7.0(API level 24)及以上(默认集成穿山甲 SDK,请确保持平最低要求)
  • .NET Standard 2.0 及以上
  • Gradle 7.x + Android Gradle Plugin 4.0.1 及以上
  • Unity 集成资源:dirichlet_mediation_unity_4.2.4.3.unitypackage(当前提供 4.2.4.3

SDK 集成

方式一:UnityPackage 导入(推荐)

  1. 下载 dirichlet_mediation_unity_4.2.4.3.unitypackage
  2. 在 Unity 中依次点击 Assets → Import Package → Custom Package…
  3. 选择下载的 .unitypackage,保持所有条目勾选并导入
  4. 导入完成后,确认工程中存在以下目录:
    • Assets/DirichletMediation
    • Assets/DirichletMediation/sample(示例代码)
    • Assets/Plugins/Android/DirichletMediation
发布前务必删除示例代码

sample 目录包含示例代码,仅供开发调试参考。

正式发布前请务必删除 sample 目录,避免示例代码被打包到线上版本。

UnityPackage 导入后的下一步

使用 UnityPackage 导入后,可直接跳转至「SDK 初始化」章节开始接入。UnityPackage 已包含完整的 Gradle 依赖配置、AndroidManifest 权限声明及 ProGuard 混淆规则,无需手动处理。

下方「SDK 配置」章节仅适用于以下场景

  • 采用「方式二:手动拷贝」进行集成
  • 项目已启用自定义 Gradle/Manifest 模板,需要与现有配置合并
  • 构建时出现依赖冲突或 Manifest 合并错误

方式二:手动拷贝

  1. 将官方提供的 Assets/DirichletMediationAssets/Plugins/AndroidAssets/Plugins/Android/libs 等目录复制到 Unity 项目
  2. 保留 Demo 中的 TapAdDependencies.xmlproguard-user.txtAndroidManifest.xml 等构建文件,确保依赖完整
  3. 若项目使用自定义 Gradle 模板或 Manifest,请参照下方「SDK 配置」章节补全配置

SDK 配置

适用范围

本章节仅适用于手动拷贝集成需要自定义构建配置的场景。若使用 UnityPackage 导入且构建正常,可跳过本章节,直接阅读「获取广告权限」及后续内容。

Maven 仓库配置

在项目级 build.gradle 添加穿山甲 (Pangle) 仓库:

allprojects {
repositories {
maven {
url 'https://artifact.bytedance.com/repository/pangle'
}
}
}

mainTemplate.gradle 依赖配置

在 Unity 中勾选 Project Settings → Player → Android → Publish Settings → Build → Custom Main Gradle Template,编辑生成的 Assets/Plugins/Android/mainTemplate.gradle

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])

implementation(name: "DirichletAD_Mediation_4.2.4.3", ext: "aar")
implementation(name: "DirichletAD_CSJ_Adapter_4.2.4.3", ext: "aar")
implementation(name: "DirichletAD_GDT_Adapter_4.2.4.3", ext: "aar")

implementation('com.pangle.cn:ads-sdk-pro:7.4.2.2') {
exclude group: 'com.android.support'
}
implementation 'com.qq.e.union:union:4.671.1541'
implementation 'com.squareup.okhttp3:okhttp:3.12.1'
implementation "com.android.support:appcompat-v7:28.0.0"
implementation "com.android.support:support-annotations:28.0.0"
implementation "com.android.support:support-v4:28.0.0"
implementation "com.github.bumptech.glide:glide:4.9.0"
implementation 'com.android.support:recyclerview-v7:28.0.0'
}
提示

若使用 EDM4U 统一管理依赖,请保留 TapAdDependencies.xml 以自动解析。

依赖文件目录

  • Unity SDK 本体:Assets/DirichletMediation
  • Android 插件:Assets/Plugins/Android/DirichletMediation
  • AAR 依赖:Assets/Plugins/Android/libs

权限申请 & 清单配置

Custom Main Manifest 模式下编辑 Assets/Plugins/Android/AndroidManifest.xml,确保包含所需权限与 Provider 声明:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.unity3d.player"
xmlns:tools="http://schemas.android.com/tools">

<!-- 必须权限 -->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<!-- 建议权限(精准广告、下载管理) -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>

<application>
<provider
android:name="com.tapsdk.tapad.internal.TapADFileProvider"
android:authorities="${applicationId}.com.tds.ad.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/tapad_ad_file_path"/>
</provider>
</application>
</manifest>

Android 代码混淆

聚合 SDK 已内置 R8/ProGuard 混淆规则(consumerProguardFiles),默认情况下无需额外添加 -keep / -dontwarn 配置。 若工程使用自定义混淆策略导致类被误删/误混淆,请根据构建或运行日志按需补充规则。

资源混淆配置(可选)

若工程启用 AndResGuard,建议在 build.gradle 中新增白名单:

andResGuard {
whiteList = [
"R.integer.min_screen_width_bucket",
"R.style.DialogAnimationUp",
"R.style.DialogAnimationRight",
"R.style.DialogFullScreen",
"R.drawable.gdt_*"
]
}

获取广告权限

Unity 侧可在合适时机请求运行时权限:

using Dirichlet.Mediation;

public void RequestPermissionsIfNeeded()
{
DirichletSdk.RequestPermissionIfNecessary();
}

SDK 初始化

创建配置

using Dirichlet.Mediation;

var config = new DirichletAdConfig.Builder()
.WithMediaId(YourMediaId)
.WithMediaName("YourGame")
.WithMediaKey("your-media-key")
.EnableDebug(false) // 默认关闭,如需查看日志请改为 true
.ShakeEnabled(true) // 默认启用摇一摇
.Build();
参数类型必填说明
MediaIdlongDirichlet ADN 后台分配的媒体 ID
MediaNamestring媒体名称(与后台一致)
MediaKeystring媒体密钥
EnableDebugbool是否输出 SDK 调试日志,默认 false
ShakeEnabledbool是否启用摇一摇交互,默认 true

初始化 SDK

DirichletSdk.Init(
config,
onSuccess: result => {
Debug.Log($"Dirichlet 初始化成功: {result.Message}");
},
onFailure: error => {
Debug.LogError($"Dirichlet 初始化失败: {error.Code} {error.Message}");
}
);

if (!DirichletSdk.IsInitialized)
{
Debug.LogWarning("Dirichlet SDK 尚未初始化完成");
}

获取 SDK 版本

string version = DirichletSdk.GetVersion();
Debug.Log($"Dirichlet SDK Version: {version}");

广告通用接口

创建广告加载器

DirichletAdNative adNative = DirichletAdManager.CreateAdNative();

构建广告请求

var request = new DirichletAdRequest.Builder()
.WithSpaceId(slotId)
.WithUserId(SystemInfo.deviceUniqueIdentifier)
.WithRewardName("金币")
.WithRewardAmount(100)
.WithExtra1("level-5")
.WithExpressViewSize(1080, 1920) // Splash/Banner 可选
.Build();

通用事件

每个广告对象均提供 ShownClickedClosed 等事件,可在加载成功后注册回调,并在 Closed 中调用 Destroy() 释放资源。

广告类型

激励视频广告(Reward Video)

自动加载展示(推荐,Android only)

4.2.0.1 新增

ShowRewardVideoAutoAd 接口将加载和展示合并为一次调用,内部自动管理广告缓存。若有可用缓存则立即展示,否则自动加载后展示。仅支持 Android 平台。

public class MyRewardVideoAutoAdListener : IDirichletRewardVideoAutoAdListener
{
public void OnError(DirichletError error)
{
Debug.LogError($"激励视频加载/展示失败: {error.Code} {error.Message}");
}

public void OnAdShow()
{
Debug.Log("激励视频展示");
}

public void OnAdClose()
{
Debug.Log("激励视频关闭");
}

public void OnRewardVerify(DirichletRewardVerificationEventArgs args)
{
if (args.IsVerified)
{
GrantReward(args.RewardAmount, args.RewardName);
}
}

public void OnAdClick()
{
Debug.Log("激励视频点击");
}
}

// 调用方式
adNative.ShowRewardVideoAutoAd(request, new MyRewardVideoAutoAdListener());

手动加载展示

private DirichletRewardVideoAd rewardAd;

public void LoadRewardAd()
{
adNative.LoadRewardVideoAd(request,
onLoaded: ad => {
rewardAd = ad;
rewardAd.Shown += () => Debug.Log("激励视频展示");
rewardAd.Clicked += () => Debug.Log("激励视频点击");
rewardAd.RewardVerified += args => {
if (args.IsVerified)
{
GrantReward(args.RewardAmount, args.RewardName);
}
else
{
Debug.LogWarning($"奖励验证失败: {args.Code} {args.Message}");
}
};
rewardAd.Closed += () => {
rewardAd.Destroy();
rewardAd = null;
};
},
onFailure: error => Debug.LogError($"激励视频加载失败 {error.Code}:{error.Message}"));
}

public void ShowRewardAd()
{
if (rewardAd != null && rewardAd.IsLoaded)
{
rewardAd.Show();
}
}

插屏广告(Interstitial)

自动加载展示(推荐,Android only)

4.2.2.0 新增

ShowInterstitialAutoAd 接口将加载和展示合并为一次调用,内部自动管理广告缓存。若有可用缓存则立即展示,否则自动加载后展示。

public class MyInterstitialAutoAdListener : IDirichletInterstitialAutoAdListener
{
public void OnError(DirichletError error)
{
Debug.LogError($"插屏加载/展示失败: {error.Code} {error.Message}");
}

public void OnAdShow()
{
Debug.Log("插屏展示");
}

public void OnAdClick()
{
Debug.Log("插屏点击");
}

public void OnAdClose()
{
Debug.Log("插屏关闭");
}
}

// 调用方式
adNative.ShowInterstitialAutoAd(request, new MyInterstitialAutoAdListener());

手动加载展示

public void LoadAndShowInterstitial()
{
adNative.LoadInterstitialAd(request,
onLoaded: ad => {
ad.Shown += () => Debug.Log("插屏展示");
ad.Clicked += () => Debug.Log("插屏点击");
ad.Closed += () => ad.Destroy();
ad.Show();
},
onFailure: error => Debug.LogWarning($"插屏加载失败 {error.Code}:{error.Message}"));
}

横幅广告(Banner)

自动加载展示(推荐,Android only)

4.2.2.0 新增

ShowBannerAutoAd 接口将加载和展示合并为一次调用,内部自动管理广告缓存与轮播刷新。开发者只需指定容器,SDK 自动完成加载、展示和定时刷新。

public class MyBannerAutoAdListener : IDirichletBannerAutoAdListener
{
public void OnError(DirichletError error)
{
Debug.LogError($"Banner 加载/展示失败: {error.Code} {error.Message}");
}

public void OnAdShow()
{
Debug.Log("Banner 展示");
}

public void OnAdClick()
{
Debug.Log("Banner 点击");
}

public void OnAdClose()
{
Debug.Log("Banner 关闭");
}
}

// 调用方式,slideInterval 为轮播间隔(秒),取值范围 30~120,默认 30
var request = new DirichletAdRequest.Builder()
.WithSpaceId(BannerSlotId)
.WithSlideInterval(30)
.Build();

adNative.ShowBannerAutoAd(request, new MyBannerAutoAdListener());

手动加载展示

public void LoadBanner()
{
adNative.LoadBannerAd(request,
onLoaded: ad => {
ad.Shown += () => Debug.Log("Banner 展示");
ad.Clicked += () => Debug.Log("Banner 点击");
ad.Closed += () => ad.Destroy();

ad.Show(new DirichletAdShowOptions {
BannerAlignment = DirichletBannerAlignment.Bottom,
BannerOffset = 0
});
},
onFailure: error => Debug.LogError($"Banner 加载失败 {error.Message}"));
}

开屏广告(Splash)

自动加载展示(推荐,Android only)

4.2.2.0 新增

ShowSplashAutoAd 接口将加载和展示合并为一次调用,内部自动管理广告缓存。若有可用缓存则立即展示,否则自动加载后展示。

public class MySplashAutoAdListener : IDirichletSplashAutoAdListener
{
public void OnError(DirichletError error)
{
Debug.LogError($"开屏加载/展示失败: {error.Code} {error.Message}");
GoToMainScene();
}

public void OnAdShow()
{
Debug.Log("开屏展示");
}

public void OnAdClick()
{
Debug.Log("开屏点击");
}

public void OnAdClose()
{
Debug.Log("开屏关闭");
GoToMainScene();
}
}

// 调用方式
var splashRequest = new DirichletAdRequest.Builder()
.WithSpaceId(SplashSlotId)
.WithExpressViewSize(Screen.width, Screen.height)
.Build();

adNative.ShowSplashAutoAd(splashRequest, new MySplashAutoAdListener());

手动加载展示

public void LoadSplash()
{
var splashRequest = new DirichletAdRequest.Builder()
.WithSpaceId(SplashSlotId)
.WithExpressViewSize(Screen.width, Screen.height)
.Build();

adNative.LoadSplashAd(splashRequest,
onLoaded: ad => {
ad.Shown += () => Debug.Log("开屏展示");
ad.Clicked += () => Debug.Log("开屏点击");
ad.Closed += () => GoToMainScene();
ad.Show();
},
onFailure: error => {
Debug.LogWarning($"开屏加载失败 {error.Code}:{error.Message}");
GoToMainScene();
});
}
信息

开屏广告的加载与展示应在同一场景中完成,竖屏素材建议高度 ≥ 75% 屏幕高度;横屏素材需填满横屏全尺寸。

资源管理与最佳实践

  • 预加载:在关键节点提前加载广告,展示后及时销毁并重新请求
  • 统一管理:封装广告管理器脚本,避免在多个场景重复创建 DirichletAdNative
  • 事件回调:仅在 RewardVerifiedIsVerified = true 时发放奖励
  • 调试日志:开发阶段开启 EnableDebug(true),正式上线前务必关闭
  • 频控策略:结合业务实现频次限制,保障用户体验

常见问题

错误码说明

错误码说明
200001广告位无填充
200002广告数据无填充
200010广告渲染失败
200011视频播放失败
200012广告下载失败

常见排查

  • 初始化失败:核对 MediaId/MediaKey,确认网络连通,查看 Debug 日志
  • 广告加载失败:确认广告位配置、依赖与权限是否完整,参考错误码定位
  • 横幅不展示:确保 UI 容器常驻且在 UI 层级顶部,避免被销毁
  • 第三方网络:如需启用穿山甲调试工具或优量汇广告助手,请参考对应官方文档

更新日志

4.2.4.32026-04-08

  • 【优化】 广告样式完善,提升点击率;稳定性提升

4.2.3.3(2026-03-16)

  • 【升级】 穿山甲SDK升级至7.4.2.2,修复已知问题
  • 【优化】 稳定性提升

4.2.2.0(2026-03-09)

  • 【新增】 Banner、插屏、开屏广告新增自动加载展示接口,完善全广告类型自动加载能力
  • 【优化】 稳定性提升

4.2.1.1(2026-02-28)

  • 【优化】 广告样式优化,提升点击率;稳定性提升

4.2.0.8(2026-01-15)

  • 【优化】 稳定性提升

4.2.0.7(2026-01-14)

  • 【优化】 稳定性提升

4.2.0.2(2026-01-09)

  • 【优化】 提升 SDK 整体稳定性及运行时性能表现