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

Flutter集成Unity Ads遇UnityAdsLoadError.invalidArgument等问题求助

解决Flutter集成Unity Ads无法展示的问题

错误核心分析

从日志可定位两个关键问题:

  1. UnityAdsBannerError.noFill:目标广告位无可用广告填充(测试模式下多为配置或调用逻辑问题)
  2. adMarkup is missing; objectId is missing:广告加载调用不符合SDK规范,尤其是Banner广告的手动加载逻辑错误

具体修复步骤

1. 移除Banner广告的手动load调用

Unity Ads的UnityBannerAd组件会自动完成加载与展示流程,手动调用UnityAds.load()会触发无效参数错误。直接删除Load_Banner_Ads()方法,同时移除初始化完成后对该方法的调用。

2. 修正Interstitial广告的加载与展示逻辑

  • 确保Unity后台的Interstitial_Android广告位已启用,测试阶段可优先使用官方测试广告位ID(需确认后台配置对应)
  • 避免初始化完成后立即调用加载方法,可延迟几秒或在需要展示前提前触发加载,防止SDK未完全就绪导致的异常
  • 展示前先检查广告是否加载完成,避免调用未就绪的广告

3. 优化类成员变量的使用

将非静态的iscorrect_platform改为静态getter,避免静态方法中重复创建实例:

static bool get isCorrectPlatform => Platform.isAndroid || Platform.isIOS;

修复后的完整代码示例

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:unity_ads_plugin/unity_ads_plugin.dart';

class Ads {
  static bool get isCorrectPlatform => Platform.isAndroid || Platform.isIOS;

  static init() async {
    if (isCorrectPlatform) {
      await UnityAds.init(
        gameId: 'XXXXXXXX',
        testMode: true,
        onComplete: () {
          print('Initialization Complete');
          LoadInterstitialAds();
        },
        onFailed: (error, message) =>
            print('Initialization Failed: $error $message'),
      );
    }
  }

  static Widget showBannerAds() {
    if (isCorrectPlatform) {
      return UnityBannerAd(
        placementId: 'Banner_Android',
        onLoad: (placementId) => print('Banner loaded: $placementId'),
        onClick: (placementId) => print('Banner clicked: $placementId'),
        onShown: (placementId) => print('Banner shown: $placementId'),
        onFailed: (placementId, error, message) =>
            print('Banner Ad $placementId failed: $error $message'),
      );
    }
    return const SizedBox.shrink();
  }

  static LoadInterstitialAds() async {
    if (isCorrectPlatform) {
      const String pid = "Interstitial_Android";
      await UnityAds.load(
        placementId: pid,
        onComplete: (placementId) => print('Load Complete $placementId'),
        onFailed: (placementId, error, message) =>
            print('Load Failed $placementId: $error $message'),
      );
    }
  }

  static showInterstitialAds() async {
    if (isCorrectPlatform) {
      const String pid = "Interstitial_Android";
      final isLoaded = await UnityAds.isReady(placementId: pid);
      if (isLoaded) {
        UnityAds.showVideoAd(
          placementId: pid,
          onStart: (placementId) => print('Video Ad $placementId started'),
          onClick: (placementId) => print('Video Ad $placementId click'),
          onSkipped: (placementId) => print('Video Ad $placementId skipped'),
          onComplete: (placementId) {
            print('Video Ad $placementId completed');
            LoadInterstitialAds();
          },
          onFailed: (placementId, error, message) {
            print('Video Ad $placementId failed: $error $message');
            LoadInterstitialAds();
          },
        );
      } else {
        print('Interstitial ad not ready, loading now...');
        LoadInterstitialAds();
      }
    }
  }
}

额外检查项

  • 确认Unity Ads后台的Game ID、广告位ID与代码中完全一致,无拼写错误
  • 测试模式下将设备添加到Unity后台的测试设备列表,否则测试广告可能无法填充
  • 升级unity_ads_plugin到最新稳定版,避免SDK兼容性问题

内容的提问来源于stack exchange,提问作者Somnath Dash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 14:07:34