diff --git a/.workbuddy-ai/memory/2026-09-21.md b/.workbuddy-ai/memory/2026-09-21.md deleted file mode 100644 index 28d5069..0000000 --- a/.workbuddy-ai/memory/2026-09-21.md +++ /dev/null @@ -1,70 +0,0 @@ -# 2026-09-21 - -## 程序化卡通天空(world/sky/) - -新增 `res://world/sky/cartoon_sky.gdshader` + `cartoon_sky.tres`(Sky 资源,内含调好的 ShaderMaterial), -并让 `world/main.tscn` 的 WorldEnvironment 改用它;同时把 `Sun` 的 light_color 调成暖白 -(1.0, 0.97, 0.90),项目设置开了 `rendering/anti_aliasing/quality/use_debanding`。 - -渲染顺序:渐变天空 → 地面半球 → 星空 → 太阳 → 云 → 地平线雾霭。 -全部由噪声现场生成,无贴图。参数按 Gradient / Sun / Stars / Clouds / Haze 分组暴露在 Inspector。 - -### Godot shader 踩坑(重要,下次直接避开) - -1. **`mat2(a,b,c,d)` 不合法**。Godot 着色器语言只接受列向量构造:`mat2(vec2, vec2)`。 - 同理 mat3 要用三个 vec3。报错形式是 - `Invalid arguments for the built-in function: "mat2(float,float,float,float)"`。 -2. **天空着色器的编译错误不在 `logs_read(source="editor")` 里**,除非触发一次编译。 - 可靠的取错方式:改完 → `filesystem_manage(op="scan")` → `project_run` → - `logs_read(source="editor", include_details=true)`。game 日志只给一行 - `version_get_shader: Parameter "version" is null`,没用。 -3. **`smoothstep(edge0, edge1, x)` 不要写 edge0 > edge1**,改成 `1.0 - smoothstep(...)`。 -4. 变量重名(同一函数内二次声明)会报 `Redefinition of 'x'`,直接让整个 shader 编译失败。 -5. shader 编译失败时天空渲染成**纯黑**,不是品红 —— 别以为是资源没挂上。 -6. **编辑器里的 Shader 面板会缓存旧的编译报错**。外部改完 .gdshader + scan 之后, - 面板可能仍显示上一次失败的 `mat2(float,float,float,float)` 之类信息, - 而 Debugger → Errors 已经是空的。判定方法:看 `logs_read(source="editor")` 是否为空, - 再 `project_run` 一次看天空是否正常。**不要照着这条过期报错去改代码。** - 注意:如果 Shader 标签页里留着一份旧的未保存副本,从面板里保存会把我改好的文件覆盖回去。 - -### 云的形态(花了最多时间) - -- **别用「水平云平面」投影 `uv = dir.xz / dir.y`**:低仰角处透视压缩成 10:1, - 云被拉成细条;若再对 dir.y 做硬 clamp,被钉死的距离会让噪声只随方位角变化, - 直接拉出**竖条拖影**。 -- **也别用方位角等距投影**(`uv = normalize(dir.xz) * acos(dir.y)`):天顶是极点, - 云会全部朝圆心收拢,抬头就看得见。 -- **正解是球极投影 `uv = dir.xz / (1.0 + dir.y)`**:保角 → 形状不拉伸; - 天顶只是圆盘圆心而非收缩极点;方位角天然无缝;角尺寸从地平线到天顶只放大 2 倍, - 接近真实透视。这个投影配 2D Perlin 出图最好。 -- **噪声用 Perlin 梯度噪声,不要 value noise**:value noise 在格点处梯度为零, - 阈值化后会切出一块块多边形的棱角("晶体"感)。 -- **三维 Perlin 在这台机器上不行**:sin 系哈希(`fract(sin(dot(p,k))*43758)`)在大坐标 - (fbm 第 3~4 个倍频时 dot 可达 1e4)下掉精度,高频倍频退化成纯噪声 → 云变成细丝。 - Hoskins 的 fract 系哈希精度安全,但出图仍偏块状。最终放弃 3D,回到 2D Perlin。 -- **阈值要压在 fbm 分布均值之上**。阈值贴着均值时等值线本身就很纠结, - 云会变成一张"蛛网";抬到 +0.5σ 以上才是干净的团块。 - -### 当前调好的参数 - -coverage 0.33 / scale 5.0 / edge 0.16 / warp 0.30 / horizon_fade 0.18 / speed 0.01, -云影色 (0.45,0.62,0.88),边缘辉光 (1,0.93,0.76)。 - -## Sun 阴影(当天稍后) - -`/Main/Sun` 开了 `shadow_enabled = true`;同时把 `directional_shadow_max_distance` -从默认 100 收到 40(场景只有 40×40,收窄后阴影贴图分辨率集中到实际范围,边缘干净很多), -并开 `directional_shadow_blend_splits` 消除 split 之间的接缝。 - -### 又一个 Godot MCP 坑 - -`node_set_property` 写 **bool** 属性会失败:`true` 和 `1` 都被序列化成 String, -报 `WRONG_TYPE: Cannot write String to a bool property`。 -**bool 属性只能直接改 .tscn,再 `scene_open(force_reload=true)`。** -(Color / Vector3 用 dict 传是正常的,`light_color` 就是这么改的。) - -## 待办 / 可选后续 - -- 地面还是灰白色 (0.55,0.58,0.62),被天空的蓝色环境光染成了淡紫。 - 换成草绿之类的固有色会协调很多 —— 这是目前画面里最突兀的一处。 -- `star_amount` 默认 0,太阳落到地平线以下会自动淡入星空,还没实测过夜景。 diff --git a/.workbuddy-ai/memory/2026-09-22.md b/.workbuddy-ai/memory/2026-09-22.md deleted file mode 100644 index 20de1e8..0000000 --- a/.workbuddy-ai/memory/2026-09-22.md +++ /dev/null @@ -1,49 +0,0 @@ -# 2026-09-22 - -## 修正云层的透视(world/sky/cartoon_sky.gdshader) - -用户指出云的透视不对:球极投影虽然保角、无极点、无缝,但**代价是完全没有空气透视** —— -云从地平线到天顶一样大,看着像一块贴在天上的平顶。这一条是保角投影的固有性质, -不是参数能救的,必须换投影。 - -### 三种投影的取舍(结论:用软化分母的平面投影) - -| 投影 | 半径 | 天顶 | 透视 | 结论 | -|---|---|---|---|---| -| 平面 `dir.xz/dir.y` | 无上限 | 奇点 | 正确(4~6 倍) | 低仰角频率爆炸 → 摩尔纹/地毯 | -| 球极 `dir.xz/(1+dir.y)` | ≤1 | 圆心(安全) | **无** | 平顶感 | -| 软化平面 `dir.xz/(dir.y+k)` | ≤1/k | 安全 | 2~3 倍 | **采用** | - -`k`(uniform `cloud_plane_offset`,默认 0.6)是唯一的调节量: -- 半径上限 `1/k` → 噪声频率有界,不会在地平线处爆炸 -- 近天顶处 `p ≈ (π/2−e)/(1+k)`,是局部均匀缩放,**不是奇点**,云不会朝一点收拢 -- 角尺寸比 地平线:天顶 = `(1+k)/k²`,k=0.6 时约 4.4;云尺寸从 45° 的 17° - 平滑降到 10° 的 7.8° -- 方位角方向天然无缝 -- 副作用:云的宽高比恒为 1.4~1.7(略扁),对卡通云反而是好事 - -### 配套的两个抑制 - -1. **距离细节衰减**:`fbm(p, detail)` 里 `amp *= 0.5 * detail`,`detail = mix(1.0, 0.35, far)`。 - 远处云的屏幕频率更高,不砍高频倍频会闪烁。 -2. **距离云量抑制**:`thresh += far * 0.10`。低仰角处每单位立体角的云数量更多, - 不抑制就糊成一片「地毯」。`far = 1.0 - smoothstep(0.06, 0.45, dir.y)`。 - -最终取值:coverage 0.55 / scale 4.0 / plane_offset 0.60 / horizon_fade 0.08 / edge 0.16。 - -## 重要:.tres 里的 shader_parameter 会被 Godot 清掉 - -`cartoon_sky.tres` 被 Godot 重存过一次,`shader_parameter/*` 全部丢失(同时补上了 uid), -天空悄悄退回着色器默认值 —— 而且不会报任何错,只是画面跑偏。 - -**对策:把调好的美术取值直接写成 uniform 的默认值**,`.tres` 只保留对 shader 的引用。 -这样即使参数被清掉,画面也不会变。Inspector 里未覆盖的参数本来就会显示着色器默认值, -所以用起来没区别。 - -顺带:`.tres` 现在被 Godot 补上了 `uid://bi632suyifms5`,`main.tscn` 里仍按 path 引用,能用。 - -## 待办 / 可选后续 - -- 地面还是灰白色 (0.55,0.58,0.62),被天空的蓝色环境光染成了淡紫;另外天空下半球的 - `ground_color` (0.29,0.33,0.38) 在地面边缘外露出一条灰带。两处一起调会协调很多。 -- `star_amount` 默认 0,太阳落到地平线以下会自动淡入星空,还没实测过夜景。 diff --git a/.workbuddy/_proc.txt b/.workbuddy/_proc.txt deleted file mode 100644 index e0ef87b..0000000 --- a/.workbuddy/_proc.txt +++ /dev/null @@ -1,4 +0,0 @@ -pid=10416 name=Godot_v4.7.2-stable_mono_win64 title='' responding=True -pid=12060 name=Godot_v4.7.2-stable_mono_win64 title='main.tscn - agame - Godot Engine' responding=True -pid=26164 name=godot-ai title='' responding=True -pid=27664 name=godot-ai title='' responding=True diff --git a/.workbuddy/memory/2026-09-21.md b/.workbuddy/memory/2026-09-21.md deleted file mode 100644 index bf9f061..0000000 --- a/.workbuddy/memory/2026-09-21.md +++ /dev/null @@ -1,43 +0,0 @@ -# 2026-09-21 - -## 接入 godot-ai MCP(已完成并验证) - -- 把 Claude Desktop 的 `godot-ai` MCP 迁入 WorkBuddy 配置 `C:\Users\DHXY\.workbuddy\mcp.json`,与原有 `unityMCP` 并存。 -- 启动方式:`uvx.exe` + `--isolated --no-config ... --from godot-ai==4.1.0 godot-ai attach --port 8001 --ws-port 8002`。 - - 去掉了原配置中 `pythonw.exe` 包一层隐藏控制台的写法,直接走 uvx stdio。 -- 环境核实:`uvx.exe` 存在;Godot v4.7.2 mono 运行中,8001/8002 均 LISTEN;`addons/godot_ai/plugin.cfg` 版本 4.1.0 与服务端 pin 版本一致。 -- **已信任并实测通过**:`project_manage(op="settings_get", key="application/config/name")` → `agame`。 - -## 经验:MCP 信任入口位置 - -- 「自定义连接器 / 信任 MCP」不在侧边栏连接器列表里,而在 **「连接器」页顶栏 →「MCP 服务管理」弹窗 →「我的 MCP」列表**,每个服务右侧是启用开关(绿色圆点=已连接)。 -- 相关 i18n key(从 app.asar 反查得到):`connectorPanel.customConnector`=自定义连接器、`unifiedMarket.customConnector`=自定义连接器(市场页顶部「+」下拉里)。 - -## 本机环境补充(重要) - -- `.workbuddy/memory` 下的文件在本会话中被外部清理过一次,写入后需复核是否仍在。 -- Bash 工具完全不可用(`mkdir`/`dirname` 都不存在),PowerShell 可用但需把输出写文件再 Read;Glob/Grep 对 `.workbuddy` 这类点目录不可靠,用 Read 直接读或 PowerShell 列目录。 -- PowerShell 里 `Add-Type` 被安全策略拦截,无法用 .NET API 激活窗口。 - -## 新建:第三人称控制器(胶囊体占位) - -- 文件:`res://player/player.gd`、`res://player/player.tscn`、`res://world/main.tscn`(测试场地,已设为 main scene)。 -- 结构:Player(CharacterBody3D,不旋转) / Collision + Body(Node3D,视觉层朝移动方向转) / Mesh + CameraRig / SpringArm / Camera。 - - **关键教训**:相机臂不要挂在会旋转的本体下,否则按方向键会产生「相机跟着转」的螺旋轨迹(实测偏航 90°、直行无横向位移)。 -- 输入动作(已写入 project.godot):move_forward/back/left/right(WASD+方向键)、jump(Space)、sprint(Shift)。 -- 参数:走 5.0 / 跑 8.5 m/s,加速度 45(地面)/12(空中),跳跃初速 5.0(实测最高点 1.318 m)。 - -## 本机/工程改造记录 - -- `autoload/steamworks.gd`:Steam 初始化失败时原来直接 `get_tree().quit()`,导致没开 Steam 客户端时游戏秒退;已加 `OS.has_feature("editor")` 豁免(编辑器内返回不退出,发布版行为不变)。 - -## godot-ai MCP 使用要点(踩坑记录) - -1. **路径是相对「当前编辑场景根」**,且要带根节点名,如 `/Player/CameraRig/SpringArm`;`parent_path: ""` 表示当前场景根。切场景后所有路径的含义会变,写操作前先确认 `editor_state.current_scene`。 -2. **`is_action_just_pressed()` 在 `_physics_process` 里对调试器注入的输入无效**(注入发生在渲染帧,物理帧号已 +1)。要么用 `_unhandled_input` 收事件 + 输入缓冲,要么只能读 `is_action_pressed()`。 -3. `game_eval` 里 `var x := Engine.get_main_loop().current_scene` 会编译不过(类型推断),要 `var tree := Engine.get_main_loop() as SceneTree` 并且给节点变量显式类型。 -4. `game_eval` 里的语法错误会把游戏卡进调试器断点(`game_status.status == "break"`),此后工具全部失效,必须 `project_manage(op="stop")` 后重启。 -5. 布尔属性写入会报 `WRONG_TYPE: Cannot write String to a bool property`(`Camera3D.current` 试过),改用其他方式或接受默认行为(只有一台相机时 Godot 会自动启用)。 -6. `SpringArm3D` 只在运行时摆放子节点;编辑器里预览要在场景里把相机 position.z 写成 spring_length 的值(已写入 player.tscn = 4.0)。 -7. 验证玩法用 `game_manage(op="input_sequence")`;涉及 `just_pressed` 的场景改用 `game_eval` + `Input.parse_input_event` + `await tree.physics_frame` 循环采样。 -