# Unity 广告接入
本文介绍如何在Unity项目中接入Tap小游戏广告系统,包含Banner广告和激励视频广告的完整实现方案。
# 前置条件
在开始广告接入前,请确保:
- 已完成 Tap小游戏Unity接入指南
- 已按照 变现能力指引 创建广告位并获取广告位ID
# 广告类型介绍
# Banner广告(横幅广告)
- 特点: 持续显示在屏幕上,不打断用户操作
- 适用场景: 游戏主界面、结算页面底部展示
- 优势: 用户体验友好,变现效果稳定
# 激励视频广告
- 特点: 变现效果最好的广告类型,用户观看完整视频后获得奖励
- 适用场景: 获得额外金币/道具、复活/额外生命、解锁关卡
- 核心机制: 必须Load成功后才能Show,播放完成后自动加载下一条
# 完整实现代码
# 1. Banner广告实现
using TapTapMiniGame;
using UnityEngine;
public class BannerAdExample : MonoBehaviour
{
private TapBannerAd bannerAd;
private bool isBannerShowing = false;
/// <summary>
/// 创建Banner广告
/// </summary>
public void CreateBannerAd()
{
// 避免重复创建
if (bannerAd != null)
{
Debug.Log("Banner广告实例已存在");
return;
}
// 创建Banner广告参数
var param = new TapCreateBannerAdParam
{
adUnitId = "YOUR_BANNER_AD_UNIT_ID", // 替换为你的广告位ID
style = new Style
{
left = 0, // 距离左边距离
top = 0, // 距离顶部距离
width = 320, // Banner宽度
height = 50 // Banner高度
}
};
// 创建Banner广告实例
bannerAd = Tap.CreateBannerAd(param);
// 监听加载成功事件
bannerAd.OnLoad((res) =>
{
Debug.Log("Banner广告加载成功,正在自动显示");
isBannerShowing = true;
// 注意: Banner广告加载成功后会自动显示
});
// 监听加载失败事件
bannerAd.OnError((error) =>
{
Debug.LogError($"Banner广告加载失败: {error.errMsg}");
isBannerShowing = false;
});
Debug.Log("Banner广告创建完成,正在加载中...");
}
/// <summary>
/// 创建固定位置Banner广告(推荐)
/// 自动定位到屏幕底部中央,支持自动刷新
/// </summary>
public void CreateFixedBannerAd()
{
if (bannerAd != null) return;
// 创建固定位置Banner广告
bannerAd = Tap.CreateFixedBottomMiddleBannerAd(
"YOUR_BANNER_AD_UNIT_ID", // 广告位ID
30, // 自动刷新间隔(秒)
50 // 广告高度
);
// 监听事件
bannerAd.OnLoad((res) =>
{
Debug.Log("固定位置Banner广告加载成功");
isBannerShowing = true;
});
bannerAd.OnError((error) =>
{
Debug.LogError($"固定位置Banner广告加载失败: {error.errMsg}");
isBannerShowing = false;
});
Debug.Log("固定位置Banner广告创建完成,将每30秒自动刷新");
}
/// <summary>
/// 隐藏Banner广告
/// </summary>
public void HideBannerAd()
{
if (bannerAd != null && isBannerShowing)
{
bannerAd.Hide();
isBannerShowing = false;
Debug.Log("Banner广告已隐藏");
}
}
/// <summary>
/// 显示Banner广告
/// </summary>
public void ShowBannerAd()
{
if (bannerAd != null && !isBannerShowing)
{
bannerAd.Show();
isBannerShowing = true;
Debug.Log("Banner广告已显示");
}
}
/// <summary>
/// 销毁Banner广告
/// </summary>
private void OnDestroy()
{
if (bannerAd != null)
{
bannerAd.Destroy();
bannerAd = null;
}
}
}
# 2. 激励视频广告实现
using TapTapMiniGame;
using UnityEngine;
public class RewardedVideoAdExample : MonoBehaviour
{
private TapRewardedVideoAd rewardedVideoAd;
private bool isRewardedVideoLoaded = false;
/// <summary>
/// 创建并加载激励视频广告
/// </summary>
public void CreateRewardedVideoAd()
{
// 避免重复创建
if (rewardedVideoAd != null)
{
Debug.Log("激励视频广告实例已存在");
return;
}
Debug.Log("开始创建激励视频广告");
// 创建激励视频广告参数
var param = new TapCreateRewardedVideoAdParam
{
adUnitId = "YOUR_REWARDED_VIDEO_AD_UNIT_ID" // 替换为你的广告位ID
};
// 创建激励视频广告实例
rewardedVideoAd = Tap.CreateRewardedVideoAd(param);
// 监听加载成功事件
rewardedVideoAd.OnLoad((res) =>
{
isRewardedVideoLoaded = true;
Debug.Log("激励视频广告加载成功!现在可以显示广告");
});
// 监听加载失败事件
rewardedVideoAd.OnError((error) =>
{
isRewardedVideoLoaded = false;
Debug.LogError($"激励视频广告加载失败: {error.errMsg}");
});
// 监听关闭事件(最重要的事件)
rewardedVideoAd.OnClose((result) =>
{
if (result.isEnded)
{
// 用户观看完整视频,发放奖励
Debug.Log("用户完整观看广告!开始发放奖励");
GiveRewardToPlayer();
}
else
{
// 用户提前关闭视频,不发放奖励
Debug.Log("用户提前关闭广告,不发放奖励");
}
Debug.Log("激励视频广告已关闭");
// 广告播放完成后会自动加载下一条广告
});
// 开始加载广告
rewardedVideoAd.Load();
Debug.Log("激励视频广告创建完成,正在加载中...");
}
/// <summary>
/// 显示激励视频广告
/// </summary>
public void ShowRewardedVideoAd()
{
// 检查广告实例是否存在
if (rewardedVideoAd == null)
{
Debug.LogError("请先创建激励视频广告实例");
return;
}
// 显示广告
Debug.Log("正在显示激励视频广告...");
rewardedVideoAd.Show();
}
/// <summary>
/// 检查激励视频广告是否可以显示
/// </summary>
public bool IsRewardedVideoReady()
{
// 只要实例存在就认为可以显示,因为播放完成后会自动加载下一条
return rewardedVideoAd != null;
}
/// <summary>
/// 发放奖励给玩家
/// </summary>
private void GiveRewardToPlayer()
{
// 在这里实现你的奖励发放逻辑
Debug.Log("奖励发放示例:");
Debug.Log("- 金币 +100");
Debug.Log("- 道具 +1");
// 实际项目中的代码示例:
// PlayerData.AddCoins(100);
// PlayerData.AddItem(ItemType.PowerUp, 1);
// PlayerData.Save();
// UIManager.UpdateCoinDisplay();
}
/// <summary>
/// 销毁激励视频广告
/// </summary>
private void OnDestroy()
{
if (rewardedVideoAd != null)
{
rewardedVideoAd.Destroy();
rewardedVideoAd = null;
}
}
}
# 集成到游戏中
# 1. 在游戏中使用Banner广告
public class GameManager : MonoBehaviour
{
public BannerAdExample bannerAdExample;
void Start()
{
// 游戏开始后创建Banner广告
bannerAdExample.CreateFixedBannerAd();
}
// 在特定场景隐藏Banner广告
public void EnterGameplay()
{
bannerAdExample.HideBannerAd();
}
// 在主菜单显示Banner广告
public void ReturnToMainMenu()
{
bannerAdExample.ShowBannerAd();
}
}
# 2. 在游戏中使用激励视频广告
public class RewardSystem : MonoBehaviour
{
public RewardedVideoAdExample rewardedVideoAdExample;
public Button watchAdButton;
void Start()
{
// 游戏开始后创建激励视频广告
rewardedVideoAdExample.CreateRewardedVideoAd();
// 绑定按钮点击事件
watchAdButton.onClick.AddListener(OnWatchAdClicked);
}
private void OnWatchAdClicked()
{
if (rewardedVideoAdExample.IsRewardedVideoReady())
{
rewardedVideoAdExample.ShowRewardedVideoAd();
}
else
{
Debug.Log("激励视频广告暂未准备好,请稍后再试");
}
}
void Update()
{
// 根据广告状态控制按钮可用性
watchAdButton.interactable = rewardedVideoAdExample.IsRewardedVideoReady();
}
}
# 关键注意事项
# 1. 广告加载时机
- Banner广告: 创建后自动加载并显示
- 激励视频广告: 必须先Load成功后才能Show
# 2. 生命周期管理
- 在场景切换或游戏退出时调用
Destroy()方法清理广告实例 - 避免重复创建广告实例
# 3. 错误处理
- 监听
OnError事件处理加载失败情况 - 常见失败原因:网络问题、广告库存不足、广告位ID错误
# 4. 用户体验优化
- Banner广告建议放在不影响游戏操作的位置
- 激励视频广告要确保用户主动选择观看
- 为广告加载状态提供适当的UI反馈
# 常见问题
# Q: 激励视频广告显示失败?
A: 请检查:
- 广告位ID是否正确
- 是否等待Load完成后再Show
- 网络连接是否正常
- 广告库存是否充足
# Q: Banner广告显示位置不正确?
A: 建议使用 CreateFixedBottomMiddleBannerAd 方法,它会自动适配不同屏幕尺寸。
# Q: 如何提高广告收益?
A:
- 合理控制广告展示频率
- 在用户体验自然中断点展示广告
- 为激励视频广告提供有价值的奖励
- 使用固定位置Banner广告的自动刷新功能
# 最佳实践总结
- 及早初始化: 在游戏启动时创建广告实例,确保广告及时加载
- 状态管理: 合理管理广告加载状态,避免在未加载完成时显示
- 内存管理: 在适当时机销毁广告实例,防止内存泄漏
- 用户体验: 平衡广告收益与用户体验,避免过度打扰用户
- 错误处理: 完善的错误处理机制,提升广告展示成功率
