Unity 2D无尽跑酷游戏开发全攻略:从对象池到关卡生成
1. 项目概述为什么2D无尽跑酷是独立开发者的“黄金起点”如果你刚接触Unity或者想快速验证一个游戏玩法做一个2D无尽跑酷游戏绝对是个绝佳的选择。这听起来可能有点“老套”但别小看它。从《神庙逃亡》到《地铁跑酷》这个品类经久不衰其核心玩法循环——奔跑、跳跃、躲避、收集——是游戏设计中最经典、最易上手的模块之一。更重要的是它麻雀虽小五脏俱全几乎涵盖了2D游戏开发的所有核心知识点角色控制、物理交互、关卡生成、UI交互、数据持久化甚至简单的敌人AI。通过完成一个完整的无尽跑酷项目你能系统性地打通从零到一的开发流程这比单纯看教程学零散知识点要高效得多。我自己的第一个完整游戏项目就是一个2D跑酷游戏当时踩遍了所有能踩的坑但也因此对Unity的运作机制有了肌肉记忆般的理解。今天我就把这个项目的完整攻略连同那些教程里不会写的“血泪教训”从头到尾拆解给你。我们的目标是不依赖任何昂贵的插件用最纯粹的Unity组件和C#脚本构建一个可玩性高、性能稳定、且易于扩展的2D无尽跑酷游戏原型。2. 核心架构设计如何构建一个“无尽”的世界无尽跑酷的核心魅力在于“未知”与“节奏感”。玩家永远不知道前方会出现什么但又必须在一个逐渐加速的节奏中做出快速反应。要实现这种感觉技术上的核心就是“对象池”与“模块化关卡生成”的结合。2.1 对象池性能的基石为什么不用简单的Instantiate和Destroy因为无尽跑酷中平台、障碍物、金币等元素会高频地出现和消失。频繁的实例化和销毁会引发内存碎片和GC垃圾回收导致游戏卡顿这在移动设备上是致命的。对象池就是解决方案我们预先创建好一批对象不用时将其“禁用”并存入池中需要时再从池中“取出”并激活循环利用。实操要点我通常会创建一个通用的ObjectPool单例管理器。它的核心是一个Dictionarystring, QueueGameObject键是预制体的名字值是该类对象的队列。SpawnFromPool方法负责从队列中取对象如果池空了才实例化新对象。ReturnToPool方法则将对象放回队列并禁用。记住所有通过对象池生成的对象在失效时比如跑出屏幕必须调用ReturnToPool而不是Destroy。注意对象池中的对象在复用前一定要重置其状态比如一个带有“已收集”状态的金币放回池子前要将其碰撞器重新启用渲染器显示并将“已收集”标志设为false。我曾在项目后期被一个“金币偶尔捡不起来”的Bug折磨了半天根源就是状态重置不彻底。2.2 模块化关卡生成创造“无尽”的幻觉“无尽”并非真的无限而是让有限的模块循环组合给玩家无限的错觉。我们将关卡拆解为一个个“关卡片段”预制体。设计思路定义片段类型将片段分为“起步”、“常规”、“困难”、“奖励”等类型并为其设置权重。游戏初期“常规”片段权重高随着分数增加“困难”片段权重逐渐提升从而实现难度曲线。生成逻辑在玩家前方固定距离如相机视野外20个单位实时生成新的关卡片段。我们需要一个“生成锚点”通常附着在玩家或相机上随着移动而移动。当锚点到达某个临界位置就触发生成逻辑。片段连接每个关卡片段预制体需要有明确的“入口点”和“出口点”可以是空的子物体Transform。生成新片段时将其入口点与上一个片段的出口点对齐确保平台连接平滑不会出现断层或重叠。我的实现方案我创建了一个LevelManager脚本它维护一个当前已生成片段的列表。在Update中检测生成锚点的位置。当需要生成时根据当前难度权重随机选择一个片段类型然后从对象池中取出该类型的一个预制体实例计算其位置使其与上一个片段无缝衔接最后将其加入管理列表。同时在玩家后方很远距离的旧片段会被回收到对象池。这样场景中同时存在的片段数量是固定的性能消耗恒定。3. 核心玩法实现让角色“跑”和“跳”充满手感手感是跑酷游戏的灵魂。糟糕的手感会让玩家立刻放弃。2D物理通常使用Rigidbody 2D但纯物理驱动有时会显得“滑”或“飘”。我的经验是采用“混合控制”用物理处理碰撞和环境交互用脚本精确控制水平移动和跳跃。3.1 角色移动控制器public class PlayerController : MonoBehaviour { public float runSpeed 8f; // 基础奔跑速度 public float jumpForce 12f; // 跳跃力 public LayerMask groundLayer; // 地面层级 public Transform groundCheck; // 脚底的检测点 private Rigidbody2D rb; private bool isGrounded; private float groundCheckRadius 0.2f; void Start() { rb GetComponentRigidbody2D(); // 锁定Z轴旋转防止角色摔倒 rb.constraints RigidbodyConstraints2D.FreezeRotation; } void Update() { // 1. 检测是否在地面 isGrounded Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, groundLayer); // 2. 跳跃输入GetKeyDown用于精准触发 if (Input.GetKeyDown(KeyCode.Space) isGrounded) { rb.velocity new Vector2(rb.velocity.x, jumpForce); // 可以在这里触发跳跃动画或音效 } // 3. 滑铲或下蹲输入示例 if (Input.GetKeyDown(KeyCode.LeftControl)) { // 触发滑铲动画并可能缩小碰撞盒 } } void FixedUpdate() { // 在FixedUpdate中处理物理移动更稳定 // 水平速度直接设置为一个恒定值模拟自动奔跑 rb.velocity new Vector2(runSpeed, rb.velocity.y); } }关键点解析速度控制在FixedUpdate中直接设置水平速度而不是施加力。这能保证奔跑速度绝对稳定不受帧率波动影响。runSpeed将成为游戏全局难度的一个杠杆后期可以通过协程逐渐增加它来实现游戏加速。跳跃手感跳跃采用GetKeyDown检测确保响应迅速。我们直接设置Y轴速度(rb.velocity.y jumpForce)而不是AddForce。这样跳跃高度固定手感更干脆。AddForce更适合需要连续施加力的场景比如喷气背包。地面检测使用OverlapCircle在角色脚底一个小范围内检测地面层。这比检查rb.velocity.y是否接近0更可靠因为它能处理从平台边缘短暂悬空的情况。3.2 二段跳与蹬墙跳的实现为了增加操作深度可以加入二段跳。我们需要一个变量来记录剩余跳跃次数。public int maxJumpCount 2; private int jumpCountRemaining; void Update() { isGrounded Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, groundLayer); // 重置跳跃次数 if (isGrounded rb.velocity.y 0.01f) { jumpCountRemaining maxJumpCount; } if (Input.GetKeyDown(KeyCode.Space)) { if (jumpCountRemaining 0) { rb.velocity new Vector2(rb.velocity.x, jumpForce); jumpCountRemaining--; } } }蹬墙跳则更复杂一些需要检测侧向碰撞并在按住方向键朝向墙壁时提供一个反向的弹跳力。这涉及到额外的射线检测和速度向量计算。实操心得跳跃参数需要反复微调。jumpForce和重力缩放在Rigidbody 2D组件中共同决定了跳跃的弧线。一个技巧是让角色在到达跳跃顶点时有一个短暂的“悬浮感”可以通过轻微减小重力缩放来实现但别过头否则会显得轻飘。4. 障碍、收集品与交互逻辑游戏元素需要给予玩家清晰的反馈。障碍物触碰即失败收集品则提供正反馈。4.1 障碍物设计障碍物通常分为几种静态的钉子、深坑、动态的移动的锯条、上下摆动的锤子、需要交互的需要蹲下通过的矮栏。静态障碍就是一个带有碰撞体如Box Collider 2D的物体勾选Is Trigger。在玩家身上挂载一个脚本检测Trigger进入如果碰到的是障碍物Tag则触发死亡逻辑。动态障碍除了碰撞还需要移动逻辑。使用Mathf.Sin或Mathf.PingPong配合Time.time可以轻松实现规律的往复运动。务必确保运动逻辑在FixedUpdate中更新位置以防止物理抖动。死亡逻辑不要直接销毁玩家或加载场景。更好的做法是1. 触发一个“死亡动画”如角色翻滚、出屏。2. 停止关卡生成和速度增加。3. 弹出计分UI。4. 提供“重新开始”按钮。这比黑屏加载体验好得多。4.2 收集品金币、道具实现金币是典型的Trigger收集品。public class Coin : MonoBehaviour { public int scoreValue 1; public AudioClip collectSound; void OnTriggerEnter2D(Collider2D other) { if (other.CompareTag(Player)) { // 1. 增加分数 GameManager.Instance.AddScore(scoreValue); // 2. 播放音效使用对象池化的音频源更好 AudioSource.PlayClipAtPoint(collectSound, transform.position); // 3. 播放收集动画可选缩放或旋转 StartCoroutine(CollectAnimation()); // 4. 禁用或回池 gameObject.SetActive(false); // 简单做法 // ObjectPool.Instance.ReturnToPool(gameObject); // 对象池做法 } } IEnumerator CollectAnimation() { float duration 0.2f; float timer 0; Vector3 originalScale transform.localScale; while (timer duration) { timer Time.deltaTime; float scale Mathf.Lerp(1f, 1.5f, timer / duration); // 先放大 transform.localScale originalScale * scale; yield return null; } // 动画结束后再禁用确保玩家看到效果 gameObject.SetActive(false); } }道具系统磁铁自动吸附金币、护盾抵挡一次伤害、冲刺临时加速等道具可以通过为玩家添加一个临时状态来实现。例如拾取磁铁后激活一个玩家身上的子物体一个大的圆形Trigger在这个Trigger内的金币会向玩家移动。所有状态都需要用协程管理持续时间时间到后移除状态效果。5. 游戏管理与数据流动一个清晰的游戏管理器GameManager是项目有条不紊的关键。它通常被设计成单例模式方便全局访问。5.1 GameManager的核心职责public class GameManager : MonoBehaviour { public static GameManager Instance; // 单例 public int CurrentScore { get; private set; } public bool IsGameOver { get; private set; } [SerializeField] private Text scoreText; // UI引用 [SerializeField] private GameObject gameOverPanel; void Awake() { if (Instance null) Instance this; else Destroy(gameObject); } void Start() { StartGame(); } public void StartGame() { CurrentScore 0; IsGameOver false; UpdateScoreUI(); gameOverPanel.SetActive(false); Time.timeScale 1f; // 确保游戏时间正常 // 通知其他系统游戏开始 } public void AddScore(int value) { if (IsGameOver) return; CurrentScore value; UpdateScoreUI(); // 可以在这里检查分数触发难度提升事件 if (CurrentScore % 100 0) { // 每100分通知LevelManager增加速度或难度 } } public void GameOver() { IsGameOver true; Time.timeScale 0f; // 暂停游戏逻辑 gameOverPanel.SetActive(true); // 保存最高分到PlayerPrefs int highScore PlayerPrefs.GetInt(HighScore, 0); if (CurrentScore highScore) { PlayerPrefs.SetInt(HighScore, CurrentScore); } } private void UpdateScoreUI() { if (scoreText ! null) scoreText.text Score: CurrentScore.ToString(); } // 提供给UI按钮调用的方法 public void RestartGame() { // 重新加载当前场景是最简单的方式 SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); } }5.2 难度曲线与节奏控制静态的游戏很快会无聊。我们需要动态调整难度速度递增在LevelManager或一个专门的DifficultyManager中使用协程每隔一段时间如30秒增加一次全局的runSpeed。IEnumerator IncreaseDifficulty() { while (!GameManager.Instance.IsGameOver) { yield return new WaitForSeconds(30f); runSpeed * 1.1f; // 增加10% // 同时可以增加生成“困难”关卡片段的权重 } }基于分数的生成策略如之前所述在LevelManager的片段选择算法中将CurrentScore作为一个输入参数影响不同类型片段的随机权重。6. 视听效果与性能优化“手感”一半来自操作另一半来自视听反馈。6.1 动画状态机为玩家创建Animator Controller定义几个基本状态Run、Jump、Fall、Slide、Die。通过脚本参数如isGrounded、velocityY来控制状态转换。跳跃和落地时可以加入轻微的缩放动画来增强动感。6.2 粒子与音效粒子落地时在脚底生成一阵灰尘粒子冲刺时在身后产生轨迹粒子收集金币时爆出小星星。Unity的Particle System功能强大但注意控制最大粒子数量避免过度绘制。音效跳跃声、收集金币声、碰撞障碍声、背景音乐。使用AudioSource.PlayClipAtPoint播放一次性的音效简单直接。对于循环的背景音乐使用一个独立的、不被销毁的AudioSource。重要将所有音效文件在导入设置中设置为“Vorbis”压缩格式并降低比特率如96kbps能显著减小构建体积。6.3 性能优化要点绘制调用优化这是2D游戏性能大头。尽可能使用“Sprite Atlas”精灵图集将多个小图打包成一张大图。Unity的Sprite Atlas功能可以自动管理。确保同一图集中的精灵在渲染时批次处理。Overdraw控制避免大量半透明精灵重叠。背景图层尽量简洁前景的游戏元素也要注意层级。物理优化使用简单的碰撞体Box, Circle代替Polygon Collider 2D除非形状非常不规则。将静态的平台、障碍物设置为StaticUnity会为其优化物理计算。代码优化在Update中避免使用Find、GetComponent等耗时操作。在Start或Awake中缓存引用。对于远离相机的物体可以考虑禁用其脚本或渲染器。7. 常见问题与调试实录在开发过程中你几乎一定会遇到下面这些问题问题现象可能原因排查与解决方案角色偶尔穿过平台1. 移动速度过快。2. 物理更新频率不足。1. 在FixedUpdate中移动角色确保与物理引擎同步。2. 增加Project Settings - Time - Fixed Timestep值如0.02降低到0.016提高物理更新频率。3. 使用Rigidbody2D.Cast进行移动前的碰撞预测。跳跃手感“粘滞”按了没反应1. 地面检测不准确。2. 输入检测在FixedUpdate中。1. 调大groundCheckRadius或使用多个检测点。2.跳跃输入检测必须放在Update中因为GetKeyDown对帧率敏感放在FixedUpdate会丢输入。游戏越玩越卡1. 内存泄漏对象未销毁或回池。2. 实例化对象过多。1. 检查所有动态生成的对象是否都通过对象池管理。2. 使用Profiler窗口Window - Analysis - Profiler查看内存和CPU占用定位热点。UI文本更新不及时直接在Update中频繁调用Find或GetComponent查找UI组件。在Start中缓存Text组件的引用然后在AddScore等方法中直接更新缓存后的引用。移动设备上操作延迟使用了Input.GetKeyDown它只对应键盘输入。改用Unity的Input System或标准的Input.touchCount和Input.GetTouch来检测触屏。可以创建屏幕左右区域的虚拟按钮来控制跳跃和滑铲。关卡片段连接处有缝隙或重叠片段预制体的入口/出口点位置计算错误。在编辑模式下将两个片段预制体实例化在场景中手动对齐然后记录下它们Transform.position的差值。将这个差值作为生成新片段时的位置偏移量写死在代码或脚本ableObject中。一个高级调试技巧为你的LevelManager添加一个调试模式在Scene视图中绘制出生成锚点的位置和即将生成的片段范围的Gizmos。这能让你直观地看到生成逻辑是否正常避免“盲写”代码。void OnDrawGizmos() { if (!Application.isPlaying) return; Gizmos.color Color.red; Gizmos.DrawWireSphere(generationAnchor.position, 1f); // 绘制生成锚点 Gizmos.color Color.green; // 绘制下一个将要生成片段的大致区域 Gizmos.DrawWireCube(new Vector3(generationAnchor.position.x 15, 0, 0), new Vector3(10, 5, 0)); }走到这一步你的2D无尽跑酷游戏已经具备了核心骨架。别忘了花时间打磨细节调整金币旋转的动画给障碍物加上危险的红色闪烁提示为不同的地面材质配上不同的脚步声效。这些细微之处才是让游戏从“可运行”变成“可玩”的关键。最后当你点击Play看着角色在你自己创造的世界里流畅奔跑、跳跃时那种成就感就是独立开发最纯粹的快乐。

相关新闻

Java实用类应用精讲

Java实用类应用精讲

执行上述程序清单,每个程序将输出不同的结果,具体如下: 程序清单主要功能预期输出示例(或说明)listing 1使用 StringTokenizer 解析字符串title Java: The Complete Reference author Schildt publisher Oracle Press…

2026/8/5 6:37:54 阅读更多 →
家用VR游戏入门指南:从设备选择到畅玩实战

家用VR游戏入门指南:从设备选择到畅玩实战

最近在整理家里的数码设备时,翻出了之前入手的一款VR眼镜,心血来潮用它重温了几款经典游戏,体验依然非常震撼。很多朋友对VR的印象可能还停留在商场里的体验店,觉得设备昂贵、设置复杂。其实,随着技术成熟和生态完善&a…

2026/8/5 6:37:54 阅读更多 →
电荷泵双极性电源设计:从原理到PCB布局的完整实践指南

电荷泵双极性电源设计:从原理到PCB布局的完整实践指南

1. 项目概述:从零开始设计一个电荷泵双极性电源最近在捣鼓一个需要正负对称电压供电的模拟电路项目,比如运放、ADC或者一些传感器调理电路,手头只有单路电源,这让我不得不重新审视一个经典而高效的方案——电荷泵双极性电源。这玩…

2026/8/5 6:36:53 阅读更多 →

最新新闻

容器化部署中特殊字符处理的性能优化实践

容器化部署中特殊字符处理的性能优化实践

1. 项目背景与核心挑战 这个标题中的"[特殊字符]_容器化部署的性能优化实战"实际上反映了一个非常典型的工程场景——在容器化环境中部署特殊字符处理服务时遇到的性能瓶颈问题。我去年在金融数据清洗项目中就遇到过类似案例,当时处理的是包含大量非ASCII…

2026/8/5 8:14:34 阅读更多 →
基于OpenClaw构建轻量级域名监控系统:从原理到实践

基于OpenClaw构建轻量级域名监控系统:从原理到实践

1. 项目概述:从需求到工具的完整思路最近在折腾一些个人项目,经常需要关注一些域名的状态变化,比如某个心仪的短域名是否被释放了,或者自己部署的服务域名有没有被恶意抢注的风险。手动去查WHOIS或者各种监控平台,不仅…

2026/8/5 8:14:34 阅读更多 →
基于OpenCV与经典算法的自动聚焦原理与实现详解

基于OpenCV与经典算法的自动聚焦原理与实现详解

1. 项目概述与核心价值最近在整理一些老旧的图像处理项目,翻出来一个十几年前用VC6和OpenCV早期版本写的自动聚焦程序。现在看这个技术栈确实有点“复古”,VC6是1998年发布的,而当时用的OpenCV估计也就是1.0版本左右。但恰恰是这种“过时”的…

2026/8/5 8:14:34 阅读更多 →
Altium Designer中实现高精度挖空Mark点:原理、步骤与Gerber输出要点

Altium Designer中实现高精度挖空Mark点:原理、步骤与Gerber输出要点

1. 项目概述:为什么需要“挖空”的Mark点?在PCB设计领域,Mark点(或称基准点、光学定位点)是SMT贴片机进行高精度元件贴装的“眼睛”。标准的Mark点通常是一个直径1.0mm的圆形铜箔,上面覆盖着阻焊层&#xf…

2026/8/5 8:14:34 阅读更多 →
花书学习Day 7:Kaggle预测房价

花书学习Day 7:Kaggle预测房价

因为需要使用Kaggle的房屋价格数据集,所以先写一个download函数将数据集下载到本地:import hashlib import os import tarfile import zipfile import requests DATA_HUB dict() #用于存放数据集名称映射到(数据集url,sha-1密钥) DATA_URL http://d2l-…

2026/8/5 8:14:34 阅读更多 →
Inventor实战疑难解析:从草图约束到工程图标注的进阶指南

Inventor实战疑难解析:从草图约束到工程图标注的进阶指南

1. 从“会画”到“会用”:Inventor学习的真正终点“十五天学会Autodesk Inventor”,这个标题听起来像是一个速成神话。很多朋友跟着教程画出了第一个零件、完成了第一个装配,甚至生成了第一张工程图,就以为自己“毕业”了。但当你…

2026/8/5 8:13:34 阅读更多 →

日新闻

Java缓存框架:JetCache

Java缓存框架:JetCache

TOC 一、简介 JetCache 是一个 Java 缓存抽象框架,为不同的缓存解决方案提供了统一的使用方式。 它提供的注解比 Spring Cache 更加强大。 JetCache 的注解支持原生 TTL、两级缓存以及在分布式环境中的自动刷新功能,同时你也可以通过代码直接操作 Cach…

2026/8/5 0:00:43 阅读更多 →
AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

需求:通孔焊盘 十字花;过孔 Via 实心直连;贴片焊盘按需设置 AD 测试版本AD24 很多工程师踩坑:全部统一十字,导致接地过孔阻抗高、大电流发热! 一、快捷键打开规则 PCB 界面按下:D R 展开…

2026/8/5 0:00:43 阅读更多 →
AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

更多请点击: https://kaifayun.com 第一章:AI生成素描效果 AI生成素描效果是计算机视觉与风格迁移技术融合的典型应用,其核心在于将彩色照片或RGB图像转换为具有手绘质感、明暗对比强烈、边缘清晰的单色素描图像。该过程通常依赖于深度学习模…

2026/8/5 0:00:43 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/4 13:24:41 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/4 11:41:39 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

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

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

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

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

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

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

2026/8/4 11:09:16 阅读更多 →
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/4 13:38:40 阅读更多 →