Godot 4.7 正式发布:「Lights, Camera, Action!」—— 相比 4.6 强在哪儿?

Godot 4.7 正式版于 2026 年 6 月 18 日发布,是 Godot 4 系列打磨三年后的又一里程碑。官方给它起了个电影味十足的副标题——“Lights, Camera, Action!”(灯光、镜头、开拍)。

如果说今年 1 月的 4.6 是“最精简的基线版”,专注打磨工作流与可用性,那么 4.7 就是在这个基线上“加倍投入”:让引擎本身更轻快,同时把周边工具(比如全新的资产商店)也一并做顺手。

下面从几个维度拆解 4.7 的新东西,并重点对比它相对 4.6 到底强在哪。

一、画质与渲染:HDR 与真实光照

  • HDR 输出支持:在 Windows、macOS、iOS、visionOS 以及 Linux(Wayland)上支持高动态范围输出,2D/3D 场景能呈现更鲜艳的色彩与超高亮度特效——这是 4.6 完全没有的能力。
  • AreaLight3D 矩形区域光:新增节点,可在 3D 空间实时渲染来自矩形面的光,不必再用自发光材质 + 全局光照去“假装”电视屏、广告牌发光。注意它开销不低,别把场景里的 OmniLight 全换成它。
  • Clearcoat 修复:修好了 BaseMaterial3D 清漆层此前未做能量守恒、未考虑天空反射的问题,更接近迪士尼 PBR 参考模型,车漆等材质质感显著提升。
  • 每 Pass 独立环境统一缓冲区:为现代渲染的每个 pass 分配独立内存池,消除了跨 pass 共享内存带来的复制依赖瓶颈,直接加速渲染。
  • 视口最近邻缩放:3D 渲染新增 nearest-neighbor 过滤,复古风或低分辨率提性能时用,开销与双线性相当。
  • 3D 粒子可控缩放/旋转、GradientTexture2D 圆锥渐变(FILL_CONIC)等小增强。

二、编辑器与资产管理:效率拉满

  • 全新 Asset Store 取代旧 Asset Library:可缩放预览、显示资产评分,并引入后台线程,浏览资产时不再卡住编辑器 UI。
  • 文本着色器内联预览:在着色器编辑器里敲代码(如 vec2 v4 = UV;)即可实时看到效果,不用编译完去外部看。
  • MeshLibrary 专用编辑器:为 GridMap 新增类似 TileSet 编辑器的工具,网格库编辑不再痛苦。
  • 2D 场景绘制模式:2D 编辑器默认 B 键快速散布节点(收集品、敌人),关卡铺设效率大增。
  • 3D 顶点吸附:默认 B 键高亮并拖拽顶点对齐;轨迹球风格旋转(按 U)让 3D 变换更顺手;连续按两次聚焦键 F 可跟随移动物体。
  • 检查器局部复制粘贴、远程场景树折叠、创建对话框过滤、脚本列表定位当前脚本等一堆 QoL。

三、GUI:Control 偏移变换与内置虚拟摇杆

  • Control 节点偏移变换(offset_transform):可平移/旋转/缩放 Control 节点而不影响 Container 布局(类似 CSS transform),GUI 动画更好做。
  • 内置 VirtualJoystick 虚拟摇杆节点:支持 Fixed / Dynamic / Following 三模式,移动端输入开箱即用(4.6 需自行实现或依赖插件)。
  • PopupMenu 搜索栏、RichTextLabel 图像按字号缩放([img height=1em])、Tree 拖放位置指示等。

四、移动端 / Android:可在手机上完整做游戏

随 GABE(Godot Android Build Environment)稳定版 发布,开发者现在能在 Android 设备上导出并发布游戏。此外 Android 端新增画中画、自由调整嵌入式游戏窗口、直接编辑启动画面、Perfetto 默认追踪,以及 GDScript 实现 Java 接口 的能力。

五、XR 与平台

  • 生产级首日支持 Android XR 与 Steam Frame。
  • Vulkan 子采样图像 大幅改进 Mobile 渲染器的注视点渲染性能,使其在基准测试中匹敌甚至超过 Compatibility 渲染器——新 XR 项目建议用 Mobile 渲染器。
  • 合成层改进、操作映射简化。

六、系统与导出

  • 按需下载导出模板:只下载需要的平台/架构模板,省带宽(社区反馈已省下大量时间)。
  • Tween.tween_await():可在指定信号发射前暂停补间,对话/过场动画好写多了。
  • 输入增强:失焦忽略手柄、键鼠设备识别、iOS 用 SDL3、陀螺仪体感瞄准。

七、4.7 比 4.6 强在哪?(对比速览)

维度 Godot 4.6 Godot 4.7
发布时间 2026-01-26 2026-06-18
主题定位 All about your flow(打磨工作流) Lights, Camera, Action!(画质 + 资产 + 移动)
HDR 输出 无 Windows/macOS/iOS/visionOS/Linux Wayland 支持
矩形区域光 无 新增 AreaLight3D
资产商店 旧 Asset Library 全新 Asset Store(后台线程、评分、缩放预览)
着色器预览 无内联预览 文本着色器内联实时预览
GUI 偏移变换 无 Control.offset_transform
虚拟摇杆 需自行实现 内置 VirtualJoystick 节点
Android 完整开发 编辑器 Gradle 实验 GABE 稳定版,手机上导出发布
导出模板 全量下载 按需下载指定平台/架构
3D 内容创建 已有 IK/物理默认 顶点吸附、MeshLibrary 编辑器、2D 场景绘制、轨迹球旋转
XR OpenXR 1.1、安卓 XR 编辑器 Android XR/Steam Frame 首日生产支持、Vulkan 子采样提性能

总结

4.6 把 Godot 4 的地基打得很稳,4.7 则在画质(HDR、区域光)、资产工作流(Asset Store)、GUI(偏移变换、虚拟摇杆)和移动独立开发(GABE)四个方向同时发力。两者同属当前全支持的稳定分支,4.6 项目升级到 4.7 风险很低(4.6 维护版 4.6.3 仍在支持),新项目直接用 4.7 即可。

本次 4.7 由 300+ 贡献者、1600+ PR 打磨而成。想尝鲜的开发者可前往官网下载 4.7-stable(最新维护版 4.7.2),或查阅在线文档。

上海押注卫星互联网:一图读懂《卫星互联网产业创新发展行动方案(2027–2030)》

10 月 26 日,上海市经济和信息化委员会等六部门联合印发《上海市卫星互联网产业创新发展行动方案(2027—2030 年)》,并在市政府官网全文公布,方案自 2026 年 10 月 26 日起施行。这是继上海「十五五」战略性新兴产业规划之后,地方层面对卫星互联网产业最系统、也最「量化」的一次部署——把「在轨多少颗、产值多少亿、算力多少 POPS」都写进了硬指标。本文按「为什么出手 → 目标怎么定 → 四大行动拆什么 → 技术深水区在哪 → 集群怎么摆 → To C 意味着什么 → 底气从哪来」的顺序做一次解读。

一、为什么是现在、为什么是上海

把卫星互联网写进行动方案,背后是三重叠加:

  • 国家战略落子:10 月 23 日印发的《国家信息化「十五五」规划》明确「适时启动 6G 商用」「陆海空天立体化网络体系基本形成」,卫星互联网是这张立体网的空间段核心;
  • 产业拐点已至:低轨星座从「发射竞赛」转向「在轨服务」,天基算力、手机直连卫星从概念走向量产验证(上海本地已有千帆星座、明珠星座、星枢计划等工程在跑);
  • 地方禀赋成型:上海商业航天、集成电路、终端制造的产业链已经连成片,方案本质是给这条链「加一把火、定一张表」。

方案以「强技术、夯基础、优集群、拓应用」为主线,覆盖从空间段、地面段到用户段的主要环节。

二、一图读懂:2030 年的硬指标

方案对 2030 年给出了明确量化目标,大致可以分成五个维度:

维度 2030 年目标 读数
产业规模 核心产业规模突破 800 亿元 把统计范围锁定在核心环节(制造、载荷、终端、运营),不是泛泛的「关联产值」
空间段 在轨卫星总数超 3000 颗 对批产、发射组织、测运控、信关站形成系统性需求
创新转化 科研成果转化超 100 项 强调从研发到产品的工程化通道
市场主体 培育优质企业等主体超 100 家 把创新供给与市场承接放在同一目标体系
应用落地 打造「100+ 标杆示范应用」 强调可复制性与示范效应,To G / To B / To C 并举

另有几项「技术硬指标」尤其值得技术人关注,后面单列:

技术方向 量化指标
网络容量 力争 150 Tbps 以上,基于星间激光链路组网
星间激光通信 速率突破 400 Gbps
单星通信容量 达到 100 Gbps
相控阵天线 单阵面收发天线不少于 32 个波束
天基算力 AI 单星最高算力超 30 POPS
星间重路由 切换时延小于 5 毫秒、切换成功率大于 99.9%
测运控能力 巨型星座数字化测运控系统支持卫星管理不少于 3000 颗

三、四大行动主线拆解

1. 强技术:自主可控,卡住三大领域

围绕自主可控,方案把攻关目标收敛到网络架构、平台载荷、地面设备三大领域——说白了,就是「星座怎么组网、卫星载什么、地面用什么终端」。网络架构层主攻卫星手机直连、天基算力、空天地一体与通感算智融合;平台载荷层主攻星间激光、分布式核心网、大规模相控阵、EUHT 载荷;地面设备层主攻大型低轨星座地面系统、消费级直连多模终端、基于巨型星座的无人智慧应用。

2. 夯基础:把「地面段」当成底座来建

方案把基础设施与集群布局并列,体现的是「以设施承载产业、以集群汇聚主体」的思路。具体包括:推动低轨、中轨星座加速部署,探索多轨联动与算力星座规划;完成 VDES(甚高频数据交换系统)建设;支持企业全球规划建设信关站,适时部署星地互联中心;在浦东、松江建设新一代测运控中心,并建支持超万颗卫星的星座模拟仿真平台。

3. 优集群:市区协同,摆出「2+X」

松江集聚区沿长三角 G60 科创走廊,主打商业卫星批量化智能制造与卫星测运控中心,目标是「卫星、网络、终端、应用」全产业链生态;浦东集聚区以低轨商业系统关键技术、北斗规模及全空间无人体系应用为主,并以「超低轨」为特色赛道,带动配套芯片、载荷、终端全链条集聚;闵行、青浦、临港作为若干细分特色产业园区补位(闵行航天、青浦北斗均已成规模)。

4. 拓应用:To G / To B / To C 三箭齐发

应用侧不只是行业客户。To G 面向应急通信、海事管理;To B 面向远洋航运、民航、金融专网;To C 则明确「支持个人用户通过手机直连或便携终端接入卫星互联网,支持运营商推出优惠套餐」,让卫星连接从「特殊装备」变成大众消费级的「普通服务」。

四、技术深水区:三个值得盯的方向

4.1 网络架构——手机直连 + 天基算力 + 空天地一体

这是方案里「最像未来」的一块。它有两组硬指标:一组是星间重路由切换时延小于 5 毫秒、成功率大于 99.9%,要让大规模星座在单星失效或跨星切换时近乎无感;另一组是AI 单星最高算力超 30 POPS,把推理放到天上,数据「天数天算」而非先回地面再算。配套的「通感算智融合」意味着卫星不再是单纯转发管道,而是集通信、感知、计算于一体的在轨智能体。

观察者视角:30 POPS 单星算力、5 毫秒星间切换,都是 2030 年的「目标值」而非在轨实测值。真正难的不在指标本身,而在把这两件事同时跑稳——尤其当天基算力开始承担实时推理,热控、能源、星间光链路的余量会被迅速吃紧。

4.2 平台载荷——400Gbps 星间激光、100Gbps 单星、32 波束相控阵

载荷层给了四项攻坚:星间激光通信终端、星地分布式轻量化核心网、大规模相控阵、EUHT 载荷。指标里,星间激光速率突破 400 Gbps 决定星座骨干传输能力(低轨全球无缝覆盖、减少对地面信关站依赖的关键),单星通信容量 100 Gbps 与单阵面不少于 32 个波束则决定单星同时服务多用户、多区域的上限。EUHT 是国产高吞吐无线标准,放进载荷清单,信号很明确:核心空口也要自主。

4.3 地面终端——测运控要管 3000 颗,还要消费级直连终端

地面侧一项容易被忽视但极关键的指标:巨型星座数字化测运控系统要能管理不少于 3000 颗卫星。这相当于给整张星座配一套「交通指挥系统」。与此同时,方案点名「面向消费级卫星直连多模终端」的研制——没有好用的终端,手机直连就只是口号。

五、基础设施:多轨联动与 VDES

星座体系上,方案提出「探索多轨联动」,推动低轨、中轨加速部署,规划算力星座建设,构建「弹性互补、全域无缝」的天地融合网络。VDES 的纳入则把海事、航空的甚高频数据交换也并入天地一体框架。地面段支持企业全球建信关站、部署星地互联中心,并推动卫星互联网企业与通信运营商在地面基础设施上共建共享——这能显著压低业务开通的节奏成本。

六、应用落地:To C 才是真正的分水岭

过去卫星通信长期是应急、特种作业的「备胎」。方案把 To C 单独拎出来:个人用户用手机直连或便携终端接入,运营商推优惠套餐,目标是覆盖地面通信盲区、把卫星连接做成「无处不在的泛在连接」。这一步一旦跑通,商业模型就从「政府/行业买单」转向「数亿消费者日常订阅」,对整个产业链的估值逻辑都是重估。

七、底气从哪来:上海的产业底座

方案敢定 3000 颗、800 亿的目标,靠的是已经成型的底座:

  • 千帆星座在轨卫星已达 256 颗;
  • G60 卫星工厂单星生产仅需 1.5 天,批产能力已经验证;
  • 垣信卫星完成 B 轮融资约 70 亿元、投后估值约 500 亿元;
  • 浦东集聚 50 余家重点企业,闵行航天产业规模超 460 亿元,青浦北斗产业规模超 110 亿元;
  • 太空算力侧已有实质性工程:明珠星座计划(先导星「东方天算」号峰值算力约 2 PFLOPS、配 16TB 存储,长期目标吉瓦级天基计算星座)、星枢计划(首发星座含中心算力主星,单星 32P 在轨算力、400Gbps 激光、15kW 发电,商业运营阶段规划千星部署)、中国移动「天基智算载荷 1.0」(单星数十 TOPS,实测星地链路时延降至 5 毫秒)。

一句话:上海的打法不是「从零造星」,而是在已有星座、工厂、资本、算力载荷的骨架上,用一张量化时间表把它们串成「可投资、可验收、可落地」的产业工程。

八、观察者视角:三句话总结

  • 这是一份「工程清单」而非「愿景口号」:3000 颗、800 亿、30 POPS、5 毫秒切换,全部可量化、可考核;
  • 真正的胜负手在「地面段 + 终端 + To C」:空间段拼发射,地面段与消费级终端才决定网络能不能真正赚钱;
  • 天基算力是上海押的差异化赛道:当其他城市还在拼发射数量,上海把「在轨 AI 推理 + 空天地一体」写进硬指标,赌的是下一阶段的算力密度竞争。

对 IoT 与嵌入式从业者来说,这份方案意味着两件事会加速:一是卫星直连多模终端会催熟一批低功耗、小型化、支持卫星链路的芯片与模组;二是天基算力 + 边缘 AI 会让「端—边—天—云」的协同从论文走向产品。值得持续跟踪。

信息来源

  • 《上海市卫星互联网产业创新发展行动方案(2027—2030 年)》全文(上海市人民政府官网 / 上海市经济和信息化委员会等六部门印发)
  • 上海推动卫星互联网产业创新发展:聚力建设松江、浦东产业集聚区(澎湃新闻)
  • 上海六部门印发卫星互联网方案 2030 年规模突破 800 亿元(腾讯新闻)
  • 放大招!上海印发卫星互联网行动方案 2030 年核心产业规模突破 800 亿(C114 通信网)
  • 3000 颗卫星,800 亿产值目标背后:上海给出卫星全产业链提速时间表(界面新闻)
  • 上海六部门联合发文,押注卫星互联网(腾讯新闻 / 芯智讯)
  • 发力卫星互联网,上海出招(东方财富网)
  • 网络、算力上天入海「空天地海」一体化通信网加速成型(人民日报全国党媒信息公共平台)
  • 太空「天网」加速织就(经济日报)
  • 上海发布太空算力星座工程「星枢计划」,商业运营阶段将完成千星部署(IT之家)
  • 「东方天算」号卫星发射入轨,上海太空计算「明珠星座计划」迈出重要一步(人民网上海)
  • 「明珠星座计划」:一体化调度让天地算力各展所长(新华网)

本文为公开报道与官方文件整理,指标与结论以各机构官方发布为准。首发于 tech.iotcomeon.com(IoT前哨站),2026 年 10 月 27 日。

浏览器里仿真 Arduino 和 ESP32,有点东西

没板子 = 今天摸鱼?快递还在路上,代码已经亮灯。一块能开在浏览器标签页里的「云上开发板」—— Arduino · MicroPython · GPIO · I²C · OLED,背后是 Velxio · QEMU 仿真。

乐鑫刚放出 ESP32 模拟器,评论区都在喊「以后不用买板子了」。但浏览器里跑固件,早有人先做了。

它叫 Velxio,一块能开在标签页里的「云上 DevKit」。我拿它跑了点灯、DHT22、OLED、串口打印,结论先给:

教学、原型、面试 Demo、没板子救急,它比你想的好用;但别拿它代替射频和功耗测试。

01 · 不是「代码高亮」,是真在跑固件

CHIP · 跑的是什么

Velxio 背后是 QEMU + WASM 前端:ESP32 的 Xtensa 指令、FreeRTOS 任务、Arduino setup() / loop()、MicroPython REPL,都能在浏览器线程里真执行。

你看到的不是动画:

  1. pinMode(2, OUTPUT) → 虚拟 GPIO2 状态变高
  2. Wire.beginTransmission(0x3C) → I²C 总线里真有起始条件
  3. Serial.println("hello") → 右侧串口终端蹦出字符
  4. 延时、中断、定时器、看门狗 → 都按指令周期走

支持形态目前最实用的是三类:

  • Arduino-ESP32:拖 .ino 进去,点 Run
  • MicroPython:直接写 Python,串口变 REPL
  • ESP-IDF 轻量固件:高级玩家也能塞 ELF

以前是「没板子 = 今天摸鱼」,现在是「没板子 = 开个网页继续干」。

02 · 元件库才是杀招:拖个 OLED 就亮

PERIPHERALS · 虚拟硬件

这部分比纯 QEMU 爽太多。Velxio 前端像个 「Fritzing + 串口监视器 + 逻辑分析仪」 合体:

  • LED / 按键 / 电位器
  • DHT11 / DHT22
  • OLED 128×64(SSD1306)
  • I²C 传感器 / UART 桥 / 逻辑电平显示
  • 舵机 / 蜂鸣器 / WS2812(部分版本)

你接线不用杜邦线,鼠标拖一下就行。固件里写:

Adafruit_SSD1306 display(128, 64);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.print("Velxio OK");
display.display();

页面上 OLED 就亮了。

学生第一次见到「代码 → 总线 → 屏幕」,比老师讲三节课都管用。

03 · 接进工作流:教学 / 原型 / 远程面试

WORKFLOW · 怎么用

CASE 01 · 教学

老师发个链接:「今晚作业:让 OLED 显示温度,DHT22 随机跳 25°C 到 30°C。」学生不装 ESP-IDF、不买 DevKit、不被 CH340 驱动劝退。

CASE 02 · 需求评审前先演

产品说「做个配网按钮 + 状态灯」。你先在 Velxio 里把状态机跑出来:

IDLE → PRESS → CONNECTING → CONNECTED → ERROR

老板看懂了,真机才动手。

CASE 03 · 远程嵌入式面试

候选人共享标签页:「你用定时器让 LED 1Hz 闪,同时串口打 uptime。」比「口述 RTOS 抢占」诚实十倍。

CASE 04 · 没板子时救火

板子在产线、在客户那、在快递站。你本地改完 main.cpp,Velxio 里先确认:

  • 分区没崩
  • 任务没死锁
  • I²C 地址没写错
  • OLED 不黑屏

再烧真机。

04 · 两种上手方式:零安装 / 半专业

GET STARTED · 上手

STEP 01 · 网页版(零门槛)

打开 https://velxio.dev(或对应镜像),新建项目 → 选 ESP32 → 写 Arduino → Run。

固件在浏览器里跑,不上传服务器(具体看官网隐私说明)。适合:教学、Demo。

STEP 02 · 本地 QEMU 版(硬核)

idf.py build
qemu-system-xtensa -M esp32 -nographic

再用 GDB 调试:

xtensa-esp32-elf-gdb build/app.elf
(gdb) target remote:1234

适合:CI、GDB、FreeRTOS 调度分析、Perfetto 式追踪。

网页版管「看得懂」,本地 QEMU 管「查得深」。

05 · 用之前必须知道的 3 件事

CAVEATS · 别被爽到失智

  1. 没有真射频:Wi-Fi / BLE 是「模拟联网」,不是发 2.4GHz 包。配网 UI 能测,信道质量、丢包、同频干扰测不了。
  2. 外设是「模型」,不是「规格书」:OLED 亮了 ≠ 真 SSD1306 时序完全一致。ADC 读电压、SPI DMA、PSRAM 带宽,别信虚拟值。
  3. 固件能跑 ≠ 产品能出货:功耗、复位、ESD、Flash 寿命、看门狗喂狗慢 5ms 会不会炸 —— 这些只有真板子说话算数。

写在最后 · 适合用在哪里(结论)

SUMMARY · 谁该收藏

  • 嵌入式小白:先跑通「代码控制硬件」的直觉
  • 高校老师:实验课不用管 80 块板子丢了没
  • 创业者:需求没定之前,别先砸钱买 20 块 ESP32-S3
  • 老工程师:板子不在手边,逻辑先验完
  • 内容博主:录「ESP32 入门」再也不用举着杜邦线对焦

三个工具怎么选:

  • esp-emulator:乐鑫正宫 · Rust + WASM
  • Velxio:前端野路子 · 电路画布
  • QEMU:底层老黄牛 · GDB / CI

三层互补,不是三选一。三层加起来,嵌入式开发终于有点「软件工程样」了。

相关链接


本文首发于微信公众号「IoT前哨站」(作者:长空无名,2026 年 10 月 21 日)。

GitHub Copilot 架构升级:支持本地模型,实现云边协同编码

微软于 2026 年 10 月正式宣布 GitHub Copilot 完成架构级升级,将于10 月底全面开放本地 AI 模型推理能力。本次升级是 Copilot 从纯云端服务向「云端 + 本地边缘」混合部署架构的核心演进,基于 Project HydraFusion 编排体系扩展,实现了跨环境的智能任务调度与模型管理。

一、核心架构升级:从多模型编排到云边一体化调度

本次架构升级的核心是将原有的HydraFusion 多模型编排引擎从纯云端扩展到云边双环境,形成统一的跨层调度体系:

  1. 原有基础架构:2026 年 9 月推出的 Project HydraFusion 是一套运行时编排系统,可根据任务复杂度、成本、延迟指标,在多个云端模型之间自动选择「单模型直接求解、级联迭代、交叉评审」三种执行模式,在保持编码质量的同时降低推理成本。
  2. 升级后的扩展能力:调度器新增本地设备算力节点,可依据响应速度、计算成本、生成质量、设备性能、隐私要求等多维指标,自动将推理任务分配到云端或本地端,后台无缝协同两类计算资源,开发者无需感知底层基础设施差异。

二、本地模型的两种运行模式

用户可通过 VS Code 插件、Copilot CLI 命令行工具、独立桌面应用等入口,选择两种本地运行模式:

  • 自动编排模式:系统根据任务特性动态决策部署位置 —— 简单代码补全、语法检查等轻量任务优先走本地;复杂架构重构、跨文件逻辑分析等高阶任务自动调度到云端大模型,兼顾速度与质量。
  • 强制本地模式:全部推理过程完全在设备端完成,数据不经过云端服务器,满足敏感代码开发、离线环境、强合规场景的隐私需求。

三、支持的本地模型与兼容方案

1. 微软官方原生本地模型:MAI Code 1.1 Flash

微软同步推出专为本地编码优化的轻量级大模型,作为 Copilot 本地推理的官方默认选项:

  • 采用混合专家(MoE)架构,总参数量 1370 亿,每轮激活参数约 68 亿
  • 融合量化压缩与推测解码技术,在保留编码质量的同时降低内存占用、提升端到端响应速度
  • 支持最大 256k 上下文窗口,峰值内存占用 75.5GB,可在搭载 NVIDIA RTX AI 算力的 Windows 设备(如 Surface Laptop Ultra)上基于 Windows ML 原生加速运行

2. 第三方本地模型兼容

通过扩展 BYOK(Bring Your Own Key)机制,支持广泛的第三方本地部署模型:

  • 原生支持Ollama作为本地模型提供商,覆盖 VS Code、JetBrains 全系列 IDE、Copilot CLI 等所有终端,可直接选择 Ollama 本地运行的任意模型
  • 兼容所有符合OpenAI Chat Completions API 规范的本地端点,包括 vLLM、Foundry Local 等自部署服务
  • 支持自定义 URL 端点,企业可接入内部私有部署的专属模型,适配定制化开发流程

四、配套安全与能力保障

  • 安全沙箱隔离:微软推出 Microsoft Execution Containers(MXC)执行容器,为本地与云端的代理式编码会话提供隔离环境,精细化控制文件、网络、系统权限与凭证访问,保障本地运行时的系统安全与数据安全
  • 全功能对齐:本地模型完整支持 Copilot 的代码补全、逻辑解释、结构化重构、工具调用、流式输出、跨会话记忆等全部能力,与云端体验保持一致

五、覆盖的产品终端

本次本地模型支持将同步覆盖 GitHub Copilot 全产品线:

  • Visual Studio Code / Visual Studio 2026
  • GitHub Copilot CLI 命令行工具
  • GitHub Copilot 独立桌面应用
  • JetBrains 系列 IDE 插件(已提前上线 Ollama 本地接入能力)

六、升级的核心价值

  1. 隐私合规:敏感代码、内部项目无需上传云端,满足金融、政企等强合规场景的数据安全要求
  2. 离线可用:无网络环境下仍可使用完整的智能编码辅助能力,适配离线开发、内网开发场景
  3. 成本优化:高频轻量任务由本地算力承接,显著降低云端 Token 消耗与订阅成本
  4. 低延迟体验:本地代码补全响应不受网络波动影响,交互更流畅
  5. 灵活定制:开发者可自由选择模型与部署方式,适配不同技术栈与业务流程

Godot 4.6 + Android 真机跑通 AdMob 广告(横幅 / 插页 / 奖励)

这份文档里的每一步、每一个坑,都是在真机上一遍遍试出来的,不是照抄文档写的。
实测机型:Redmi 23013RK75C(Android 13 / Adreno 730),Godot 4.6.stable,
插件:Poing Studios godot-admob v4.0.1。

为什么值得专门写一份:这个插件在 Godot 4.6 上有 三个必须手动打补丁 的地方,
不打的话要么 403、要么 JNI 报错、要么横幅完全静默失败(最难查,本文重点)。


一、先说结论:要打三个补丁

# 症状 根因 补丁位置
1 广告请求返回 403,拿不到广告 插件写死 play-services-ads:24.9.0,该版本已被 Google 停服 addons/admob/android/bin/ads/poing_godot_admob_ads.gd
2 报错 Array[String] does not have the same element type Godot 4.6-stable 引擎 bug:java_class_wrapper.cpp:202 把 && 写成 \|\|,任何 typed Array 传 String[] 都失败 src/api/core/AdRequest.gd + 4 处调用点
3 横幅既不成功也不失败,SDK 一个网络包都不发 GDScript int 传给 Java 时被装箱成 Long,插件 aar 里是 checkcast Integer,抛异常后被 JNI 静默吞掉 src/api/AdView.gd

补丁 1、2 相对好查(有明确报错)。补丁 3 才是真正卡人的地方,下面第五节详细讲。


二、环境清单

项目 版本 / 说明
Godot 4.6.stable(用 _console.exe 版本,命令行能看到完整输出)
AdMob 插件 Poing Studios godot-admob v4.0.1
play-services-ads 25.5.0(跟随 Maven latest,不能用插件默认的 24.9.0)
渲染器 Mobile(Vulkan)
Android 构建模板 必须安装(Gradle 构建,约 200MB)
adb Android SDK platform-tools
测试机 开启 USB 调试,屏幕保持解锁

三、第 1 步:建项目

3.1 路径必须全 ASCII

✅ C:\Users\xxx\Documents\AdMobPortrait
❌ C:\Users\xxx\Documents\实验广告

Godot 导出到中文路径会失败,这是硬限制。

3.2 project.godot 的关键项

config/name="AdMobPortrait"
run/main_scene="res://Main.tscn"
config/features=PackedStringArray("4.6", "Mobile")
config/icon="res://icon.svg"          ; 不写会报 "No project icon specified"

[autoload]
AdManager="*res://AdManager.gd"

[display]
window/size/viewport_width=720
window/size/viewport_height=1280
window/handheld/orientation=1          ; 1 = 竖屏
window/stretch/mode="canvas_items"
window/stretch/aspect="expand"

[rendering]
renderer/rendering_method="mobile"
renderer/rendering_method.mobile="mobile"
textures/vram_compression/import_etc2_astc=true   ; ★ 缺了导出会失败

⚠ 坑:导出报 due to configuration errors: 但消息是空的

ERROR: Cannot export project with preset "portrait" due to configuration errors:
(后面什么都没有)

根因在引擎 platform/android/export/export_plugin.cpp:3047,
has_valid_project_configuration() 里有一段不写任何错误信息就直接置 false 的判定:

if (!ResourceImporterTextureSettings::should_import_etc2_astc()) {
    valid = false;      // ← 没有 r_error,所以错误消息为空
}

解决:补上 textures/vram_compression/import_etc2_astc=true。


四、第 2 步:装插件

4.1 放插件并启用

把 addons/admob 整个目录放进项目,然后 project.godot 加:

[editor_plugins]
enabled=PackedStringArray("res://addons/admob/plugin.cfg")

4.2 ★ 必须生成一次全局类名缓存

新建项目第一次打开时,脚本里的 AdView / MobileAds / AdRequest 等全局类名
全部报 “not declared”,因为 .godot/global_script_class_cache.cfg 还没生成。

godot --headless --editor --quit

跑一次(会自动生成缓存然后退出),再打开编辑器/导出就正常了。

4.3 安装 Android 构建模板

编辑器菜单:项目 → 安装 Android 构建模板,会生成 android/build/(约 200MB)。

如果从别的项目拷现成的 android/ 目录,要剔除 build/build、.gradle,
但 assetPackInstallTime 是模板自带的,别删。


五、第 3 步:三个必打的补丁 ★核心章节

补丁 1 —— play-services-ads 升到 25.5.0(解决 403)

文件:addons/admob/android/bin/ads/poing_godot_admob_ads.gd

# 原值 24.9.0 已被 Google 停服,服务端直接返回 403
var _dependency_library := ["com.google.android.gms:play-services-ads:25.5.0"]

版本号别写死,去
https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-ads/maven-metadata.xml
看 <latest> 是多少,跟着走。

补丁 2 —— typed Array 换 PackedStringArray(解决 JNI 报错)

根因:Godot 4.6-stable 的 platform/android/java_class_wrapper.cpp:202:

if (arr.is_typed() && (builtin != STRING || builtin != STRING_NAME))
//                                      ^^ 应该是 &&

|| 导致这个条件恒为真,于是任何 typed Array 传 String[] 都被拒。
(master / 4.7-dev 已修正为 &&。)

改法 —— 在 src/api/core/AdRequest.gd 加一个转换函数:

func jni_keywords() -> PackedStringArray:
    return PackedStringArray(keywords)

然后把 4 处调用点 的第 3 个参数改掉:

文件 行 改法
src/api/AdView.gd 89 ... ad_request.jni_keywords())
src/api/InterstitialAdLoader.gd 44 ad_request.jni_keywords()
src/api/RewardedAdLoader.gd 44 ad_request.jni_keywords()
src/api/RewardedInterstitialAdLoader.gd 44 ad_request.jni_keywords()

另外 src/api/MobileAds.gd:42 也要改:

_plugin.set_request_configuration(
    request_configuration.convert_to_dictionary(),
    PackedStringArray(request_configuration.test_device_ids))   # ← 加 PackedStringArray

补丁 3 —— Integer 装箱(解决横幅完全静默失败)★最难查

症状

插页、奖励都正常,只有横幅:发出加载请求之后,
既没有 on_ad_loaded,也没有 on_ad_failed_to_load,SDK 一个包都不发。
日志里干干净净,什么都不报错。

排查三步法(这套手法可以复用到别的插件问题)

第 1 步:对照插件日志找断点

adb logcat -d -v brief | grep -i "poing-godot-admob\|godot   "

正常应该看到 safeInsetRect 之后紧跟着:

D/poing-godot-admob: Safe Area of screen: Rect(...).
D/poing-godot-admob: marginTop: 0

如果 Safe Area of screen: 从没出现,说明 Banner 构造中途就断了。

第 2 步:看视图层级,确认 AdView 到底建出来没有

adb shell dumpsys activity top

往下找 godot_fragment_container,正常应该能看到
com.google.android.gms.ads.AdView。看不到就说明 addView 那段没执行。

第 3 步:反编译 aar 看字节码

unzip -o addons/admob/android/bin/ads/libs/poing-godot-admob-ads-release.aar
cd <解压目录> && unzip -o classes.jar
javap -p -c com/poingstudios/godot/admob/ads/adformats/Banner.class

在 Banner.<init> 的字节码里会看到:

63: checkcast  java/lang/Integer     // ad_position

convertToAdSize 里也有两处(width / height)。

根因

GDScript int  ──写进 Dictionary──▶  Godot 装箱成 java.lang.Long
                                            │
                                   Java 侧 checkcast java/lang/Integer
                                            │
                                   ClassCastException
                                            │
                                   被 JNI 层静默吞掉 → Banner 构造中断
                                            │
                              runOnUiThread{ 创建 AdView + addView } 永不执行
                                            │
                                   没有 AdView → 零网络请求 → 零回调

Godot 的 int 是 int64,装箱成 Long;而插件 aar 里的 Kotlin 是 this["ad_position"] as Int。
这个异常发生在 safeArea 属性初始化之后、runOnUiThread 之前,
所以 Banner 没被加进 banners 列表,后续 load_ad(uid) 取 banners[uid] 越界 —— 整条链静默。

注意:GitHub master 上的 DictionaryExtensions.kt 已经改成安全的
(this[key] as? Number)?.toInt(),但发布的 aar 4.0.1 仍是旧代码。
这就是为什么”看源码明明修过了,跑起来还是崩”。

修复代码

文件:addons/admob/src/api/AdView.gd

# Godot 的 JavaClass 构造器方法名 = 类的简单名
# (java_class_wrapper.cpp:1488: java_constructor_name = 类名最后一段)
# 所以是 Integer.Integer(v),走 env->NewObjectA(..., "<init>", ...),
# 返回 JavaObject;JavaObject 进 Dictionary 时引擎直接透传 jobject。
static var _integer_class = null
static var _integer_class_ready := false

static func _java_int(value: int):
    if not _integer_class_ready:
        _integer_class_ready = true
        if OS.get_name() == "Android":
            _integer_class = JavaClassWrapper.wrap("java.lang.Integer")
    if _integer_class == null:
        return value
    return _integer_class.Integer(value)

然后 _init() 里三个 int 全部走它:

var ad_view_dictionary := {
    "ad_unit_id": ad_unit_id,
    "ad_position": _java_int(ad_position),
    "ad_size": {
        "width": _java_int(ad_size.width),
        "height": _java_int(ad_size.height)
    }
}

为什么插页/奖励不受影响

它们的 AdRequest.convert_to_dictionary() 里只有 String 和空 Dictionary,
没有 int,碰不到这个 checkcast。这也解释了”为什么偏偏只有横幅坏”。


六、第 4 步:业务代码

6.1 官方测试广告单元 ID(任何包名下都能出测试广告)

const BANNER_ID       := "ca-app-pub-3940256099942544/6300978111"
const INTERSTITIAL_ID := "ca-app-pub-3940256099942544/1033173712"
const REWARDED_ID     := "ca-app-pub-3940256099942544/5224354917"

6.2 注册测试设备

真机上跑测试广告必须把设备注册成测试设备,否则拿不到测试广告。
设备哈希从 logcat 里 SDK 自己打印的那句取:

Use RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("599DD0E66111F3FAC24560DEABA32062"))
adb logcat -d | grep -i "setTestDeviceIds"

6.3 AdManager.gd(AutoLoad)

func _ready() -> void:
    if OS.get_name() != "Android" and OS.get_name() != "iOS":
        return

    # 1) 注册测试设备
    var cfg := RequestConfiguration.new()
    cfg.test_device_ids = [TEST_DEVICE_ID]
    MobileAds.set_request_configuration(cfg)

    # 2) 初始化(异步)
    var listener := OnInitializationCompleteListener.new()
    listener.on_initialization_complete = func(_status: InitializationStatus) -> void:
        _initialized = true
    MobileAds.initialize(listener)

横幅(贴在竖屏底部):

func load_banner() -> void:
    if _banner_view != null:
        _banner_view.destroy()
        _banner_view = null

    var ad_size := AdSize.get_current_orientation_anchored_adaptive_banner_ad_size(AdSize.FULL_WIDTH)
    var view := AdView.new(BANNER_ID, ad_size, AdPosition.Values.BOTTOM)

    view.ad_listener.on_ad_loaded = func() -> void:
        view.show()                      # 加载成功才 show
    view.ad_listener.on_ad_failed_to_load = func(err: LoadAdError) -> void:
        print("横幅失败 code=%d %s" % [err.code, err.message])

    _banner_view = view
    view.load_ad(AdRequest.new())

插页:

func load_interstitial() -> void:
    var cb := InterstitialAdLoadCallback.new()
    cb.on_ad_loaded = func(ad: InterstitialAd) -> void:
        _interstitial = ad
        ad.full_screen_content_callback.on_ad_dismissed_full_screen_content = func() -> void:
            _interstitial.destroy()
            _interstitial = null
            load_interstitial()          # 关闭后自动预加载下一则
    cb.on_ad_failed_to_load = func(err: LoadAdError) -> void:
        print("插页失败 code=%d %s" % [err.code, err.message])
    InterstitialAdLoader.new().load(INTERSTITIAL_ID, AdRequest.new(), cb)

奖励:

func show_rewarded() -> void:
    if _rewarded == null:
        load_rewarded()
        return
    var listener := OnUserEarnedRewardListener.new()
    listener.on_user_earned_reward = func(item: RewardedItem) -> void:
        print("发放奖励 type=%s amount=%d" % [item.type, item.amount])
    _rewarded.show(listener)

6.4 界面布局要点

横幅是 Android 原生 View,叠在 Godot 画面上方,会盖住底部内容。
所以 UI 底部要留白:

root.add_theme_constant_override("margin_bottom", 140)   # 给横幅留位

6.5 时序

MobileAds.initialize 是异步的,别在 _ready() 里立刻发请求:

await get_tree().create_timer(2.5).timeout
AdManager.load_interstitial()
AdManager.load_rewarded()
await get_tree().create_timer(3.0).timeout
AdManager.load_banner()

七、第 5 步:导出 APK

7.1 export_presets.cfg 最小配置

[preset.0]
name="portrait"
platform="Android"
export_path="./AdMobPortrait.apk"

[preset.0.options]
gradle_build/use_gradle_build=true
gradle_build/export_format=0
architectures/arm64-v8a=true
package/unique_name="com.example.admobportrait"
package/signed=true
version/code=1
version/name="1.0"
screen/immersive_mode=true

7.2 ★ 每次导出前先清 *.tmp

中断导出会留下
android/build/res/values-*/godot_project_name_string.xmlNNNN.tmp,
下次构建直接失败:

mergeStandardDebugResources FAILED - The file name must end with .xml
find android/build/res -name "*.tmp" -delete

7.3 导出命令

godot --headless --export-debug "portrait" "C:/path/to/AdMobPortrait.apk"

首次 Gradle 构建约 7~15 分钟(之后有缓存会快很多)。
APK 出现在 build/ 下时就已构建完成,Godot 进程可能还在做收尾。


八、第 6 步:装到手机

⚠ 坑:INSTALL_FAILED_USER_RESTRICTED: Install canceled by user

adb install -r -t app.apk
# → INSTALL_FAILED_USER_RESTRICTED: Install canceled by user

试过 keyevent 224 唤醒、wm dismiss-keyguard、pm install、文件管理器安装,都无效。
真正的原因是 AppOps 权限被关:

adb shell appops set com.android.shell REQUEST_INSTALL_PACKAGES allow
adb install -r -t app.apk
# → Success

在 Git Bash 下记得 export MSYS_NO_PATHCONV=1,否则 /data/local/tmp/...
这类路径会被自动转换。


九、第 7 步:验证广告真的出来了

9.1 抓日志

adb logcat -c                                        # 先清空
adb shell monkey -p com.example.admobportrait -c android.intent.category.LAUNCHER 1
sleep 14
adb logcat -d -v brief | grep -i "poing-godot-admob\|godot   "

9.2 健康日志长这样

[07:23:02] 正在初始化 MobileAds ...
[07:23:03] MobileAds 初始化完成 ✔
[07:23:06] 插页:已发起加载请求 ...
[07:23:06] 奖励:已发起加载请求 ...
[07:23:09] 横幅尺寸:411 x 64 dp
[07:23:09] 横幅:java.lang.Integer 装箱 ✔
D/poing-godot-admob: Safe Area of screen: Rect(0, 104 - 0, 0).
D/Ads: AdRequestServiceImpl: Sending request: .../mads/gma     ← 真的发出请求了
[07:23:11] 横幅:加载成功 ✔ → 自动展示
[07:23:11] 横幅:已展示(impression)
[07:23:11] 插页:加载成功 ✔ 可以展示了
[07:23:11] 奖励:加载成功 ✔ 可以展示了

9.3 自动点按钮

Godot 的按钮是自绘的,uiautomator 定位不到,只能用坐标点:

adb shell wm size            # 确认分辨率,例如 1080x2400
adb shell input tap 540 690  # 点"显示插页广告"

9.4 截图确认

adb exec-out screencap -p > screen.png

底部能看到 Google 测试横幅(「测试广告 / Nice job! This is a 320×50 test ad.」)即为成功。


十、排错速查表

现象 根因 解决
导出报 due to configuration errors: 消息为空 import_etc2_astc 未开 project.godot 加 textures/vram_compression/import_etc2_astc=true
脚本报 AdView / MobileAds not declared 全局类名缓存未生成 跑一次 godot --headless --editor --quit
No project icon specified 缺图标 加 config/icon="res://icon.svg"
mergeStandardDebugResources FAILED ... must end with .xml 上次导出中断留了 *.tmp find android/build/res -name "*.tmp" -delete
INSTALL_FAILED_USER_RESTRICTED AppOps 权限被关 adb shell appops set com.android.shell REQUEST_INSTALL_PACKAGES allow
广告请求 403 play-services-ads 版本停服 补丁 1,升到 Maven latest
Array[String] does not have the same element type Godot 4.6 typed-array bug 补丁 2,改 PackedStringArray
横幅无任何回调、SDK 不发请求 int 装箱成 Long,checkcast Integer 崩溃 补丁 3,_java_int()
插页/奖励一直”未准备好” 没等初始化完成就发请求 初始化回调后再等 2~3 秒
横幅盖住 UI 底部 原生 View 叠在画面上 UI 底部留 140px 空白

十一、换成自己的广告 ID 时要做什么

  1. AdMob 后台创建应用 + 三个广告单元,拿到真实 ID,替换 3 个常量。
  2. 把测试设备注册那段删掉或改成只在 debug 生效,否则线上用户拿不到真实广告。
  3. 改包名 package/unique_name 为你自己的域名反写。
  4. 发布前换成 release 导出(--export-release)并配置正式签名。
  5. 欧盟/英国用户需要接 UMP consent 流程(插件里 PoingGodotAdMobUserMessagingPlatform 已提供)。

附:本项目文件清单

AdMobPortrait/
├── project.godot              竖屏 + AutoLoad + import_etc2_astc
├── export_presets.cfg         preset 名 "portrait"
├── AdManager.gd               广告管理器(AutoLoad)
├── Main.gd / Main.tscn        竖屏演示 UI(纯代码搭建)
├── icon.svg
├── addons/admob/              插件(含 3 处补丁)
│   ├── src/api/AdView.gd                      ← 补丁 3
│   ├── src/api/core/AdRequest.gd              ← 补丁 2
│   ├── src/api/MobileAds.gd                   ← 补丁 2
│   ├── src/api/{Interstitial,Rewarded,RewardedInterstitial}AdLoader.gd  ← 补丁 2
│   └── android/bin/ads/poing_godot_admob_ads.gd   ← 补丁 1
├── android/                   Android 构建模板
└── build/
    ├── admob-portrait.apk     已验证可安装的 debug 包
    └── screen_*.png           真机验证截图

Conda 环境下pip版本冲突不一致问题

核心原理

Conda 环境激活后,终端会优先使用环境内的python和pip。如果pip仍指向系统版本,说明环境内的pip缺失或路径被覆盖,需要修复环境内的pip关联。

以下用ping-pong-web举例子。

解决步骤

1. 确保已激活目标 Conda 环境

首先确认你在正确的环境中操作(终端提示符有ping-pong-web标识):

conda activate ping-pong-web

2. 检查 Conda 环境内的pip是否存在

Conda 环境中默认会安装pip,但可能被误删或未安装。执行以下命令检查环境内的pip路径:

which pip  # Linux/Mac
# 或 Windows: where pip
  • 正常情况:输出应包含conda/envs/ping-pong-web/bin/pip(Linux/Mac)或conda/envs/ping-pong-web/Scripts/pip.exe(Windows),表示使用环境内的pip。
  • 异常情况:输出如/home/bruce/.local/lib/python3.12/site-packages/pip(你的情况),说明使用的是系统或用户目录的pip,而非环境内的。

3. 修复环境内的pip

如果环境内没有pip,或pip关联错误,用conda重新安装环境内的pip:

# 先卸载环境内可能存在的异常pip(如果有)
conda remove --force pip -n ping-pong-web

# 重新在当前环境安装pip(确保已激活环境)
conda install pip

这一步会在ping-pong-web环境中安装与 Python 3.9.25 匹配的pip。

4. 清理用户目录下的全局pip(关键!)

你的pip指向了/home/bruce/.local/lib/python3.12/,这是用户级别的全局安装路径(可能是之前用pip install --user安装的),优先级可能覆盖了 Conda 环境的pip。需要清理:

# 删除用户目录下的pip(注意路径与你的输出对应)
rm -rf /home/bruce/.local/lib/python3.12/site-packages/pip*
rm -rf /home/bruce/.local/bin/pip*

注意:替换路径为你pip --version输出中的路径(确保不要删除系统关键文件)。

2025年流行的Python部署

传统的真机Python+pip部署方式早已被淘汰了。

而venv虚拟部署的方式还有很多人在用,也确实比传统真机部署好很多,但也再被渐渐淘汰。

目前较为流行的一种模式是:Conda+UV的组合方式。

conda:核心是环境管理工具,负责创建隔离的虚拟环境(可包含不同 Python 版本、系统级依赖甚至非 Python 包,如 C 库)。

uv:核心是Python 包管理器,专注于快速安装 / 管理 Python 包(类似 pip,但速度更快、依赖解析更高效),本身不管理环境,而是依赖于当前激活的 Python 环境。

建议在激活 conda 环境后安装 uv,避免全局安装导致的环境混淆。

pip install uv

uv的使用例子:

uv pip install transformers==4.24.0  # 安装指定版本
uv pip uninstall jieba  # 卸载包
uv sync  # 同步依赖(根据 pyproject.toml 或 requirements.txt)

注意事项(避免潜在问题):

1、不混用 conda 和 uv 安装同一 Python 包

例如,不要用 conda install pandas 后再用 uv pip install pandas,可能导致版本冲突(conda 和 pip/uv 管理的包路径虽然一致,但依赖解析逻辑不同)。

  • 优先用 uv 管理纯 Python 包(如 transformers、jieba);
  • 用 conda 管理含系统依赖的包(如 numpy、opencv,conda 会自动安装对应的 C 库)。

2、uv 不处理非 Python 依赖

uv 仅负责 Python 包,若包依赖系统级库(如 libssl、libffi),仍需通过 conda 或系统包管理器(apt)安装:

# 例如安装需要系统库的包,先用 conda 安装依赖 conda install -c conda-forge libsndfile # 安装音频处理的系统库 uv pip install soundfile # 再用 uv 安装依赖该库的 Python 包

3、环境迁移时需同步两者的配置

若要复制 conda 环境,除了用 conda env export,还需同步 uv/pip 管理的包(通过 uv pip freeze > requirements.txt 导出)。

总结

uv 和 conda 是互补工具:conda 负责环境隔离和系统级依赖,uv 负责高效管理 Python 包,在 conda 环境中使用 uv 不仅安全,还能显著提升包安装速度,推荐结合使用。

国内使用建议:

/.config/uv/uv.toml
index-url = “https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple”

另外,uv也是可以直接运行py文件的。如图所示。

探索 Dialogic 2:游戏对话与叙事的得力助手

在游戏开发领域,引人入胜的对话系统和精彩的叙事常常能为游戏增色不少,成为吸引玩家深入体验的关键因素。而 Dialogic 2,正是一款专为游戏开发者打造的强大插件,能助力开发者轻松实现复杂且生动的游戏对话与叙事。

Dialogic 2 基于 Godot 引擎开发,对 Godot 4.2 及以上版本提供良好支持。其核心功能极为丰富,为开发者打开了创意的大门。它的对话系统堪称一绝,允许开发者创建复杂的对话树。无论是分支剧情、条件判断,还是多角色同时参与的对话,都能轻松实现。想象一下,在角色扮演游戏中,玩家的不同选择通过对话分支引发截然不同的剧情走向,这无疑大大增强了游戏的重玩性与趣味性。

Godot下载地址:

https://godotengine.org/download

对于视觉小说类游戏开发,Dialogic 2 更是得心应手。通过简单直观的拖放操作,开发者就能快速搭建起视觉小说场景,灵活管理背景、角色立绘以及对话框等元素,让文字与画面完美融合,构建出引人入胜的故事世界。此外,它还提供了便捷的角色管理功能,开发者可以方便地设定角色的各项属性、状态和行为,使角色在游戏中更加鲜活立体。

值得一提的是,Dialogic 2 内置了自动更新功能。这意味着开发者无需手动操心繁琐的更新事宜,插件会自动保持在最新版本,及时享受新功能与修复的漏洞,极大地提升了开发效率与稳定性。同时,Dialogic 2 采用单元测试确保代码质量,利用 gdUnit4 测试框架,开发者可在本地运行测试,为代码的可靠性保驾护航。

从应用场景来看,Dialogic 2 的适用性十分广泛。在视觉小说游戏开发中,它能快速构建起整个游戏架构,管理对话、角色和场景,使开发者专注于故事创作。在角色扮演游戏里,其丰富的对话系统可以支持多角色互动,创造出丰富多彩的剧情分支,为玩家带来沉浸式体验。冒险游戏通过它管理对话和角色,增强玩家代入感;教育游戏借助其对话与叙事功能,实现互动式学习体验,寓教于乐。

总的来说,Dialogic 2 以其易于使用的特性、强大的功能、自动化更新以及活跃的开源社区支持,成为游戏开发者打造精彩游戏对话与叙事的不二之选。无论你是经验丰富的行业老手,还是初涉游戏开发领域的新手,Dialogic 2 都能为你的游戏开发之旅增添助力,让你的创意通过精彩的对话与叙事完美呈现。

一、安装与激活​

Dialogic 2 要求 Godot 4.2 或更高版本。确认已安装合适版本后,按以下步骤安装插件:​

  1. 前往Dialogic 官方 GitHub 仓库的 Releases 页面,下载所需版本的 Dialogic 2 压缩包。​
  1. 解压下载的压缩包,找到其中的addons文件夹,该文件夹包含了 Dialogic 插件。​
  1. 将addons文件夹移动到你的 Godot 项目文件夹中。​
  1. 打开 Godot 项目,进入项目>项目设置,点击插件标签页。​
  1. 在插件列表中找到 Dialogic,勾选其旁边的启用按钮。​
  1. 重启 Godot 编辑器,至此 Dialogic 2 插件安装并激活完成。​

Dialogic 2插件下载地址:

https://github.com/dialogic-godot/dialogic/releases

二、认识编辑器界面​

成功安装并激活插件后,在 Godot 编辑器顶部会出现一个新的Dialogic标签页(位于2D、3D、脚本和资源库旁边)。点击进入,映入眼帘的是 Dialogic 主界面。界面顶部能看到 Dialogic 的不同编辑器选项;左侧边栏会展示最近使用过的角色和时间线;右上角有几个常用功能按钮,分别是添加时间线、添加角色、参考管理器和播放时间线 。​

三、创建时间线​

时间线用于编排游戏中的对话流程等事件,创建步骤如下:​

  1. 点击右上角的添加时间线按钮。​
  1. 在弹出窗口中,选择要存放时间线的文件夹,并输入文件名。时间线文件将以.dtl格式保存。​
  1. 点击保存后,编辑器右侧会出现事件面板,可从这里往时间线上添加各种事件。若想了解某个事件及其设置详情,右键点击该事件并选择文档即可查看说明。​
  1. 点击右上角的文本编辑器按钮,可切换到文本编辑模式编写时间线内容。关于文本格式时间线的编写规则,可在相关文档中进一步学习。​
  1. 完成时间线编辑后,点击右上角的播放时间线按钮,可测试当前时间线效果。​

四、创建角色​

为游戏创建角色的步骤如下:​

  1. 点击右上角的添加角色按钮。​
  1. 如同时间线操作,需选择保存角色的位置并命名。角色文件通常以.dchr格式保存。​
  1. 在角色编辑器中,可设置角色的各项属性,如名称、立绘(可添加多个不同表情的立绘)、初始状态等。这些设置将决定角色在对话和游戏场景中的呈现效果。​

五、为游戏添加对话​

  1. 在场景中添加一个Dialogic节点。你可通过在场景树中右键点击,选择添加节点,然后在搜索框中输入Dialogic来找到并添加该节点。​
  1. 选中添加的Dialogic节点,在其属性面板中,从下拉菜单里选择之前创建好的时间线。​
  1. 若要在游戏特定时机触发对话,可通过编写 Godot 脚本实现。例如,在某个场景脚本中添加如下代码,当场景准备好时启动名为ExampleDialog的对话:​
​extends Node2D

func _ready():

Dialogic.start('ExampleDialog')

通过以上步骤,你就能利用 Dialogic 2 插件在 Godot 游戏中搭建起基础的对话系统。随着对插件的深入使用,你还可探索其更多高级功能,如条件判断、多角色同时对话、对话分支剧情等,从而打造出更丰富精彩的游戏体验。

用树莓派Pico和镍铬丝制作电烙铁

1. 硬件准备

  • 树莓派Pico: 作为控制核心。
  • 镍铬丝: 作为加热元件。
  • MOSFET(如IRF520): 用于控制镍铬丝的电流。
  • 电阻(如220Ω): 用于限制Pico GPIO引脚的电流。
  • 电源: 提供足够的电流和电压。
  • 导线: 耐高温导线。
  • 烙铁头(可选): 可以将铜丝弯曲成烙铁头形状。
  • 隔热材料: 用于包裹镍铬丝,防止烫伤。

2. 硬件连接

  • 将镍铬丝连接到MOSFET的漏极(Drain)。
  • 将MOSFET的源极(Source)连接到GND。
  • 将树莓派Pico的GPIO引脚(例如GPIO15)通过电阻连接到MOSFET的栅极(Gate)。
  • 连接电源到镍铬丝和MOSFET。
  • 将隔热材料包裹在镍铬丝周围。

3. MicroPython编程

  • Thonny IDE: 推荐使用Thonny IDE,方便编写和上传MicroPython代码。
  • GPIO控制: 使用MicroPython的machine库,控制GPIO引脚输出高低电平,控制MOSFET的导通和截止。

示例代码:

from machine import Pin
import time

fire_pin = Pin(15, Pin.OUT)  # 点火引脚,连接到MOSFET栅极

def fire():
    fire_pin.value(1)  # 开启加热
    print("Heating...")

def stop_fire():
    fire_pin.value(0) # 关闭加热
    print("Stop Heating.")

while True:
    input_value = input("Enter '1' to heat, '0' to stop: ")
    if input_value == '1':
        fire()
    elif input_value == '0':
        stop_fire()
    else:
        print("Invalid input.")

4. 安全注意事项

  • 高温风险: 镍铬丝工作时会产生高温,务必小心操作,防止烫伤。
  • 电路安全: 大电流电路存在风险,务必小心操作。
  • 防火措施: 准备灭火器材,防止火灾发生。
  • 测试验证: 在实际焊接前,进行充分的测试验证。
  • 警告:
    • 电烙铁具有一定的危险性,请在安全的环境下操作。
    • 制作和使用电烙铁时,务必遵守相关安全规范。
    • 如果对于电子电路不是十分了解,请勿自行制作。请寻找专业人员的帮助。

5. 补充说明

  • 根据镍铬丝的电阻和电源电压,选择合适的MOSFET。
  • 可以添加温度传感器和PID控制算法,实现温度控制功能。
  • 关于烙铁头的制作:
    • 可以找一段粗的铜丝,然后用锤子敲打铜丝的一端,敲打成扁平状,然后打磨成自己需要的烙铁头形状。
    • 铜具有非常优秀的导热性,所以铜是制作烙铁头的优秀材料。