You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity自适应横幅高度获取异常:如何获取设备真实高度

Unity获取自适应横幅真实高度的解决方案

核心问题:调用时机错误

不要在横幅调用Show()后立即获取高度,广告加载、渲染和布局需要时间,必须等横幅完全加载并显示完成后再获取,否则拿到的是默认值或0。

正确实现步骤

1. 利用广告SDK的加载完成回调

几乎所有主流广告SDK(如AdMob、Unity Ads)都提供了横幅加载/显示完成的回调事件,在回调中执行高度获取逻辑才是可靠的。

以AdMob为例的代码示例:

using GoogleMobileAds.Api;
using UnityEngine;

public class BannerAdManager : MonoBehaviour
{
    private BannerView _bannerView;

    void Start()
    {
        InitializeAdaptiveBanner();
    }

    private void InitializeAdaptiveBanner()
    {
        string adUnitId = "你的广告单元ID";
        // 创建自适应横幅,适配当前屏幕宽度和方向
        AdSize adaptiveSize = AdSize.GetCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(AdSize.FullWidth);
        _bannerView = new BannerView(adUnitId, adaptiveSize, AdPosition.Bottom);

        // 注册加载完成回调
        _bannerView.OnAdLoaded += OnBannerLoaded;

        // 请求加载广告
        AdRequest request = new AdRequest.Builder().Build();
        _bannerView.LoadAd(request);
    }

    private void OnBannerLoaded(object sender, System.EventArgs args)
    {
        // 此时横幅已完成渲染,获取DP单位的高度
        float bannerHeightDp = _bannerView.GetHeight();
        // 转换为Unity像素单位(DP转像素公式:像素 = DP * 屏幕DPI / 160)
        float bannerHeightPixels = bannerHeightDp * Screen.dpi / 160f;

        // 用获取到的高度调整游戏UI布局,比如上移主画布避免被遮挡
        RectTransform mainCanvas = GameObject.Find("MainGameCanvas").GetComponent<RectTransform>();
        mainCanvas.anchoredPosition = new Vector2(0, bannerHeightPixels / 2);
    }
}

2. 直接获取横幅UI的RectTransform尺寸

如果横幅是作为Unity UI元素存在的,在其激活并完成布局后,可以直接读取RectTransform的高度:

// 确保横幅对象已激活且布局完成
GameObject bannerObj = GameObject.Find("AdBanner");
if (bannerObj.activeSelf)
{
    RectTransform bannerRect = bannerObj.GetComponent<RectTransform>();
    float realHeight = bannerRect.rect.height;
    // 后续布局调整逻辑
}

3. 处理屏幕方向变化

自适应横幅在横竖屏切换时高度会改变,需要监听屏幕方向变化,重新获取高度并更新布局:

void OnRectTransformDimensionsChange()
{
    // 屏幕尺寸变化时,重新获取横幅高度
    if (_bannerView != null && _bannerView.IsLoaded())
    {
        float bannerHeightDp = _bannerView.GetHeight();
        float bannerHeightPixels = bannerHeightDp * Screen.dpi / 160f;
        // 更新UI布局
    }
}

避坑要点

  • 不要依赖"不超过屏幕15%"的经验值,必须以实际获取到的真实高度为准。
  • 注意单位转换:广告SDK返回的高度通常是DP单位,必须转换成Unity的像素单位再用于布局调整。
  • 测试时要覆盖不同分辨率、屏幕比例的设备,确保适配逻辑生效。

内容的提问来源于stack exchange,提问作者Tobias S. Lucian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 10:32:48