# Unity 广告接入

本文介绍如何在Unity项目中接入Tap小游戏广告系统,包含Banner广告和激励视频广告的完整实现方案。

# 前置条件

在开始广告接入前,请确保:

  1. 已完成 Tap小游戏Unity接入指南
  2. 已按照 变现能力指引 创建广告位并获取广告位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: 请检查:

  1. 广告位ID是否正确
  2. 是否等待Load完成后再Show
  3. 网络连接是否正常
  4. 广告库存是否充足

# Q: Banner广告显示位置不正确?

A: 建议使用 CreateFixedBottomMiddleBannerAd 方法,它会自动适配不同屏幕尺寸。

# Q: 如何提高广告收益?

A:

  1. 合理控制广告展示频率
  2. 在用户体验自然中断点展示广告
  3. 为激励视频广告提供有价值的奖励
  4. 使用固定位置Banner广告的自动刷新功能

# 最佳实践总结

  1. 及早初始化: 在游戏启动时创建广告实例,确保广告及时加载
  2. 状态管理: 合理管理广告加载状态,避免在未加载完成时显示
  3. 内存管理: 在适当时机销毁广告实例,防止内存泄漏
  4. 用户体验: 平衡广告收益与用户体验,避免过度打扰用户
  5. 错误处理: 完善的错误处理机制,提升广告展示成功率