开源Godot 2D Builder:高效构建游戏场景的可视化工具
1. 项目概述为什么我们需要一个2D Builder如果你用过Godot引擎做过2D游戏尤其是那种需要大量关卡、地图或者复杂场景的游戏你肯定对“手动摆放”这件事深有感触。无论是用TileMap一格一格地铺地砖还是用场景编辑器一个一个地拖拽场景节点当你的游戏世界稍微大一点这个过程就会变得极其枯燥和低效。更别提当策划或者美术想要调整某个区域时你需要在编辑器里反复打开、关闭场景进行微调沟通成本和时间成本都高得吓人。“Godot 2D Builder”这个开源项目就是为了解决这个痛点而生的。它的核心目标是让你能够脱离Godot编辑器本身通过一个独立的、可视化的工具来快速构建和编辑2D游戏场景。你可以把它理解为一个专门为Godot 2D游戏定制的“外部关卡编辑器”。想象一下策划或者美术同学可以在一个更直观、更聚焦的工具里像搭积木一样设计好整个关卡的地形、敌人位置、道具分布然后一键导出成Godot引擎能够直接识别和加载的数据文件比如JSON或自定义的二进制格式。作为程序你只需要在游戏运行时加载这个数据文件并根据数据动态生成场景即可。这带来的好处是显而易见的。首先是职责分离策划和美术可以专注于内容创作而无需深入理解Godot编辑器的复杂层级结构。其次是迭代效率修改关卡不再需要程序打开工程、重新导出策划自己就能完成并立刻看到修改效果在Builder工具内预览。最后是灵活性Builder工具可以根据项目需求高度定制比如集成专属的规则检查如“敌人出生点必须放置在可行走区域”、批量操作如复制整个区域等这些在原生编辑器中实现起来要么麻烦要么不可能。这个项目标题里的“开源”二字意味着它不仅仅是一个想法而是一个已经启动并可供社区贡献和学习的实际代码库。学习它你不仅能获得一个强大的生产力工具更能深入理解Godot的资源系统、序列化、编辑器插件开发乃至自定义工具链的构建思路这对于想进阶为Godot技术专家或工具链开发者的你来说价值巨大。2. 核心设计思路与架构拆解一个2D Builder工具其本质是一个“数据生成器”和“预览器”。它的输入是用户的操作点击、拖拽、绘制输出是结构化的场景数据。而它的核心就在于如何设计这套数据模型以及如何与Godot引擎进行双向通信编辑时预览运行时加载。2.1 数据层设计如何抽象一个2D场景这是整个项目的基石。你不能直接把Godot的整个场景树SceneTree原封不动地序列化出去那样会包含大量引擎内部信息且过于臃肿。我们需要一个更轻量、更面向游戏逻辑的抽象。一个典型的2D关卡数据模型可能包含以下层级图层Layers模仿Photoshop或TileMap的图层概念。例如terrain地形层存放碰撞体和行走表面数据。decoration装饰层存放背景、粒子效果等视觉元素。entities实体层存放玩家、敌人、NPC、道具等动态对象。triggers触发器层存放区域触发器、检查点等逻辑对象。 每层可以独立显示、隐藏、锁定方便编辑。对象Objects每一层由多个对象构成。每个对象需要定义id唯一标识符用于运行时查找或引用。type对象类型如“PlayerSpawn”、“Enemy_Goblin”、“Prop_Chest”、“TileBlock”。position2D坐标 (x, y)。properties一个键值对字典用于存放类型相关的扩展属性。例如一个“门”对象可能有{target_scene: res://levels/room_02.tscn, spawn_id: entry_point}这样的属性。网格与自由放置对于地形通常基于网格Grid系统。每个网格单元Cell可以放置一个“瓦片”Tile这个瓦片本身就是一个对象其属性可能包含使用的纹理图集ID、UV坐标、碰撞形状等。对于实体则更多是自由放置Free Placement。设计考量为什么选择JSON或自定义二进制格式JSON人类可读、调试方便适合开发初期。但数据量大时解析和体积是问题。自定义二进制格式如使用Godot的FileAccess进行读写体积小、加载快但需要自己定义序列化/反序列化协议。一个折中的成熟方案是使用Godot的Resource格式。你可以创建一个继承自Resource的自定义类如LevelData在里面定义你的图层、对象列表等属性。Godot可以将其保存为.tres或.res文件这种格式是二进制的但Godot能高效识别和加载并且在编辑器中也能部分查看。这是与引擎生态结合最紧密的方式。2.2 编辑器Builder应用的技术选型Builder本身是一个独立的应用。你有几个主流选择使用Godot自身开发用Godot引擎来开发这个Builder工具。这是最推荐、也是与项目标题最契合的路径。好处是“吃自己的狗粮”你可以直接使用Godot的控件Control节点、2D渲染、输入系统并且能最方便地调用Godot的API来预览场景。导出的数据格式也能天然兼容。你可以将Builder打包成一个独立的桌面应用。这需要你深入掌握Godot的编辑器插件EditorPlugin开发以及如何将插件“独立化”为一个应用。使用其他GUI框架如C# WinForms/WPF/Avalonia或Python PyQt/PySide甚至Web技术Electron。这些选择能让你利用更成熟的桌面应用开发生态但代价是你需要自己实现2D渲染视图用于预览并且要解决与Godot数据格式的对接问题可能需要通过进程间通信IPC或文件轮询来实现“实时预览”复杂度较高。为什么首选Godot开发Builder因为一致性。你的工具链和游戏使用同一套技术栈资源纹理、场景可以无缝共享API调用直接调试方便。社区中已经有不少成功的先例比如“Godot Asset Library”的客户端原型、一些游戏的内置关卡编辑器都是基于Godot自身开发的。2.3 运行时Game集成方案在游戏项目中你需要一个“关卡加载器”。这个加载器负责读取由Builder生成的关卡数据文件。根据数据中的对象类型实例化对应的PackedScene预制的场景如一个敌人的完整逻辑。将这些实例化的节点放置到正确的位置并设置好它们的自定义属性。将所有这些节点组织起来加入到当前的游戏场景树中。这通常通过一个LevelLoader单例Autoload或一个专用的Level节点来实现。关键在于建立“对象类型”到“实际场景资源”的映射关系。这可以通过一个配置字典、一个资源文件或者使用Godot的“类名”注册机制来完成。3. 使用Godot开发Builder的实操要点假设我们选择用Godot 4.x来开发这个2D Builder。下面是一个从零开始的实操流程和核心环节解析。3.1 项目初始化与主界面搭建首先新建一个Godot项目这个项目就是你的Builder工具本身。主场景结构Main (Control) ├── HSplitContainer │ ├── LeftPanel (Control) # 对象库、图层管理 │ └── RightPanel │ ├── Toolbar (HBoxContainer) # 工具按钮选择、画笔、填充等 │ └── ViewportContainer │ └── SubViewport # 用于2D场景预览 │ └── World (Node2D) # 预览的根节点 └── BottomPanel (Control) # 属性检查器、状态栏使用SubViewport是关键它允许你在UI中嵌入一个独立的渲染视口专门用于显示和编辑2D关卡内容与UI的渲染隔离。对象库面板这里列出所有可放置的对象类型。可以用ItemList或Tree控件实现。每个对象类型应该关联一个图标、一个名称以及它对应的“原型”Prototype。原型可以是一个简单的Node2D子类或者直接是一个纹理资源。你可以通过拖拽从库中拖出对象到预览视口中。3.2 实现核心编辑功能视口交互你需要处理SubViewport的输入事件。由于事件首先被UI捕获你需要将ViewportContainer的mouse_filter设置为MOUSE_FILTER_PASS并在_gui_input函数中处理鼠标事件。实现视图的平移鼠标中键拖拽和缩放鼠标滚轮。这通过改变World节点的position和scale来实现。计算鼠标在World坐标系下的位置var world_pos viewport_camera.global_position (event.position - viewport_rect.size * 0.5) * viewport_camera.zoom。这是编辑器的核心数学之一。放置与选择对象画笔工具当鼠标在视口中移动并点击时根据当前选中的对象类型在world_pos处创建一个新的“预览节点”如一个Sprite2D并将其添加到World下。同时在内存中的数据模型中如一个LevelData实例也添加一条记录。选择工具实现点选和框选。点选可以通过PhysicsPointQuery进行如果你为预览对象添加了CollisionShape2D或者遍历World下的子节点计算其与鼠标位置的矩形包含关系。选中的对象需要高亮显示如修改modulate颜色。网格对齐对于Tile-based的编辑启用网格对齐功能。在放置对象时将world_pos坐标进行量化var snapped_pos (world_pos / grid_size).floor() * grid_size。3.3 数据序列化与保存定义资源类在GDScript中创建一个继承自Resource的类。# level_data.gd class_name LevelData extends Resource export var level_name: String New Level export var grid_size: int 64 export var layers: Array[LayerData] [] # 保存资源 func save_to_file(path: String): ResourceSaver.save(self, path)定义图层和对象类# layer_data.gd class_name LayerData extends Resource export var name: String Layer export var visible: bool true export var objects: Array[ObjectData] [] # object_data.gd class_name ObjectData extends Resource export var id: String export var type: String export var position: Vector2 export var custom_properties: Dictionary {}保存流程当用户点击保存时遍历World中的所有预览节点根据它们的类型和属性构建或更新内存中的LevelData对象然后调用其save_to_file方法。保存为.tres文件。3.4 实现实时预览与游戏逻辑对接这是让Builder真正强大的功能——在编辑器中看到近乎游戏运行时的效果。轻量级预览对于静态物体用Sprite2D显示纹理就够了。但对于有动画或简单行为的物体如一个旋转的齿轮、一个闪烁的灯你需要在Builder中实现一个简化的、视觉化的版本。可以为每种对象类型定义一个“预览场景”一个简单的.tscn文件在放置时实例化这个场景而不是一个简单的Sprite。Godot脚本热重载如果你在Builder中使用了GDScript来定义一些预览行为可以利用Godot编辑器的脚本热重载功能。但注意Builder是一个独立应用你需要确保你的预览脚本逻辑简单或者自己实现一套简单的热更新机制如监视文件变化后重新加载资源。注意完全的“游戏逻辑预览”如敌人AI、物理交互在Builder中实现成本极高。通常的做法是Builder只负责数据和静态视觉预览复杂的逻辑预览交给一个独立的“测试模式”这个模式可以快速启动游戏并加载当前编辑的关卡。4. 从Builder到游戏运行时加载器实现Builder生成了.tres资源文件现在需要在你的主游戏项目中加载和使用它。创建关卡加载器# level_loader.gd extends Node2D export var level_data: LevelData func _ready(): if level_data: load_level(level_data) func load_level(data: LevelData): # 1. 清空当前所有子节点除了可能需要的永久节点 for child in get_children(): child.queue_free() # 2. 遍历所有图层和对象 for layer in data.layers: if not layer.visible: continue # 运行时可以跳过不可见图层 for obj_data in layer.objects: instantiate_object(obj_data) func instantiate_object(obj_data: ObjectData): # 根据 obj_data.type 映射到实际的PackedScene var scene_path ObjectRegistry.get_scene_path(obj_data.type) if scene_path: var scene load(scene_path) var instance scene.instantiate() add_child(instance) instance.global_position obj_data.position # 设置自定义属性 for key in obj_data.custom_properties: if instance.has(key): instance.set(key, obj_data.custom_properties[key]) else: print_debug(警告对象实例没有属性 %s % key) else: print_debug(错误未知对象类型 %s % obj_data.type)对象注册表ObjectRegistry可以是一个单例或者一个简单的字典资源维护着对象类型字符串到场景资源路径的映射。# object_registry.gd (作为一个单例或普通Resource) var type_to_scene { Enemy_Goblin: res://prefabs/enemies/goblin.tscn, Prop_Chest: res://prefabs/props/chest.tscn, PlayerSpawn: res://prefabs/special/player_spawn.tscn, # ... 更多映射 } func get_scene_path(type: String) - String: return type_to_scene.get(type, )在游戏中使用在你的游戏主场景中添加一个LevelLoader节点将Builder导出的level_data.tres资源拖拽赋值给它的level_data属性。运行游戏关卡就会被自动生成。5. 进阶功能与性能优化思路一个基础的Builder完成后可以考虑以下增强功能这些也是开源项目中常见的模块多选与批量操作支持框选多个对象然后对它们进行统一移动、旋转、缩放、删除或者批量修改属性如将所有选中的敌人血量增加10%。撤销/重做系统这是编辑器类工具的核心功能。你需要实现一个命令模式Command Pattern。每一个编辑操作放置、删除、移动、修改属性都封装成一个命令对象拥有execute()和undo()方法。所有命令按顺序压入栈中。实现撤销/重做就是执行栈中命令的undo()或execute()。规则验证与错误检查在保存或导出前对关卡数据进行逻辑检查。例如检查是否有且仅有一个“PlayerSpawn”对象。检查所有“门”对象的target_scene属性指向的场景文件是否存在。检查敌人出生点是否被放置在了不可行走的区域外。 可以将错误和警告列在列表中方便用户定位。性能优化视口渲染当关卡非常庞大时预览视口可能会卡顿。需要实现视口裁剪Viewport Culling只渲染在摄像机视野范围内的对象。对于Tile层可以使用Godot的TileMap节点它自带高效的裁剪和批处理渲染。数据操作对于包含成千上万个对象的图层使用数组遍历可能变慢。可以考虑使用空间分区数据结构如网格Grid或四叉树Quadtree来管理对象加速点选、框选和区域查询。资源管理及时释放不再使用的预览资源。当切换图层或工具时清理不必要的节点和引用。6. 常见问题与排查技巧实录在实际开发这样一个工具时你会遇到不少坑。以下是一些典型问题及解决思路问题鼠标在视口中的坐标计算不准对象放置位置有偏移。排查首先检查ViewportContainer和SubViewport的尺寸和拉伸模式是否正确。确保你获取的是SubViewport的鼠标事件并且坐标转换考虑了视口本身的偏移和缩放。一个常见的错误是忘了减去视口矩形左上角的位置。技巧在调试阶段可以在_process函数中将计算出的世界坐标实时打印出来并同时在那个位置绘制一个临时的小标记如一个Sprite2D直观地验证坐标是否正确。问题保存后再加载对象的位置或属性不对。排查首先检查序列化过程。确保LevelData、LayerData、ObjectData中的所有export属性都被正确赋值和保存。使用Godot内置的资源编辑器打开保存的.tres文件检查数据是否完整。排查其次检查反序列化加载过程。确认在instantiate_object时obj_data.position被正确地赋值给了实例的global_position而不是position如果实例有父节点的话。技巧实现一个简单的“调试导出”功能将关卡数据同时保存一份为JSON格式。JSON可读性强方便你逐条对比编辑时的内存数据和保存后的文件数据快速定位是哪个环节出了问题。问题编辑大型关卡时Builder工具变得非常卡顿。排查使用Godot的“调试器”面板中的“监视器”页签查看帧率FPS、内存使用情况和节点数量。如果节点数量异常多说明你没有做好节点管理。解决对于不可见图层立即将其下所有预览节点从场景树中移除而不仅仅是隐藏。实现对象池Object Pool用于频繁创建销毁的同类型对象如画笔工具预览的幽灵对象。对于Tile编辑放弃为每个Tile创建独立Sprite2D节点的做法改用Godot原生的TileMap节点来渲染和编辑性能有数量级的提升。问题游戏运行时加载的关卡其对象的行为和Builder中预览的不一样。排查这几乎肯定是“预览场景”和“游戏场景”不一致造成的。Builder中实例化的“预览场景”可能只是一个带纹理的Sprite2D而游戏中的场景是一个包含完整脚本、碰撞体、动画树的复杂场景。解决确保你的对象注册表ObjectRegistry映射正确。Builder的预览场景路径和游戏的运行时场景路径应该是分开的两套映射或者使用同一个映射但确保预览场景是运行时场景的简化视觉子集。建立严格的资源命名和管理规范避免混淆。问题撤销/重做功能在复杂操作后状态混乱。排查检查每个命令对象的execute()和undo()方法是否严格互逆。一个命令执行后必须能将系统状态完全恢复到执行前的样子。常见的错误是在命令中保存了对象的引用而对象后来被删除或修改了导致undo()时引用失效。技巧命令对象应保存足够的状态信息如对象的唯一ID、属性的旧值和新值而不是直接保存对象引用。通过ID在需要时从当前场景或数据模型中查找对象。

相关新闻

NVIDIA GPU 与服务器型号匹配查询

NVIDIA GPU 与服务器型号匹配查询

NVIDIA GPU 与服务器型号匹配查询1. Qualified System Catalog (认证服务器目录)2. NVIDIA L40S GPU2.1. NVIDIA L40S GPU Specifications2.2. 支持 NVIDIA L40S GPU 的 Dell 服务器型号References1. Qualified System Catalog (认证服务器目录) https://www.nvidia.com/en-us…

2026/8/3 19:33:11 阅读更多 →
MinIO桶复制配置实战:从原理到高可用数据保护

MinIO桶复制配置实战:从原理到高可用数据保护

1. 从一次数据丢失事故说起:为什么你需要桶复制 去年,我们团队负责的一个内部文件服务系统出了点状况。一个存放着大量项目文档和日志文件的MinIO存储桶,因为一次误操作,导致近一周的数据被覆盖。虽然我们有定期的备份脚本&#x…

2026/8/3 19:33:11 阅读更多 →
BepInEx 6.0.0在Unity游戏中的稳定性问题深度解析与解决方案

BepInEx 6.0.0在Unity游戏中的稳定性问题深度解析与解决方案

1. 项目概述:当BepInEx 6.0.0遇上Unity游戏 如果你是一个Unity游戏的Mod开发者,或者是一个热衷于为游戏增添新内容的玩家,那么BepInEx这个名字对你来说一定不陌生。它几乎是当前Unity游戏社区Mod开发的事实标准框架,负责处理Mod的…

2026/8/3 19:32:11 阅读更多 →

最新新闻

职场进阶必备!OpenClaw 2.9.0智能桌面自动化工具落地实操指南

职场进阶必备!OpenClaw 2.9.0智能桌面自动化工具落地实操指南

🔥前言:Win11 环境运行 OpenClaw 必读说明 OpenClaw(因其图标酷似小龙虾,在社区中常被昵称为“小龙虾”)是一款备受关注的本地优先 AI 智能体项目。它基于开源协议开发,能够通过自然语言指令驱动计算机完成…

2026/8/3 20:09:43 阅读更多 →
3步掌握PUBG-Logitech:开源智能识别压枪工具的完整教程

3步掌握PUBG-Logitech:开源智能识别压枪工具的完整教程

3步掌握PUBG-Logitech:开源智能识别压枪工具的完整教程 【免费下载链接】PUBG-Logitech PUBG罗技鼠标宏自动识别压枪 项目地址: https://gitcode.com/gh_mirrors/pu/PUBG-Logitech PUBG-Logitech是一款基于图像识别技术的开源罗技鼠标宏压枪工具,…

2026/8/3 20:09:43 阅读更多 →
YOLOv11改进 | 主干/Backbone篇 | 目标检测网络FasterNeT轻量化网络助力yolov11改进(提高FPS和检测效率)

YOLOv11改进 | 主干/Backbone篇 | 目标检测网络FasterNeT轻量化网络助力yolov11改进(提高FPS和检测效率)

一、本文介绍 本文给大家带来的改进机制是FasterNet网络,将其用来替换我们的特征提取网络,其旨在提高计算速度而不牺牲准确性,特别是在视觉任务中。它通过一种称为部分卷积(PConv)的新技术来减少冗余计算和内存访问。这种方法使得FasterNet在多种设备上运行速度比其他网络…

2026/8/3 20:09:42 阅读更多 →
Vue Router导航守卫重定向死循环:原理、调试与最佳实践

Vue Router导航守卫重定向死循环:原理、调试与最佳实践

1. 项目概述:导航守卫中的重定向死循环 在Vue.js的单页应用开发中, vue-router 的导航守卫(Navigation Guards)是实现路由权限控制、数据预加载和页面跳转逻辑的核心机制。然而,许多开发者,包括我自己&am…

2026/8/3 20:09:42 阅读更多 →
嵌入式开发

嵌入式开发

文章目录零、学习大纲一、嵌入式驱动开发1.具体情况2.RTOS:FreeRTOS二、Linux驱动开发零、学习大纲 了解GPIO协议、I2C协议、SPI Flash、WatchDog、FreeRTOS、CAN总线、串口编程 一、嵌入式驱动开发 1.具体情况 1.就业单位: (1)主控芯片原厂&#xff…

2026/8/3 20:09:42 阅读更多 →
python的工业过程控制场景模拟第四十八篇:分析前馈—反馈控制历史数据,量化前馈补偿降低的参数波动幅度。

python的工业过程控制场景模拟第四十八篇:分析前馈—反馈控制历史数据,量化前馈补偿降低的参数波动幅度。

前馈—反馈控制历史数据分析系统 —— 量化前馈补偿效果的实战工具"前馈控制的道理谁都懂——扰动还没影响到被控量之前就先动手。但问题是:你怎么向领导证明前馈真的有用?我感觉有了前馈之后稳多了——这不是工程师该说的话。你需要的是数据&#…

2026/8/3 20:08:26 阅读更多 →

日新闻

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

PC服务器具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构一、前言:具身智能需要“混合算力闭环系统”传统人工智能依赖云端静态数据集训练,不具备物理交互能力,无法适应真实世界的不确定性。具身智能(Embodied…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

前言构建机器人、具身智能这类分布式实时系统,通信底座直接决定整套系统的实时性、容错性、组网能力。分布式领域长期存在 4 类经典通信架构:点对点模式、Broker 中间代理模式、广播模式、以数据为中心(DDS)模式。很多开发者疑惑&…

2026/8/3 0:00:47 阅读更多 →

周新闻

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

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

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

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

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

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

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

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

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

2026/8/3 4:36:35 阅读更多 →

月新闻

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

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

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

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

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

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

2026/8/3 5:19:38 阅读更多 →
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/3 8:27:36 阅读更多 →