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

Unity中如何获取广告Canvas对象并修改Sort Order?

Unity插页广告Canvas排序层级优化方案

以下是几种比GameObject.Find()更可靠的实现思路:

1. 利用广告SDK的回调获取实例

绝大多数广告SDK(如Unity Ads、AdMob)都提供了广告加载/显示的回调接口,在回调中可以直接拿到广告对象的引用,完全不需要依赖对象名称。

以Unity Ads为例,通过监听广告显示完成的回调获取对象:

private void Start()
{
    // 注册广告显示回调(根据你使用的SDK调整事件名)
    UnityAdsManager.OnInterstitialShown += AdjustAdCanvasOrder;
}

private void AdjustAdCanvasOrder(GameObject adObj)
{
    Canvas adCanvas = adObj.GetComponentInChildren<Canvas>();
    if (adCanvas != null)
    {
        adCanvas.sortingOrder = 100; // 设置目标层级
    }
}

2. 给广告对象添加标识标签/自定义组件

如果能访问广告SDK的预制体(部分SDK允许自定义),给其添加一个自定义标签(比如"InterstitialAd")或空的自定义组件(比如AdMarker),后续通过标识查找对象:

用自定义组件示例:

// 自定义空组件,仅作为标识
public class AdMarker : MonoBehaviour {}

// 查找并调整层级
private void AdjustAdCanvas()
{
    AdMarker adMarker = FindObjectOfType<AdMarker>();
    if (adMarker != null)
    {
        Canvas adCanvas = adMarker.GetComponentInParent<Canvas>();
        adCanvas.sortingOrder = 100;
    }
}

3. 监听Canvas创建并特征匹配

通过Unity的场景加载事件或对象创建监听,遍历所有Canvas并根据广告Canvas的特征(比如包含广告SDK的专属组件、尺寸比例)判断目标对象:

private void OnEnable()
{
    SceneManager.sceneLoaded += CheckAdCanvasOnSceneLoad;
}

private void CheckAdCanvasOnSceneLoad(Scene scene, LoadSceneMode mode)
{
    Canvas[] allCanvases = FindObjectsOfType<Canvas>();
    foreach (Canvas canvas in allCanvases)
    {
        // 根据广告组件特征判断(示例为Unity Ads组件)
        if (canvas.GetComponentInChildren<UnityAdsInterstitial>() != null)
        {
            canvas.sortingOrder = 100;
        }
    }
}

4. 直接配置SDK层级(优先推荐)

部分广告SDK本身提供了层级配置选项,比如在AdMob控制台、Unity Ads的项目设置里,直接设置广告Canvas的Sorting Order,无需写代码查找对象。可以先查阅你使用的SDK文档确认是否有该功能。

内容的提问来源于stack exchange,提问作者Mj J

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:50:36