Godot4游戏开发入门:从GDScript变量到交互场景实战
1. 项目概述为什么选择Godot4作为你的第一个游戏引擎如果你正在寻找一个能让你从零开始亲手把脑海里的游戏点子变成现实的工具那么Godot4绝对是一个值得你投入时间的好伙伴。我最初接触它也是因为厌倦了那些庞大、臃肿、学习曲线陡峭的商业引擎。Godot4给我的第一印象是“轻快”——安装包小启动速度快界面清爽。但别被它的轻量外表骗了它内核的强大和设计的前瞻性足以支撑你从2D像素风小游戏一路做到复杂的3D项目。这份学习笔记就是我作为一个同样从零开始的开发者在踩过一些坑、解决过一些问题后为你梳理的一条更平滑的入门路径。我们不会一上来就讲复杂的3D渲染管线而是从最根本的“如何让一个东西在屏幕上动起来”开始而这一切的起点就是理解变量——这个在Godot4的脚本语言GDScript中乃至所有编程世界里最基础、也最重要的概念。2. 核心思路拆解从“想法”到“屏幕上的互动”在动手写第一行代码之前我们需要建立一个正确的认知框架。游戏开发本质上是一个“状态管理”和“交互响应”的过程。你的角色有一个位置状态你按下键盘交互角色的位置发生变化状态更新引擎将这个新位置渲染到屏幕上反馈。Godot4的节点Node与场景Scene系统就是为高效管理这些状态和交互而生的。2.1 引擎架构节点树与场景化思维Godot4的核心是场景树Scene Tree。你可以把整个游戏世界想象成一棵不断生长的树。树根是“主循环”每一个游戏对象无论是玩家角色、一颗子弹、一段背景音乐还是一个UI按钮都是一个节点Node。不同类型的节点拥有不同的功能Sprite2D节点负责显示图片CharacterBody2D节点负责处理物理运动和碰撞AudioStreamPlayer节点负责播放声音。你通过组合这些节点来创建一个有功能的场景Scene。比如一个“玩家”场景可能包含一个CharacterBody2D节点作为根节点下面挂着一个Sprite2D节点显示外观和一个CollisionShape2D节点定义碰撞范围。然后你把这个“玩家”场景实例化放到另一个名为“游戏世界”的主场景中。这种模块化、可复用的设计让代码和资源的管理变得异常清晰。2.2 GDScript为游戏而生的友好语言为了驱动这些节点Godot4提供了自家的脚本语言GDScript。它的语法非常像Python简洁易懂但针对游戏开发做了大量优化。例如它内置了强大的信号Signal系统用于节点间通信以及对向量、变换等数学类型有原生支持。对于零基础的你来说GDScript的友好度远超C#或C能让你更专注于游戏逻辑本身而不是语言细节。我们本次笔记的核心——变量就是你在GDScript中用来存储和表示游戏内所有“状态”的基本单元。角色的生命值、金币数量、当前位置、移动速度……所有这些都需要用变量来“记住”。3. GDScript变量深度解析不仅仅是存储数据很多入门教程会把变量简单解释为“存储数据的盒子”。这没错但在游戏开发语境下我们需要更深入地理解它的类型、作用域和生命周期因为这直接关系到游戏的正确性和性能。3.1 变量声明与类型注解写给引擎和你自己看的“说明书”在GDScript中你可以用var关键字来声明一个变量。var player_name # 声明一个变量类型未指定 var health 100 # 声明并初始化为整数100 var speed: float 150.5 # 声明为浮点数类型并初始化 var is_alive: bool true # 声明为布尔类型这里有几个关键点动态类型与静态类型GDScript是动态类型语言像var health 100引擎会自动推断health是整数int。但作为最佳实践我强烈推荐你使用类型注解如: float。这就像给变量贴上一个标签有两大好处一是让引擎在编辑阶段就能发现类型错误避免运行时崩溃二是让代码像说明书一样清晰三个月后你自己或者你的队友一看就明白这个变量是干什么的、应该存什么。常用基础类型int: 整数如1,-5,0。float: 浮点数带小数点的数如3.14,-0.5。在游戏里坐标、速度、时间等连续值通常用float。bool: 布尔值只有true或false常用于状态开关如is_on_ground,can_shoot。String: 字符串文本数据用引号包裹如Hello, Godot!。Vector2:二维向量这是2D游戏的核心类型它同时存储x和y坐标比如位置position、移动velocity。你可以直接进行向量运算非常方便。3.2 变量的作用域谁可以看见它谁可以修改它作用域决定了变量在哪里可以被访问。理解它能避免很多“变量找不到”的诡异错误。局部变量Local Variables在函数内部func关键字之后声明的变量。它只在这个函数内部“存活”和可见。函数执行完毕局部变量就被销毁了。func calculate_damage(): var base_damage 10 # 局部变量只在calculate_damage函数内有效 var multiplier 2.0 return base_damage * multiplier # 在这里无法访问 base_damage成员变量Member Variables / Instance Variables在脚本文件顶部、任何函数之外声明的变量。它属于这个脚本所附加的节点实例。只要这个节点存在这个变量就一直存在并且可以被该脚本内的所有函数访问。extends CharacterBody2D # 脚本继承自CharacterBody2D节点 # 以下是成员变量 var max_health: int 100 var current_health: int max_health var move_speed: float 300.0 func take_damage(amount: int): # 可以访问成员变量 current_health current_health - amount if current_health 0: die() func die(): print(Player died with health: , current_health)常量Constants使用const关键字声明。一旦赋值在游戏运行期间就不能再改变。常用于定义一些固定的数值比如重力加速度、关卡总数、标签名等。这能提高代码可读性和安全性。const GRAVITY: float 980.0 # 像素/秒^2 const PLAYER_GROUP: String player const MAX_LEVEL: int 5实操心得养成好习惯根据数据的用途决定声明位置。如果一个数据只在某个函数内部做临时计算用就声明为局部变量。如果一个数据需要在整个节点的生命周期中被多个函数读写如生命值、状态就声明为成员变量。对于不会变的基础参数优先声明为常量。3.3 特殊变量与内置变量引擎给你的“快捷方式”Godot4的节点自带了许多非常有用的内置变量你可以直接使用无需声明。position(Vector2): 对于2D节点这是它的全局位置。rotation(float): 节点的旋转弧度rotation_degrees是角度制。scale(Vector2): 节点的缩放。$操作符这是场景树路径的快捷方式。$Sprite2D可以获取当前节点下名为“Sprite2D”的子节点。这是Godot中非常高频的操作。func _ready(): # 获取名为“HealthBar”的子节点并假定它是一个ProgressBar类型 var health_bar: ProgressBar $HealthBar health_bar.value current_health## 4. 实战用变量构建第一个交互场景 现在让我们把理论付诸实践创建一个简单的场景一个可以通过键盘WASD移动的方块。 ### 4.1 场景与节点设置 1. **新建项目**打开Godot4创建一个新项目选择“2D场景”模板。 2. **创建玩家节点**在左侧的“场景”停靠栏中默认有一个Node2D根节点。删除它然后右键点击“创建根节点”添加一个 CharacterBody2D 节点将其重命名为“Player”。CharacterBody2D是专门为需要自定义移动逻辑如平台跳跃的角色设计的。 3. **添加视觉表现**选中“Player”节点点击顶部的“添加子节点”按钮或按CtrlA为其添加一个 Sprite2D 节点。在右侧的“检查器”面板中点击“纹理”属性旁的“[空]”选择“快速加载”然后选择Godot自带的图标比如 icon.svg。你会看到一个紫色引擎图标出现在视口中。 4. **添加碰撞形状**为了让我们的方块有物理体积选中“Player”节点再添加一个 CollisionShape2D 子节点。在它的“形状”属性里新建一个 RectangleShape2D并调整其大小使其大致覆盖图标。 ### 4.2 编写玩家移动脚本 1. **附加脚本**选中“Player”节点CharacterBody2D在右侧检查器顶部点击“附加脚本”按钮。保持默认路径和名称点击“创建”。Godot会为你创建一个继承自 CharacterBody2D 的新脚本。 2. **编写移动逻辑**清空默认代码写入以下内容 gdscript extends CharacterBody2D # 1. 定义成员变量移动速度 export var move_speed: float 300.0 # _physics_process 函数在每一个物理帧被调用适合处理移动和物理逻辑 func _physics_process(delta: float): # 2. 获取输入向量。Input.get_vector() 返回一个标准化的Vector2 # 参数是负向X键正向X键负向Y键正向Y键 var input_direction : Input.get_vector(move_left, move_right, move_up, move_down) # 3. 计算本帧的速度。速度 方向 * 速度值 var target_velocity : input_direction * move_speed # 4. 将计算出的水平速度赋值给节点的 velocity 属性。 # CharacterBody2D 会基于 velocity 自动计算移动但不会自动应用重力等。 # 因为我们做的是无重力平面移动所以直接设置即可。 velocity target_velocity # 5. 调用 move_and_slide() 方法。这是关键 # 这个方法会根据 velocity 移动角色并处理沿途可能发生的碰撞。 # 调用后velocity 可能会被更新例如碰到墙壁时水平速度被置零。 move_and_slide()设置输入映射代码中引用了“move_left”,“move_right”等输入动作我们需要在项目设置中定义它们。点击顶部菜单栏的项目-项目设置。切换到输入映射标签页。在“动作”输入框中输入“move_left”点击“添加”。点击新添加的“move_left”动作旁边的“”号选择“键”然后按下键盘上的A键。同样你可以为它添加左箭头键。重复这个过程添加“move_right”对应D和右箭头“move_up”对应W和上箭头“move_down”对应S和下箭头。4.3 运行与调试点击场景编辑器顶部的“播放当前场景”按钮或按 F6。Godot会运行你的游戏。按下WASD键你应该能看到紫色图标在窗口中移动。重点观察变量在这个过程中多个变量在协同工作input_direction: 每一帧根据你的按键实时计算出的方向向量。没按键时是(0, 0)按下D键时是(1, 0)。target_velocity: 由input_direction和常量move_speed计算出的目标速度向量。velocity:CharacterBody2D节点内置的变量我们将其赋值为target_velocity然后由move_and_slide()函数消费这个变量来实际移动节点。delta:_physics_process函数传入的参数表示距离上一帧的物理时间间隔通常约1/60秒。在更复杂的匀速运动计算中需要用它来确保帧率无关的运动例如position velocity * delta。本例中move_and_slide()内部已处理。注意事项export var move_speed: float 300.0这一行开头的export是一个非常重要的注解。它意味着这个变量会在Godot编辑器中暴露在该节点的检查器面板里。这样你无需修改代码就可以在编辑器里直接拖拽滑块或输入数字来调整角色的移动速度实现快速迭代和平衡。这是Godot提升开发效率的利器。5. 变量在游戏状态管理中的高级应用掌握了基础我们来看看变量如何串联起更复杂的游戏逻辑。5.1 用布尔变量管理角色状态角色通常有多种状态 idle待机、run奔跑、jump跳跃、attack攻击。我们可以用布尔变量或枚举enum来管理。extends CharacterBody2D export var move_speed: float 300.0 export var jump_force: float -400.0 # 状态变量 var is_on_floor: bool false var is_jumping: bool false var is_attacking: bool false func _physics_process(delta): # 在攻击动画播放时通常不允许移动 if is_attacking: return # 获取水平输入 var input_direction : Input.get_vector(move_left, move_right, move_up, move_down) var target_velocity : input_direction * move_speed # 应用重力如果不在平台上 if not is_on_floor: target_velocity.y 980.0 * delta # 假设重力为980 velocity target_velocity # 跳跃输入检测 if Input.is_action_just_pressed(jump) and is_on_floor: velocity.y jump_force is_jumping true is_on_floor false # 假设刚起跳时立即离开地面 move_and_slide() # 更新是否在地面的状态。move_and_slide()后is_on_floor()是有效的 is_on_floor is_on_floor() if is_on_floor: is_jumping false5.2 用数组和字典管理游戏数据当需要管理多个同类型数据或键值对数据时变量可以升级为更复杂的数据结构。数组Array存储有序的元素列表。# 存储玩家背包中的物品ID var inventory: Array[int] [1, 3, 3, 7] # 类型注解表示数组内元素为int # 添加物品 inventory.append(5) # 访问第一个物品 var first_item inventory[0] # 遍历背包 for item_id in inventory: print(Item in bag: , item_id)字典Dictionary存储键值对用于快速查找。# 存储游戏设置 var game_settings: Dictionary { master_volume: 0.8, music_volume: 0.6, fullscreen: true, player_name: Hero } # 访问设置 var volume game_settings[master_volume] # 安全访问如果键不存在返回null var difficulty game_settings.get(difficulty, normal) # 第二个参数是默认值 # 保存设置到文件Godot提供了简单的文件接口 func save_settings(): var file FileAccess.open(user://settings.cfg, FileAccess.WRITE) file.store_var(game_settings)## 6. 常见问题与调试技巧实录 即使理解了概念实操中依然会遇到各种问题。下面是我在学习和教学中遇到的一些典型情况。 ### 6.1 变量相关错误排查 | 问题现象 | 可能原因 | 解决方案 | | :--- | :--- | :--- | | 运行时报错Invalid get index ‘position’ (on base: ‘Nil’). | 试图从一个 null 实例空引用上访问变量。通常是因为 $ 路径获取节点失败。 | 1. 检查节点路径和名称是否拼写正确区分大小写。br2. 确保在 _ready() 或之后获取节点因为节点在 _ready() 调用前才完全进入场景树。br3. 使用安全获取方式get_node_or_null(“NodePath”)并判断是否为空。 | | 变量值修改了但看不到效果如速度不变。 | 1. 变量作用域错误修改的是局部变量而非成员变量。br2. 代码逻辑错误修改后被后续代码覆盖。br3. _physics_process 中每帧都被重置。 | 1. 使用调试器Debugger设置断点或使用 print() 语句输出变量值观察其变化流程。br2. 检查是否有同名的局部变量遮蔽了成员变量。br3. 确认修改变量的代码确实被执行到了没有提前 return 或条件判断未通过。 | | export 变量在编辑器中不显示。 | 1. 脚本没有正确附加到节点。br2. 变量名有拼写错误。br3. 脚本中有语法错误导致整个脚本无法被正确解析。 | 1. 确认节点检查器顶部显示的是你的脚本。br2. 检查脚本底部是否有红色波浪线报错先修复所有语法错误。br3. 尝试重新附加脚本或重启Godot编辑器。 | ### 6.2 调试利器print() 与 调试器 对于新手print() 是你最好的朋友。把它插入到代码中可以打印出变量在运行时的值。 gdscript func _physics_process(delta): var input_direction : Input.get_vector(move_left, move_right, move_up, move_down) print(Input Direction: , input_direction) # 打印输入向量 print(Current Position: , position) # 打印当前位置 # ... 其余代码运行游戏后打开Godot底部的“输出”面板就能看到这些信息滚滚而来。这能帮你直观地理解代码的执行流程和数据变化。当你需要更细致地观察时就要使用调试器。在代码行号左侧点击可以设置一个红色断点。当游戏运行到这一行时它会暂停。此时你可以在左下角的“调试器”面板中查看当前所有变量的值并可以单步执行代码观察每一步的变化。6.3 性能与内存的初步考量虽然入门阶段不必过度优化但建立正确的意识很重要。避免在_process或_physics_process中频繁创建新对象例如每一帧都var arr []或var dict {}会在短时间内产生大量垃圾可能引发卡顿。对于需要重复使用的临时数据考虑在成员变量中预定义。善用const常量对于不变的值用const声明。这不仅是好习惯在某些情况下也能带来微小的性能提升和更清晰的内存使用。理解引用与值类型基础类型int,float,bool,String是值类型赋值时是拷贝。而数组、字典、节点等对象是引用类型赋值时传递的是引用类似于C语言的指针。修改一个引用类型的变量可能会影响到其他指向同一对象的地方。var a [1, 2, 3] var b a # b 和 a 指向同一个数组 b.append(4) print(a) # 输出 [1, 2, 3, 4]因为a也被修改了7. 从变量出发下一步学习路径建议掌握了变量你就拿到了打开Godot4游戏编程大门的钥匙。接下来我建议你沿着这个路径继续深入函数Function学习如何将一段可重用的逻辑封装成函数。这是组织代码、避免重复的关键。重点理解参数传递值传递 vs 引用传递和返回值。控制流深入学习if/elif/else条件判断和for/while循环。这是实现游戏逻辑如“如果生命值小于0则游戏结束”的基石。信号SignalGodot的灵魂机制之一。它实现了节点间的松耦合通信。比如敌人死亡时发出一个died信号UI节点监听这个信号并更新分数。这比直接调用对方函数要优雅和灵活得多。更多节点类型尝试使用Area2D做触发检测用AnimationPlayer播放动画用Timer节点做延时。每个节点都是一个功能模块。场景与实例化深入学习如何将做好的场景如“子弹”、“敌人”保存为.tscn文件并在代码中动态创建实例化它们。记住学习引擎最好的方式就是“做”。不要试图一次性看完所有文档。定一个小目标比如“做一个能发射子弹的飞机”然后去查如何移动、如何检测输入、如何创建子弹实例、如何播放音效。在解决问题的过程中你会自然而然地掌握各个知识点并且理解它们是如何通过“变量”这个纽带联系在一起的。Godot4的官方文档和社区非常友好遇到问题多搜索多在社区提问。编程和游戏开发是一场马拉松享受从零开始构建世界的乐趣吧。

相关新闻

CentOS 7用户管理实战:从基础命令到安全运维全解析

CentOS 7用户管理实战:从基础命令到安全运维全解析

1. 项目概述:为什么用户管理是系统运维的基石 在CentOS 7的日常运维中,无论是搭建一个Web服务器、部署一个数据库集群,还是管理一个多用户的开发环境,第一件绕不开的事情就是用户管理。这听起来基础,但恰恰是很多新手甚…

2026/8/11 10:10:39 阅读更多 →
抖音批量下载终极指南:从手动到全自动的完整解决方案

抖音批量下载终极指南:从手动到全自动的完整解决方案

抖音批量下载终极指南:从手动到全自动的完整解决方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppor…

2026/8/11 10:09:39 阅读更多 →
Unity面试实战指南:从性能优化到系统设计,告别八股文

Unity面试实战指南:从性能优化到系统设计,告别八股文

1. 项目概述:为什么Unity面试需要“实战篇”?在Unity开发这个圈子里混了十几年,从端游到手游,再到现在的跨平台和元宇宙应用,我面试过的人没有一千也有八百了。我发现一个特别有意思的现象:很多候选人能把U…

2026/8/11 10:09:39 阅读更多 →

最新新闻

网络安全入门指南:从Web安全到渗透测试与CTF的实战路径

网络安全入门指南:从Web安全到渗透测试与CTF的实战路径

1. 项目概述:一份给新手的“黑客”领域导航图 刚接触“黑客”这个词,很多人脑子里蹦出来的可能是电影里那种穿着帽衫、在键盘上噼里啪啦敲几下就能黑进任何系统的神秘形象。但现实中的网络安全领域,远非如此戏剧化,它更像是一个庞…

2026/8/11 10:55:56 阅读更多 →
Kimi K3:从长文档处理到工作流引擎,构建AI内容生产飞轮

Kimi K3:从长文档处理到工作流引擎,构建AI内容生产飞轮

你肯定遇到过这样的场景:深夜赶稿,对着空白文档发呆,脑子里明明有想法,却怎么也组织不成流畅的文字;或者,面对一堆零散的笔记、会议纪要、产品文档,想快速整理成一篇结构清晰的文章,…

2026/8/11 10:55:56 阅读更多 →
如何在5分钟内掌握.NET逆向工程:dnSpyEx终极实战指南

如何在5分钟内掌握.NET逆向工程:dnSpyEx终极实战指南

如何在5分钟内掌握.NET逆向工程:dnSpyEx终极实战指南 【免费下载链接】dnSpy Unofficial revival of the well known .NET debugger and assembly editor, dnSpy 项目地址: https://gitcode.com/gh_mirrors/dns/dnSpy .NET逆向工程和程序集分析不再是专业开发…

2026/8/11 10:55:56 阅读更多 →
软件开发模型选型:原型、演化与增量模型实战解析

软件开发模型选型:原型、演化与增量模型实战解析

1. 需求分析困境与软件开发模型的破局之道 在软件工程实践中,需求分析阶段常常成为项目成败的分水岭。根据IEEE的调查报告,约56%的软件项目失败直接归因于需求问题——要么是需求获取不完整,要么是需求频繁变更导致项目失控。面对这种"需…

2026/8/11 10:55:56 阅读更多 →
DM8数据库示例库创建与优化实战指南

DM8数据库示例库创建与优化实战指南

1. DM8示例库创建背景与价值 在数据库管理领域,示例库(Sample Database)是验证系统功能完整性和进行学习测试的重要资源。达梦数据库DM8作为国产数据库的代表产品,其示例库DMHR包含了完整的人力资源管理数据模型,涵盖部…

2026/8/11 10:55:56 阅读更多 →
GTA5终极安全增强指南:如何用YimMenu打造坚不可摧的游戏防护系统

GTA5终极安全增强指南:如何用YimMenu打造坚不可摧的游戏防护系统

GTA5终极安全增强指南:如何用YimMenu打造坚不可摧的游戏防护系统 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trendi…

2026/8/11 10:54:56 阅读更多 →

日新闻

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/v…

2026/8/11 0:00:02 阅读更多 →
前后端分离项目中控制台与接口工具数据差异排查指南

前后端分离项目中控制台与接口工具数据差异排查指南

1. 问题现象解析:控制台与Apifox的数据差异 最近在调试一个前后端分离项目时,遇到了一个典型问题:后端服务在本地开发环境控制台能正常输出查询数据,但通过Apifox测试时却返回空结果。这种"控制台有数据,接口工具…

2026/8/11 0:00:03 阅读更多 →
AI编程实战:从Claude Code踩坑到游戏开发入门

AI编程实战:从Claude Code踩坑到游戏开发入门

1. 从“AI能帮我做游戏”到“AI让我重新学编程”最近身边不少朋友,尤其是一些非技术背景、但对游戏开发有浓厚兴趣的朋友,都在问我同一个问题:“听说现在用Claude Code这种AI编程工具,小白也能做游戏了,是真的吗&#…

2026/8/11 0:00:03 阅读更多 →

周新闻

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

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

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

2026/8/11 1:08:05 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

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

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

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

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

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

2026/8/11 1:08:05 阅读更多 →

月新闻

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

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

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

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

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

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

2026/8/11 1:08:06 阅读更多 →
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/10 17:07:33 阅读更多 →