UE自动化测试实战:构建Testing Grounds提升游戏开发质量与效率
1. 项目概述为什么说Testing Grounds是UE开发者的“终极挑战”在Unreal Engine社区里混久了你总会听到一些项目代号它们像一个个传说代表着不同阶段开发者需要跨越的门槛。对于刚入门的新手可能是“First Person Shooter”模板对于想深入动画系统的可能是“Lyra Starter Game”。但如果你听到有老鸟在讨论“Testing Grounds”那多半意味着对话的深度已经进入了另一个维度——一个关于工程化、健壮性和自动化测试的硬核领域。“Testing Grounds”这个名字本身就很有意思。它不是一个具体的官方模板或课程而更像是一个社区共识下的“试炼场”概念。其核心挑战在于它要求开发者在一个接近真实游戏复杂度的沙盒环境中构建一套完整、可维护、可扩展的自动化测试体系。这远不止是写几个单元测试函数那么简单。它涉及到如何将Unreal Engine庞大的功能模块如Gameplay Ability System、AI行为树、网络同步、物理模拟进行有效的隔离与验证如何模拟玩家输入和游戏状态以及如何让这些测试能在CI/CD流水线中稳定运行。很多开发者能写出功能炫酷的Demo但一旦项目规模膨胀bug就开始指数级增长且难以定位。“Testing Grounds”要解决的正是这种“开发后期之痛”。它适合那些已经不满足于实现单一功能开始关注项目长期健康度、团队协作效率以及代码质量的资深UE开发者。如果你曾为某个线上bug排查了通宵或者对重构大型蓝图感到恐惧那么理解并搭建你自己的“Testing Grounds”将是提升工程能力的关键一步。2. 核心挑战拆解从功能实现到质量保障的思维转变2.1 挑战一理解UE中测试的独特分层在通用软件工程中测试金字塔单元测试、集成测试、端到端测试的概念很清晰。但在Unreal Engine里这套模型需要经过一次“本地化”改造。因为UE项目混合了C代码、蓝图脚本、资产数据以及运行时引擎子系统单纯的代码单元测试覆盖不了大部分问题。第一层是C单元测试。这主要使用Unreal Engine自带的Unreal Test Framework基于Google Test。它的挑战在于如何 mock 那些严重依赖引擎全局状态或游戏世界的对象。例如测试一个计算伤害的C函数这个函数可能需要读取一个UDataAsset数据资产或者调用一个需要UWorld上下文的方法。你需要学会使用FScope系列的测试辅助工具或者构建轻量级的Test Harness测试套件来提供必要的模拟环境。第二层是蓝图功能测试。这是UE测试体系中最具特色也最实用的一环也就是网络资料中提到的Functional Testing。它不是在代码层面运行而是在一个真实的Level关卡中通过放置Functional Test Actor来驱动。你可以把它理解为“集成测试”或“场景测试”。它的强大之处在于可以测试蓝图逻辑、动画状态机、AI行为、物理交互等一切在编辑器中可见的内容。其核心挑战在于测试的稳定性和性能。一个功能测试可能会加载整个地图、生成多个AI、播放过场动画如何确保它每次运行的结果一致且不会因为性能波动而失败是设计时的首要考量。第三层是自动化系统测试。这通常通过Automation System来驱动可以批量运行上述的单元测试和功能测试并生成报告。它对接CI/CD是保障团队每日构建质量的门神。这里的挑战在于测试用例的管理、依赖隔离以及失败日志的清晰度。2.2 挑战二构建可靠且可维护的测试数据测试的灵魂在于数据。在“Testing Grounds”中你不仅要测试逻辑更要测试数据。这引出了网络资料中一个关键概念Ground Truth Data。什么是Ground Truth Data简单说就是“标准答案”。对于某些测试尤其是涉及物理模拟、复杂动画混合或概率性结果如战利品掉落的功能其正确结果很难用简单的“等于”或“不等于”来断言。例如测试一个角色从特定高度跌落后的血量扣除是否准确。受浮点数精度、物理引擎微调的影响每次模拟的结果可能有极小差异。这时Ground Truth Data的流程就派上用场了首次运行人工验证你精心设置测试场景手动运行一次确认此刻的结果是“正确的”。保存为基准将这个“正确”状态可以是一个Actor的位置、旋转一组属性的数值甚至是一张截图保存为一个UGroundTruthData资产。后续自动化比对以后每次自动化测试运行时系统会再次执行相同操作产生新的结果并将其与之前保存的Ground Truth Data进行比对。比对逻辑可以由你自定义比如位置误差在5个单位内算通过。这个模式的挑战在于数据的管理和版本控制。Ground Truth Data资产本身是.uasset文件需要随项目代码一同管理。当游戏逻辑更新导致“正确结果”发生变化时比如调整了重力参数你需要有流程来更新这些基准数据而不是简单地让测试失败。通常这会涉及一个“重新生成基准”的模式并需要二次人工确认。注意过度依赖Ground Truth Data也有风险。如果基准数据本身有误或者比对阈值设置过宽测试就会失去意义。它最适合用于那些输出稳定、但验证逻辑复杂或微妙的场景。2.3 挑战三测试场景的搭建与资源管理“Testing Grounds”意味着你需要专门为测试创建关卡和资产。这听起来简单实则陷阱重重。首先测试关卡必须轻量且独立。你不能直接把游戏的主地图拿来测试因为它加载慢、资源多且可能包含不可预测的动态元素如随机天气。一个良好的实践是创建名为/Test/或/TestingGrounds/的专用内容目录在里面创建仅包含必要元素的测试地图。例如一个测试武器伤害的关卡可能只需要一个平坦地面、一个目标假人、光照基础以及待测试的武器。其次测试的初始化必须可控且可重复。这意味着你需要清除测试间的状态污染。在功能测试中要善用RegisterAutoDestroyActor函数将测试中生成的临时Actor注册进去确保测试结束后它们会被自动清理。对于全局状态可能需要在测试的PrepareTest阶段进行重置在OnTestFinished阶段进行还原。最后资产引用要稳固。测试蓝图中硬编码的资产路径如/Game/Weapons/Rifle在项目重构时很容易断裂。考虑使用Primary Data Asset或Data Table来管理测试用例与资产的映射关系这样只需更新数据表而无需修改大量测试蓝图。3. 实战构建一步步搭建你的第一个Testing Grounds3.1 环境准备与插件启用在开始之前确保你的Unreal Engine项目已启用必要的插件。打开编辑(Edit) - 插件(Plugins)在搜索框中输入“Functional Testing”和“Automation”。你需要确保以下插件已启用Functional Testing Editor这是创建和编辑功能测试的核心。Automation Test用于运行和管理自动化测试套件。启用后可能需要重启编辑器。我建议为此专门创建一个名为TestingGrounds的空白C项目或者在你现有项目的副本上进行避免污染主开发分支。3.2 创建第一个功能测试验证角色基础移动让我们从一个最简单的测试开始验证角色按下前进键后确实在向前移动。步骤1创建测试关卡在内容浏览器中右键 -关卡(Level) - 空白关卡(Blank Level)命名为LV_Test_CharacterMovement。删除默认的地面。我们将从零开始搭建以获得完全的控制权。从放置Actor面板拖入一个Player Start和一个Functional TestActor。将Functional Test重命名为FT_CharacterMoveForward。步骤2设置测试逻辑选中FT_CharacterMoveForward打开关卡蓝图Level Blueprint。在关卡蓝图中右键搜索Event Begin Play并创建该节点。从FT_CharacterMoveForward的引用引脚拖出搜索并调用Start Test函数。这将在游戏开始时触发我们的测试。现在需要连接测试的具体内容。从FT_CharacterMoveForward的引用引脚拖出搜索On Test Start事件。这个事件节点就是测试执行的主体。在On Test Start之后我们需要生成测试角色使用Spawn Actor from Class节点生成一个你的游戏角色类例如BP_TestCharacter。这个角色蓝图应该是一个简化版只包含移动组件和必要的胶囊体。模拟按键输入这是关键。我们不能依赖真实玩家输入。可以使用Set Input Mode Game Only确保输入被游戏捕获然后使用Input Key节点或更高级的Enhanced Input的模拟触发来模拟按下“前进”键如W键或Gamepad的Left Thumbstick Up。注意Input Key需要提供一个Player Controller我们可以通过Get Player Controller获取并在生成角色后使用Possess来让该控制器控制我们的测试角色。等待并检查结果模拟按键后使用Delay节点等待一个短暂时间如0.5秒让角色移动一段距离。然后获取角色的当前位置Get Actor Location。断言计算角色初始位置生成时的位置与当前位置在前进方向例如X轴上的差值。使用Functional Test Actor提供的Assert类节点例如Assert Is Greater判断移动距离是否大于一个最小阈值如10个单位。结束测试无论断言成功与否最后都必须调用Finish Test节点并传入一个布尔值True表示通过False表示失败。将这个节点连接到On Test Start的执行链末端。步骤3配置测试Actor回到关卡中的FT_CharacterMoveForward在细节Details面板中你可以设置一些有用属性Observation Point将一个Camera Actor拖入此处。当测试运行时视角会自动跳转到这个摄像机方便你观察测试过程对于复杂测试非常有用。Test Timeout设置一个超时时间如30秒。如果测试在这个时间内没有调用Finish Test将被判定为超时失败防止死循环。3.3 引入Ground Truth Data进行复杂验证假设我们要测试一个更复杂的场景角色投掷手榴弹手榴弹在碰撞后应在特定范围内造成伤害。步骤1设计测试场景创建一个新关卡LV_Test_GrenadeDamage。放置一个测试角色、几个作为伤害目标的“目标假人”可以用简单的立方体Mesh并附加一个自定义的Health组件以及一个用于投掷的起始点。步骤2创建Ground Truth Data资产在内容浏览器中右键 -杂项(Miscellaneous) - 数据资产(Data Asset)。在弹出窗口中选择GroundTruthData作为父类启用插件后会出现。将其命名为DA_GTD_GrenadeDamage。打开这个数据资产。它本质上是一个容器可以引用任何UObject。对于伤害测试我们可能需要存储每个目标假人在爆炸后的预期生命值。一种设计是我们创建一个简单的USTRUCT包含目标ID和预期生命值然后将一个包含这些结构体的数组存储在这里。但更直接的方法是我们第一次运行时直接保存爆炸后场景的状态快照比较困难。一个更实用的方法是我们存储一个“伤害总量”作为Ground Truth。即所有假人初始生命值总和减去爆炸后生命值总和应该等于一个固定值。步骤3编写测试逻辑放置一个新的Functional TestActor命名为FT_GrenadeDamage。在其子类蓝图或关卡蓝图中的该测试逻辑里中重写或使用PrepareTest来初始化场景记录所有目标假人的初始生命值总和。在OnTestStart中控制角色投掷手榴弹。使用Delay等待爆炸和伤害计算完成。计算所有目标假人的当前生命值总和。关键步骤比对Ground Truth尝试从DA_GTD_GrenadeDamage资产中加载之前保存的“预期伤害总量”。如果是第一次运行资产为空或标记了重置则将本次计算出的伤害总量保存到该资产中并手动标记测试为“需要验证”可以记录日志并暂停然后调用FinishTest(false)。你需要人工检查这次结果是否正确。如果不是第一次运行则将本次计算的伤害总量与Ground Truth Data中存储的值进行比对。允许一个小的误差范围如1点生命值以应对浮点误差如果差值在范围内则FinishTest(true)否则FinishTest(false)。步骤4重置基准如果后续游戏更新导致伤害公式改变预期的伤害总量变了怎么办你需要在DA_GTD_GrenadeDamage资产编辑器中找到一个名为ResetGroundTruth的布尔变量或类似名称勾选它并保存。下次测试运行时它会发现这个标志丢弃旧数据重新走“首次运行”的流程让你有机会建立新的基准。4. 高级模式与自动化集成4.1 构建数据驱动的测试套件当测试用例越来越多时手动为每个测试创建关卡和配置将变得不可维护。这时需要引入数据驱动的概念。使用Data Table定义测试用例创建一个CSV或JSON格式的Data Table每一行定义一个测试用例。列可以包括测试ID、地图名称、需要生成的Actor类、初始位置、触发事件、预期结果等。创建通用的“测试执行器”蓝图这是一个特殊的Functional Test Actor它在PrepareTest阶段读取Data Table根据当前测试ID动态生成场景、配置Actor。在测试逻辑中引用表格数据OnTestStart中的逻辑不再硬编码而是从Data Table的当前行中获取参数来执行动作和断言。这样你只需要维护一张表格就能管理成百上千个测试场景。添加新测试就是往表格里加一行。4.2 与CI/CD流水线集成Testing Grounds的最终价值在于自动化。你需要让这些测试能在无人值守的情况下在构建服务器上运行。命令行执行Unreal Engine提供了命令行工具UnrealEditor-Cmd.exe来运行自动化测试。基本命令格式如下D:\UE_5.8\Engine\Binaries\Win64\UnrealEditor-Cmd.exe YourProject.uproject -runTestProject -ExecCmdsAutomation RunTests YourTestCategory -unattended -nopause -testexitAutomation Test Queue Empty -log-runTestProject指定运行测试。-ExecCmdsAutomation RunTests YourTestCategory执行运行测试的命令。YourTestCategory是你在Functional Test Actor的Test Category属性中设置的分类用于组织测试。-unattended -nopause以无界面、不暂停模式运行。-testexit测试完成后退出编辑器。-log输出日志。生成测试报告命令行执行后会生成一个Saved/Automation/目录里面包含.json格式的测试报告。你可以配置CI服务器如Jenkins, GitLab CI在每次提交或每日构建后运行测试并解析这个报告。如果任何测试失败就标记构建为失败并通知开发者。测试稳定性保障CI环境下的测试必须极度稳定。要避免任何随机性如使用固定随机种子确保资产加载路径一致并处理好测试的清理工作防止内存泄漏导致后续测试失败。5. 常见陷阱与效能提升技巧5.1 测试不稳定Flaky Tests的成因与解决这是自动化测试最大的敌人。在UE中常见原因有异步操作未完成比如资源加载、AI寻路、网络同步。测试在条件未就绪时就开始断言。解决在测试中使用IsReady函数或自定义的轮询逻辑。例如在PrepareTest中触发资源加载在IsReady中检查加载状态返回true后才允许OnTestStart执行。时间敏感测试依赖Delay节点但不同机器性能不同导致等待时间不足。解决用事件驱动代替时间驱动。例如等待一个“伤害事件”被触发而不是等待固定的2秒。或者使用带容差的时间判断。状态污染测试A修改了某个全局变量或静态对象影响了测试B。解决严格遵守“测试隔离”原则。每个测试都应在PrepareTest中构建自己的世界在OnTestFinished中彻底清理。使用RegisterAutoDestroyActor管理临时Actor。考虑为每个测试启动一个独立的PIEPlay-In-Editor会话虽然开销大但隔离最彻底。5.2 测试执行速度优化功能测试加载关卡和资源很耗时。当你有上千个测试时运行一遍可能长达数小时。测试分组与并行化将不相关的测试分到不同组利用Automation系统的-filter参数选择性运行。一些高级的CI系统支持在多台机器上并行运行不同的测试组。共享初始化如果一组测试都需要相同的昂贵初始化如加载一个大型地图可以创建一个“测试夹具”。在UE中这可以通过创建一个父类Functional Test Blueprint来实现把公共的初始化逻辑放在父类的PrepareTest中然后让多个具体测试继承它。但要注意清理工作避免相互影响。使用最小化地图再次强调测试地图要尽可能小。关掉不必要的后处理、动态阴影、复杂的粒子系统。5.3 调试失败的测试当CI报告测试失败时如何快速定位问题丰富的日志在测试逻辑中大量使用Functional Test Actor的LogMessage函数输出关键步骤的状态、变量的值。这些日志会出现在自动化报告和输出日志中。截图和视频对于图形渲染、UI布局等测试可以在断言失败时自动截屏或录制一段短视频。UE的Automation框架支持添加AddError和AddWarning时附带屏幕截图。本地复现在编辑器中找到对应的测试关卡和Functional Test Actor直接点击其细节面板中的“运行测试”按钮。你可以像普通PIE一样单步调试虽然对蓝图支持有限观察哪里出了问题。差异比对工具对于Ground Truth Data的比对失败除了看数值差异如果存储的是复杂状态如场景序列可以考虑开发简单的工具来可视化差异点。构建和维护一个高效的“Testing Grounds”绝非一日之功它初期会拖慢你的功能开发速度甚至让人感到繁琐。但当你经历了几次因为完备的测试而提前发现重大bug或者自信地对大型系统进行重构时你会明白所有这些投入都是值得的。它最终带来的是开发节奏的稳定、代码质量的提升以及整个团队对项目代码库长期演进的信心。

相关新闻

API测试全指南:从概念到实践

API测试全指南:从概念到实践

1. API测试的基本概念与价值API(Application Programming Interface)是现代软件开发中不可或缺的组成部分,它定义了不同软件组件之间交互的规则和协议。在开发过程中,API测试是确保系统可靠性和功能完整性的关键环节。API测试的核…

2026/8/9 19:49:06 阅读更多 →
DeepSeek-V4-Pro-Qwen3.5-4B-8bit vs 原版模型:量化后性能究竟损失多少?

DeepSeek-V4-Pro-Qwen3.5-4B-8bit vs 原版模型:量化后性能究竟损失多少?

DeepSeek-V4-Pro-Qwen3.5-4B-8bit vs 原版模型:量化后性能究竟损失多少? 【免费下载链接】DeepSeek-V4-Pro-Qwen3.5-4B-8bit 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/DeepSeek-V4-Pro-Qwen3.5-4B-8bit DeepSeek-V4-Pro-Qwen…

2026/8/9 19:49:06 阅读更多 →
Ubuntu下创建PyCharm桌面快捷方式的最佳实践

Ubuntu下创建PyCharm桌面快捷方式的最佳实践

1. 为什么需要为PyCharm创建快捷方式?作为一名长期在Ubuntu环境下开发的程序员,我深刻理解每次启动IDE都要在终端输入命令的痛苦。当你在终端输入pycharm.sh启动PyCharm时,不仅打断了当前的工作流,还让桌面环境显得不够专业。更糟…

2026/8/9 19:49:06 阅读更多 →

最新新闻

从零开始的openapi-backend mock服务:前端独立开发的福音

从零开始的openapi-backend mock服务:前端独立开发的福音

从零开始的openapi-backend mock服务:前端独立开发的福音 【免费下载链接】openapi-backend Build, Validate, Route, Authenticate and Mock using OpenAPI 项目地址: https://gitcode.com/gh_mirrors/op/openapi-backend 在现代前端开发中,等待…

2026/8/9 20:42:29 阅读更多 →
Java面向对象编程三大特性解析与实践

Java面向对象编程三大特性解析与实践

1. 面向对象编程的本质理解第一次接触JavaSE的面向对象特性时,我完全被教科书上那些晦涩的定义搞懵了。直到在实际项目中踩了无数坑后,才真正明白封装、继承和多态这三大特性究竟意味着什么。面向对象不是用来应付考试的抽象概念,而是解决复杂…

2026/8/9 20:42:29 阅读更多 →
(栈)155. 最小栈

(栈)155. 最小栈

题目 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。int …

2026/8/9 20:42:29 阅读更多 →
C语言数组传参机制解析与最佳实践

C语言数组传参机制解析与最佳实践

1. 数组传参的本质与常见误区在C语言中,数组作为函数参数传递是一个看似简单却暗藏玄机的操作。新手程序员常常困惑于为什么数组在函数内部无法直接获取其长度,这源于C语言中数组传参的特殊机制——数组名在作为参数传递时会退化为指针。这种退化机制意味…

2026/8/9 20:42:28 阅读更多 →
Agent Governance Toolkit版本迁移指南:从v4到v5的平滑过渡

Agent Governance Toolkit版本迁移指南:从v4到v5的平滑过渡

Agent Governance Toolkit版本迁移指南:从v4到v5的平滑过渡 【免费下载链接】agent-governance-toolkit AI Agent Governance Toolkit — Policy enforcement, zero-trust identity, execution sandboxing, and reliability engineering for autonomous AI agents. …

2026/8/9 20:42:28 阅读更多 →
专业级Windows系统组件清理架构深度解析:3大模块实现彻底卸载

专业级Windows系统组件清理架构深度解析:3大模块实现彻底卸载

专业级Windows系统组件清理架构深度解析:3大模块实现彻底卸载 【免费下载链接】Remove-MS-Edge Uninstall Microsoft Edge with an executable or batch script. 项目地址: https://gitcode.com/gh_mirrors/re/Remove-MS-Edge Remove-MS-Edge项目为Windows系…

2026/8/9 20:41:28 阅读更多 →

日新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/9 0:01:47 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/9 0:01:47 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/9 0:03:48 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/9 0:01:47 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/9 0:01:47 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/9 0:03:48 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/9 17:05:02 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/9 0:45:04 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/9 17:05:02 阅读更多 →