当前位置: 首页 > news >正文

Godot游戏集成AdMob广告插件:从原理到实战的完整指南

1. 项目概述:为你的Godot游戏接入AdMob广告

如果你正在用Godot引擎开发Android游戏,并且希望通过广告来变现,那么Shin-NiL的这款AdMob插件几乎是你的不二之选。作为一个在移动游戏开发领域摸爬滚打多年的老手,我深知在游戏引擎中集成第三方SDK的繁琐与痛苦,尤其是广告SDK,涉及到平台特性、生命周期管理、异步回调等一系列头疼的问题。这款插件将AdMob的复杂接口封装成了Godot原生的节点(Node)和信号(Signal),让你能用熟悉的GDScript像操作普通游戏对象一样来管理广告,极大地简化了开发流程。

简单来说,这个插件就是一座连接Godot游戏世界和Google AdMob广告平台的桥梁。它支持横幅广告(Banner)、插页广告(Interstitial)、激励视频广告(Rewarded Video)以及较新的激励性插页广告(Rewarded Interstitial),覆盖了主流的广告形式。无论你是想在不干扰游戏体验的地方放个小横幅,还是在关卡间隙展示全屏插页广告,或是用奖励激励玩家观看视频,这个插件都能帮你搞定。接下来,我会带你从零开始,手把手完成插件的集成、配置到代码调用的全过程,并分享一些官方文档里不会写的实战经验和避坑指南。

2. 插件集成与环境配置详解

集成第三方插件,尤其是涉及原生平台(Android)的插件,第一步总是最关键的。配置错了,后面的一切都无从谈起。Shin-NiL的插件采用了Godot 3.2.2之后推荐的.gdap插件格式,比旧版的模块(Module)方式更清晰、更容易管理。

2.1 前置条件与工具准备

在开始之前,请确保你的开发环境已经就绪。你需要:

  1. Godot引擎:版本必须为3.2.2或更高。你可以在Godot官网下载。建议使用最新的稳定版,以获得最好的兼容性。
  2. Android SDK:Godot的导出功能依赖于Android SDK。如果你还没有配置,在Godot编辑器中,进入编辑器 -> 编辑器设置 -> 导出 -> Android,根据提示下载并设置Android SDK路径。这一步是导出任何Android应用的基础,务必先完成。
  3. 一个Godot项目:你当然得有一个正在开发中的游戏项目。

注意:如果你还在使用Godot 3.2以下的版本,或者需要iOS支持,这个插件不适用。你需要使用作者提到的旧版模块,但维护性和易用性会差很多。强烈建议将项目升级到Godot 3.2.2以上。

2.2 分步集成指南

官方README的步骤已经比较清晰,但有些细节对于新手来说可能一步踩坑。我结合自己的经验,把每一步都掰开揉碎,并补充关键原因。

第一步:启用Android自定义构建模板这是整个流程的基石。你需要在Godot项目中启用“Android自定义模板”。

  1. 打开你的Godot项目。
  2. 点击顶部菜单栏的项目 -> 导出...
  3. 在“导出”窗口中,点击“添加...”按钮,选择Android
  4. 在右侧的Android导出预设中,你会看到一个“自定义模板”分区。
  5. 勾选使用自定义构建
  6. 点击其下方的安装模板按钮。Godot会自动为你当前的项目下载并配置一个专有的Android构建模板。
    • 为什么需要这一步?Godot默认的Android导出是一个“黑盒”,我们无法修改其内部的Android工程结构。自定义模板相当于解开了这个黑盒,允许我们向其中注入像AdMob插件这样的原生代码和资源。

第二步:下载并放置插件文件

  1. 前往插件的GitHub发布页面。通常你应该选择最新的稳定版本(不是预发布版)。
  2. 下载名为GodotAdMobPlugin-x.x.x.zip的压缩包(例如GodotAdMobPlugin-5.0.0.zip)。
  3. 解压这个ZIP包。你会发现里面有两个关键目录:admob-pluginadmob-lib
  4. 在你的Godot项目文件系统中(通常是res://目录),你需要手动创建以下文件夹结构(如果不存在的话):
    • res://android/plugins/
  5. admob-plugin目录下的两个文件:GodotAdmob.gdap(插件描述文件)和GodotAdmob.release.aar(Android库文件),复制res://android/plugins/目录中。
  6. 将整个admob-lib目录(包含里面的GDScript脚本),复制到你的项目根目录res://下。

第三步:配置导出选项与权限回到Godot的导出窗口(项目 -> 导出...,选择Android预设):

  1. 权限:在“选项”标签页下,找到“权限”区域。这里必须勾选:
    • 访问网络状态 (Access Network State)
    • 互联网 (Internet)
    • 原因:广告需要从网络加载,并且AdMob SDK可能需要检查网络连接状态以优化请求。
  2. 插件:在“插件”区域,你现在应该能看到一个名为“Godot Ad Mob”的选项。勾选它。这告诉Godot在构建APK时,将我们刚才放置的插件打包进去。

第四步:配置AndroidManifest.xml(核心且易错)这是集成AdMob最关键的一步,错误会导致应用崩溃。AndroidManifest.xml是Android应用的“身份证”和“说明书”,AdMob需要在这里注册你的应用ID。

  1. 文件位置:res://android/build/AndroidManifest.xml。这个文件是在你“安装模板”后生成的。
  2. 用任何文本编辑器(如VS Code、Notepad++)打开它。
  3. 找到<application>标签。在这个标签内部,寻找由Godot插件系统生成的注释块:
    <!-- Custom application XML added by add-ons. --> <!--CHUNK_APPLICATION_BEGIN--> <!--CHUNK_APPLICATION_END-->
  4. 将你的AdMob应用ID配置,添加在这两行注释的下方(仍在<application>标签内)。例如:
    <application> ... (其他原有内容) <!-- Custom application XML added by add-ons. --> <!--CHUNK_APPLICATION_BEGIN--> <!--CHUNK_APPLICATION_END--> <!-- 在这里添加AdMob App ID --> <meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="ca-app-pub-3940256099942544~3347511713"/> </application>
    • 重要提示:示例中的ca-app-pub-3940256099942544~3347511713是Google提供的测试ID,只能在测试时使用。发布前,你必须替换为在AdMob后台为你应用创建的真实应用ID(格式为ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy)。使用测试ID发布会导致无广告填充或违规。
    • 警告:每次在Godot中重新“安装模板”,这个AndroidManifest.xml文件都会被覆盖重置!这意味着你添加的这行<meta-data>会消失。因此,在每次更新或重装模板后,都必须重新执行这一步。一个稳妥的做法是备份这个修改好的文件。

第五步:启用MultiDex支持(预防性步骤)随着项目引入的库(如AdMob SDK本身)增多,可能会遇到“64K引用限制”问题,导致构建失败。启用MultiDex可以解决。

  1. 打开文件:res://android/build/build.gradle
  2. 找到android -> defaultConfig部分。
  3. 在其中添加一行multiDexEnabled true
    android { defaultConfig { ... minSdkVersion 19 // 或其他值 targetSdkVersion 33 // 或其他值 multiDexEnabled true // 添加这一行 ... } }
    同样,这个文件也可能在更新模板时被覆盖,需要留意。

完成以上五步,插件的集成工作就基本完成了。你可以关闭导出窗口,回到Godot编辑器主界面。

3. 在Godot编辑器中配置AdMob节点

插件安装成功后,最大的便利就是可以在编辑器中像使用普通节点一样操作广告。这比纯代码创建要直观得多。

3.1 添加与配置AdMob节点

  1. 在场景编辑器中,点击“添加节点”按钮(或按Ctrl+A)。
  2. 在搜索框中输入“AdMob”,你应该能看到一个名为AdMob的节点类型。选择并创建它。
    • 黄金法则:一个场景中有且只能有一个AdMob节点。将它作为单例(Singleton)来管理是最佳实践。通常我会把它放在游戏的根节点(如一个名为Game的Node)下,或者一个专门管理全局逻辑的Global节点下。
  3. 选中场景中的AdMob节点,在右侧的检查器(Inspector)面板中,你会看到一系列属性。这些属性对应着插件的API,是预配置广告行为的地方:
    • Is Real重中之重。开发调试时务必设为false,这样AdMob会提供测试广告,避免因无效点击导致账号被封。发布到应用商店前,必须记得将其改为true
    • Banner On Top:横幅广告显示在屏幕顶部(true)还是底部(false)。根据你的游戏UI布局决定。
    • Banner Size:横幅广告尺寸。可选值如BANNER(标准横幅)、LARGE_BANNERSMART_BANNER(已废弃,不推荐)、ADAPTIVE_BANNER(推荐,自适应宽度)。ADAPTIVE_BANNER会根据设备屏幕宽度自动计算最佳高度,体验最好。
    • Banner Id/Interstitial Id/Rewarded Id/Rewarded Interstitial Id:分别对应四种广告单元的ID。和上面的应用ID一样,这里可以填入测试ID(例如横幅测试ID:ca-app-pub-3940256099942544/6300978111)进行开发。发布前替换为真实ID。
    • Child Directed:你的应用是否面向儿童。如果设为true,将遵守儿童在线隐私保护法(COPPA)的相关规定,广告内容会受到限制,并且Max Ad Content Rate设置会被忽略(强制为“G”级)。
    • Is Personalized:广告是否个性化。根据欧盟《通用数据保护条例》(GDPR),在欧洲经济区(EEA)需要获得用户同意后才能进行个性化广告推送。如果你面向全球市场,通常需要实现同意收集流程,并根据用户选择来设置此值。
    • Max Ad Content Rate:最高广告内容分级。可选“G”, “PG”, “T”, “MA”。这个设置必须与你在Google Play控制台中为应用设置的内容分级,以及在AdMob后台为广告单元设置的内容分级保持一致,否则可能导致应用被下架。
    • Ads Using Consent:是否在展示广告前需要获取用户同意。如果开启,你需要调用request_consent_info_update()方法。
    • Testing Consent:是否为测试目的而使用同意信息。仅用于调试。

3.2 连接信号(Signal)

AdMob的所有关键事件(如广告加载完成、广告关闭、用户获得奖励)都是通过Godot的信号机制来通知你的游戏的。这是Godot事件驱动的精髓所在。

在检查器面板切换到“节点”标签页,你可以看到AdMob节点所有可用的信号。你需要将这些信号连接到你的游戏脚本中相应的处理函数上。

  • 常用信号
    • banner_loaded:横幅广告加载成功时触发。
    • interstitial_closed:插页广告被用户关闭时触发。这是你恢复游戏逻辑(如进入下一关)的最佳时机。
    • rewarded:用户看完激励视频或激励性插页广告,应获得奖励时触发。它会传递currency(货币类型,如“coin”)和amount(数量)两个参数。你必须在这里发放游戏内奖励
    • rewarded_video_closed:激励视频广告关闭时触发(无论用户是否看完)。
    • interstitial_failed_to_load/rewarded_video_failed_to_load:广告加载失败时触发,并附带错误码。你应该在这里处理失败情况,例如记录日志或尝试重新加载。

连接信号的方法:点击信号旁边的“连接...”按钮,选择目标节点(通常是挂载了主逻辑脚本的节点),然后为它指定一个回调函数名。Godot会自动在目标脚本中创建一个空函数(如_on_AdMob_banner_loaded()),你只需在其中实现逻辑即可。

4. GDScript脚本编程与广告生命周期管理

编辑器配置是静态的,真正的动态控制还需要通过GDScript脚本。插件提供了丰富的方法(Method)来操控广告。

4.1 初始化与广告加载策略

广告的初始化和加载应该遵循一定的策略,以优化用户体验和应用性能。

extends Node # 假设这个脚本挂载在包含AdMob节点的父节点上 onready var admob = $AdMob # 获取对AdMob节点的引用 func _ready(): # 1. 初始化AdMob(在后台线程进行,避免卡顿) admob.initialize_on_background_thread() # 连接初始化完成信号 admob.connect("admob_initialized", self, "_on_admob_initialized") # 2. 预加载广告(非阻塞式) # 通常,在游戏启动或空闲时预加载插页广告和激励视频广告是个好习惯。 admob.load_interstitial() admob.load_rewarded_video() # 横幅广告可以根据需要立即加载并显示,或稍后加载。 func _on_admob_initialized(): print("AdMob初始化成功,可以开始加载或展示广告了。") # 初始化成功后,可以开始加载那些依赖于SDK初始化的广告。 # 例如,立即加载并显示一个底部横幅 admob.banner_on_top = false admob.load_banner() # load_banner()会立即显示

关键点解析

  • initialize_on_background_thread():这是一个重要的优化。AdMob SDK的初始化可能涉及网络和资源读取,放在主线程可能导致游戏卡顿。这个方法将其移至后台线程,初始化完成后会发出admob_initialized信号。
  • 预加载:插页广告和激励视频广告的加载需要时间(网络请求)。在用户可能需要看到广告之前(如游戏结束、进入商店前)就提前加载好,这样当需要展示时就能立即呈现,避免让用户等待黑屏或转圈,极大提升体验。

4.2 各类广告的展示与交互控制

不同的广告类型,其调用时机和逻辑各不相同。

横幅广告

# 显示横幅 func show_game_banner(): if not admob.is_real: # 如果是测试模式,可以更灵活控制 admob.load_banner() # 如果还没加载,则加载并显示 # 如果已经加载过,load_banner()会直接显示,或者可以调用show_banner() # 隐藏横幅(例如进入全屏游戏画面时) func hide_game_banner(): admob.hide_banner() # 切换横幅位置(例如横竖屏切换后调整) func on_screen_orientation_changed(is_portrait): # 假设横屏时放顶部,竖屏时放底部 admob.banner_on_top = !is_portrait admob.banner_resize() # 通知广告视图调整尺寸

插页广告

# 在合适的时机展示插页广告,例如游戏结束、场景切换时 func show_interstitial_ad(): if admob.is_interstitial_loaded(): # 关键:展示前务必检查是否已加载 admob.show_interstitial() # 展示后,立即开始预加载下一个,以备下次使用 admob.load_interstitial() else: print("插页广告未就绪,跳过展示。") # 也可以在这里触发一次新的加载 admob.load_interstitial() # 连接信号,处理广告关闭后的逻辑 func _on_AdMob_interstitial_closed(): print("插页广告已关闭。") # 恢复游戏音乐、继续游戏流程等 resume_game_after_ad()

激励视频广告

# 提供一个按钮或入口,让用户选择观看激励视频以获得奖励 func on_rewarded_video_button_pressed(): if admob.is_rewarded_video_loaded(): admob.show_rewarded_video() else: # 告知用户广告正在加载,请稍候 show_toast("广告加载中,请稍后重试...") admob.load_rewarded_video() # 尝试加载 # 最重要的信号:用户获得奖励 func _on_AdMob_rewarded(currency, amount): print("奖励发放:%s x %d" % [currency, amount]) # 根据 currency 和 amount 更新玩家数据 if currency == "coin": Global.player_coins += amount update_ui() # 发放奖励后,立即预加载下一个激励视频 admob.load_rewarded_video() # 广告关闭信号(无论是否获得奖励都会触发) func _on_AdMob_rewarded_video_closed(): print("激励视频广告关闭。") # 这里可以做一些清理或状态恢复,但不要在这里发放奖励! # 奖励必须在 `rewarded` 信号中处理。

4.3 广告状态管理与错误处理

健壮的广告模块必须有完善的错误处理。

# 连接加载失败信号 func _ready(): admob.connect("interstitial_failed_to_load", self, "_on_interstitial_failed") admob.connect("rewarded_video_failed_to_load", self, "_on_rewarded_video_failed") func _on_interstitial_failed(error_code): print("插页广告加载失败,错误码: ", error_code) handle_ad_error(error_code, "interstitial") func _on_rewarded_video_failed(error_code): print("激励视频加载失败,错误码: ", error_code) handle_ad_error(error_code, "rewarded") # 统一的错误处理函数 func handle_ad_error(error_code, ad_type): match error_code: 0: print("ERROR_CODE_INTERNAL_ERROR: 内部错误,SDK内部出现问题。") 1: print("ERROR_CODE_INVALID_REQUEST: 广告请求无效,可能是配置错误。") 2: print("ERROR_CODE_NETWORK_ERROR: 网络错误,请检查设备网络。") 3: # 最常见!表示广告请求成功,但当前没有广告库存(No Fill)。 print("ERROR_CODE_NO_FILL: 暂无广告可展示。这在测试或新应用上很常见。") # 对于No Fill,可以设置一个延迟重试机制,但不要过于频繁。 yield(get_tree().create_timer(30.0), "timeout") # 等待30秒后重试 if ad_type == "interstitial": admob.load_interstitial() elif ad_type == "rewarded": admob.load_rewarded_video() 8: print("ERROR_CODE_APP_ID_MISSING: 未在AndroidManifest中找到应用ID。请检查配置!") _: print("未知错误码: ", error_code) # 在实际游戏中,你可能想用UI提示用户“广告暂时不可用”

5. 高级主题、优化与实战避坑指南

掌握了基础集成和调用后,下面这些来自实战的经验能让你走得更稳,避免很多不必要的麻烦。

5.1 测试与发布流程的严格区分

这是保护你AdMob账号的生命线

  1. 开发/测试阶段
    • Is Real属性务必设为false
    • 使用Google提供的测试广告单元ID。例如:
      • 横幅:ca-app-pub-3940256099942544/6300978111
      • 插页:ca-app-pub-3940256099942544/1033173712
      • 激励视频:ca-app-pub-3940256099942544/5224354917
    • 使用测试设备。在真机上测试时,将你的设备ID添加到AdMob后台的“测试设备”列表中,或者使用AdRequest.Builder.addTestDevice("你的设备ID")(该插件可能已封装,但测试ID已足够安全)。
  2. 发布阶段
    • 在构建发布版APK/AAB之前,必须Is Real属性改为true
    • 必须AndroidManifest.xml中的应用ID和所有广告单元ID,替换为你在AdMob后台创建的真实ID
    • 在Google Play Console中填写正确的内容分级,并确保与AdMob广告单元中的Max Ad Content Rate设置匹配。

5.2 针对不同地区的合规性设置(GDPR/COPPA)

如果你的游戏面向全球市场,特别是欧洲(EEA)或儿童,必须处理合规问题。

  • GDPR(欧盟)Is Personalized属性是关键。你需要使用Google的用户意见征求工具(UMP SDK)。该插件通过ads_using_consentrequest_consent_info_update()consent_app_can_request_ad信号提供了支持。基本流程是:
    1. 设置ads_using_consent = true
    2. 在游戏启动初期,调用admob.request_consent_info_update()
    3. 等待consent_app_can_request_ad信号。根据信号传来的consent_status,你可以设置is_personalized(true表示个性化,false表示非个性化)。
    4. 在此之后,再初始化或加载广告。
  • COPPA(美国儿童隐私保护):如果你的应用明确面向13岁以下儿童,将Child Directed属性设为true。这将告知AdMob投放适合儿童的广告内容,并自动将Max Ad Content Rate视为“G”。

5.3 性能优化与ANR预防

广告SDK在低端设备上可能引发应用无响应(ANR)。插件提供了优化方法:

  • 后台线程初始化:如前所述,始终使用initialize_on_background_thread()
  • 按需加载与缓存:不要一次性加载所有类型的广告。根据游戏进程预测用户行为,适时预加载。例如,在游戏主菜单加载插页广告,在接近关卡结束时加载激励视频广告。
  • 避免密集操作:不要在短时间内连续调用loadshow方法,尤其是广告加载失败后,应使用指数退避算法延迟重试,而不是立即循环重试。

5.4 常见问题排查与解决实录

即使按照指南操作,也难免会遇到问题。以下是我和社区开发者常遇到的坑及解决方法:

问题现象可能原因排查步骤与解决方案
编译成功,但运行后立刻崩溃1.AndroidManifest.xml中未配置或错误配置AdMob应用ID。
2. 插件文件未正确放置或导出选项未勾选。
3. MultiDex未启用,方法数超限。
1. 使用adb logcat -s godot命令查看崩溃日志,重点寻找IllegalArgumentExceptionMissing application ID等关键字。
2. 双重检查第四步第五步的配置,确保文件位置和内容无误。
3. 确认build.gradle中已添加multiDexEnabled true
广告无法加载,一直显示“加载中”或空白1. 网络问题。
2. 使用了真实ID但未发布应用,或广告单元未激活。
3. 测试时未使用测试ID。
1. 检查设备网络连接。
2.开发阶段务必使用测试ID,并将Is Real设为false
3. 在AdMob后台检查广告单元状态是否为“已生效”。新创建的单元可能需要几小时才能投放广告。
错误码 3 (ERROR_CODE_NO_FILL)这是最常见的情况,表示AdMob有请求,但当前没有匹配的广告库存。1.在测试阶段这是正常的,测试广告库存也可能有限。
2. 如果是新上线的应用,需要等待一段时间(可能24-48小时)积累流量和数据,广告填充率才会提升。
3. 检查广告定位设置是否过于狭窄。
横幅广告尺寸异常或位置不对1. 屏幕旋转后未调整广告。
2. 使用了已废弃的SMART_BANNER
3. 游戏UI布局冲突。
1. 监听Godot的OS.screen_orientation_changed信号,在回调中调用admob.banner_resize()并可能需要调整banner_on_top
2. 推荐使用ADAPTIVE_BANNER,它能更好地适应不同屏幕。
3. 检查Godot的UI布局,确保广告视图有正确的显示空间。
激励视频看完后未触发rewarded信号1. 用户未看完视频(提前关闭)。
2. 信号未正确连接。
3. 网络问题导致验证失败。
1.rewarded信号只在用户完成观看并达到奖励条件时触发。用户中途关闭会触发rewarded_video_closed但没有奖励。
2. 在编辑器和代码中双重检查信号连接。
3. 确保奖励逻辑只在rewarded信号回调中处理,不要在closed信号中处理。
在编辑器或非Android平台运行报错在Windows/Mac的Godot编辑器中直接运行包含AdMob节点的场景。此插件仅适用于Android平台!AdMob节点及其GDScript脚本依赖于底层的Android Java代码。在编辑器或其他平台(如HTML5)运行时,相关函数不存在。必须使用条件编译来保护代码:
if OS.get_name() == “Android”:
# 这里是AdMob相关代码
else:
print(“非Android平台,跳过广告初始化”)

最后,记得充分利用插件自带的Demo项目。它是绝佳的学习资料,展示了所有广告类型的集成、信号连接和基本交互。在完全理解Demo的基础上,再将其逻辑适配到自己的项目中,能事半功倍。

http://www.jsqmd.com/news/779498/

相关文章:

  • Flutter × Harmony6.0 社团活动管理页面实战:从组件设计到鸿蒙风格 UI 构建
  • 从图库管理到 RAW 精修 ACDSee 2025 专业版下载安装教程
  • 分类1_java
  • AWS资源管理利器:aws-manager命令行工具的设计理念与实战应用
  • 如何将CT-MPI影像组学特征与冠心病大血管及微循环机制建立关联,并进一步解释其与主要不良心血管事件(MACE)预后的机制联系
  • 搜维尔科技:Tesollo与大成高科技携手合作,确保机器人手批量生产的质量
  • 20260507am8有题目
  • 3步快速解决NVIDIA显卡广色域显示器色彩失真问题
  • MCPJam Inspector:一站式MCP服务器开发调试与测试平台实战指南
  • 并购交割前72小时,AISMM自动触发37项隐性风险熔断——2026奇点大会现场压测原始数据首度流出
  • 为什么数据治理越做越累?因为你忽略了最重要的事情...
  • Flipper Zero ESP32-C5扩展板:无线安全测试利器
  • 从A2L/HEX文件到实时标定:手把手教你用INCA搭建HIL台架测试环境(CAN 500K波特率设置)
  • 修改PDF文字别再傻傻转Word 了,修改PDF只需5秒,这神器简直是打工人的救星!
  • OpenAI连发GPT-5.5系列:免费版幻觉大降,安全版能力飙升,千亿融资估值直冲8520亿美元
  • 转载--Karpathy 怎么看 AI Agent(三):怎么给 Agent 搭一个真正能用的上下文
  • AI编码助手技能包:Terraform与Terramate最佳实践标准化指南
  • 神经形态芯片Cerebra-H:边缘计算能效优化实践
  • 【LSF集群搭建】1-集成LDAP统一身份体系
  • VR大空间海洋:沉浸式探索深海世界的全新科普体验
  • 鸿蒙开发入门:DevEco Studio 6.1.0 全流程实战指南
  • 如何高效捕获网络流媒体资源:猫抓扩展深度技术解析
  • 桌面软件 vs 微信小程序:2026年B站字幕提取工具推荐怎么选
  • 计算机能效标准下的功耗优化:从芯片到系统的设计实践
  • 2026年心梗脑梗专科最新评价,哪家医院更值得信赖?
  • 热度拉满!HUD矩阵硬核亮相,泽景量产定点、海外开拓双线提速
  • linux学习进展 mysql视图详解
  • 免费解锁WeMod Pro高级功能的终极教程:Wand-Enhancer完整指南
  • A-68 语音处理模组 ——ICU 重症监护室专用语音通信解决方案
  • 别再自己写RAG了!用百度千帆AppBuilder的‘知识问答应用’,5分钟搞定一个Java学习助手