From 074e0ede371cd30d71f538e1522b8bd6599d529f Mon Sep 17 00:00:00 2001 From: BlueRose <378100977@qq.com> Date: Wed, 27 May 2026 20:57:53 +0800 Subject: [PATCH] vault backup: 2026-05-27 20:57:53 --- .../various-complements/histories.json | 2 +- .../UnrealEngine Hardness Game Development.md | 79 +++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) diff --git a/.obsidian/plugins/various-complements/histories.json b/.obsidian/plugins/various-complements/histories.json index d0f4633..9fcdbd6 100644 --- a/.obsidian/plugins/various-complements/histories.json +++ b/.obsidian/plugins/various-complements/histories.json @@ -1 +1 @@ -{"GIt&SVN简报":{"GIt&SVN简报":{"internalLink":{"count":1,"lastUpdated":1776661549625}}},"redoc":{"redoc":{"currentFile":{"count":1,"lastUpdated":1776854054282}}},"的访问权限":{"的访问权限":{"currentFile":{"count":1,"lastUpdated":1776939597742}}},"SDK\\bin\\amd64\\msdia140.dll":{"SDK\\bin\\amd64\\msdia140.dll":{"currentFile":{"count":1,"lastUpdated":1777906125383}}},"Skill":{"Skill":{"currentFile":{"count":1,"lastUpdated":1777952506355}}},"Pipeline为是否进行自动流程,即":{"Pipeline为是否进行自动流程,即":{"currentFile":{"count":1,"lastUpdated":1779184298552}}}} \ No newline at end of file +{"SDK\\bin\\amd64\\msdia140.dll":{"SDK\\bin\\amd64\\msdia140.dll":{"currentFile":{"count":1,"lastUpdated":1777906125383}}},"Skill":{"Skill":{"currentFile":{"count":1,"lastUpdated":1777952506355}}},"Pipeline为是否进行自动流程,即":{"Pipeline为是否进行自动流程,即":{"currentFile":{"count":1,"lastUpdated":1779184298552}}},"时,才允许对该特定文件使用直接读取命令。":{"时,才允许对该特定文件使用直接读取命令。":{"currentFile":{"count":1,"lastUpdated":1779884864378}}}} \ No newline at end of file diff --git a/07-Other/AI/AI Agent/UnrealEngine/UnrealEngine Hardness Game Development.md b/07-Other/AI/AI Agent/UnrealEngine/UnrealEngine Hardness Game Development.md index a167b0e..c5e4329 100644 --- a/07-Other/AI/AI Agent/UnrealEngine/UnrealEngine Hardness Game Development.md +++ b/07-Other/AI/AI Agent/UnrealEngine/UnrealEngine Hardness Game Development.md @@ -68,6 +68,85 @@ # 知识图谱 +为了**杜绝 CC 盲目调用 `cat`、`grep` 读取原始大文件**,你必须在项目根目录下创建 `.claude_rules` 或 `.claudecode.json`,强制注入以下系统指令(System Prompt): +```markdown +# Claude Code 行为准则 - 虚幻引擎双栈项目 +## 1. 核心原则:图谱优先 (Graph-First Execution) +- 严禁直接使用 `cat`、`view_file`、`grep` 或 `find` 作为你探索代码库、规划功能或调试 Bug 的第一步。 +- 面对任何任务,你必须**首先**调用 `gitnexus-project` 或 `gitnexus-ue-engine` 获取依赖关系、符号定义与调用拓扑。 +- 只有在你通过图谱精准锁定了需要修改或深入阅读的“手术切片(Code Slice)”时,才允许对该特定文件使用直接读取命令。 + +## 2. 结合 Graphify 宏观地图 +- 优先读取项目根目录下的 `graphify` 摘要信息(`graph.html` 对应的结构或本地生成的报告),理解模块耦合和设计意图,再深入 GitNexus 的微观 AST。 + +## 3. 引擎与项目上下文隔离 +- 当查询虚幻引擎原生 API(如 `AActor`, `UObject`, `FRHICommandList`)或探索引擎底层实现时,必须唯一调用 `gitnexus-ue-engine`。 +- 当查询项目业务逻辑、游戏模式、数据资产或 Puerts 脚本时,必须唯一调用 `gitnexus-project`。 + +## 4. Puerts (TS) 与 C++ 双栈跳转链路 +- 本项目采用 Puerts 架构。TypeScript 中的 `UE.X` 映射到 C++ 中的 `AX` 或 `UX`。 +- 如果你在处理 TS 逻辑时遇到架构瓶颈,请通过 `gitnexus-project` 查询 `Typing/ue/index.d.ts` 中对应的符号。利用该声明文件作为桥梁,切换到 C++ 图谱节点进行互查。 +``` + +## GitNexus +针对引擎与项目的gitnexus图谱: +```json +{ + "mcpServers": { + "gitnexus-project": { + "command": "node", + "args": ["/path/to/gitnexus/cli.js", "serve", "--cwd", "/path/to/YourUEProject"] + }, + "gitnexus-ue-engine": { + "command": "node", + "args": ["/path/to/gitnexus/cli.js", "serve", "--cwd", "/path/to/UnrealEngine/Engine/Source"] + } + } +} +``` +### C++ 与 Puerts (TypeScript) 双栈桥接 +Puerts 通过生成器会将 UE 的 C++ 类反射为 TypeScript 声明文件(通常位于 `YourProject/Typing/ue/index.d.ts`)。 +- **图谱配置**:确保 `gitnexus-project` 的配置文件(`.gitnexus.json`)将 `Typing/` 目录和你的 TS 脚本目录(如 `TS/` 或 `Content/JavaScript/`)同时纳入索引。 +- **作用机制**:借由 Tree-sitter-typescript,GitNexus 会将 TS 中的 `UE.AActor` 关系链导向 `index.d.ts`,让 CC 从 TypeScript 跳跃回 C++ 原生符号。 + +## Graphify +在你的虚幻项目根目录下,开启 Graphify 的守护进程: +```bash +# 启动 Graphify 实时监听项目文件、设计文档和编译输出元数据 +graphify . --watch --exclude "Binaries/,DerivedDataCache/,Intermediate/" +``` + +这将持续更新本地的知识拓扑,特别是当你修改了 Puerts 的 TS 逻辑或新增了 Markdown 规划文档时,Graphify 会自动建立反向链接(Backlinks)。 + +#### 编写胶水脚本让 CC 读取 Graphify +由于 Graphify 会生成结构化的持久化数据,你可以写一个简单的 CLI 胶水工具(或作为 CC 可以运行的命令)让 CC 能快捷检索 Graphify 的宏观节点: +```bash +# 创建一个名为 query_macro.sh 的工具供 CC 调用 +# 用法: ./query_macro.sh "Puerts 战斗系统设计" +cat .graphify/nodes.json | grep -i "$1" +``` + +### 实施计划 +#### 阶段 1:功能规划期 (Planning) +- **任务**:你想在 Puerts 脚本中新增一个技能释放组件,并调用 C++ 写的底层属性系统(AttributeSet)。 +- **CC 的自动决策**: + 1. CC 遵循规则,不盲读文件。首先调用 Graphify 相关的宏观图谱,查看现有的 `TS/Skills/` 目录下各模块的耦合度。 + 2. 调用 `gitnexus-project` 检索 C++ 属性系统的基类定义,获取 `UAttributeSet` 的继承拓扑。 + 3. **结果**:CC 在没有加载一行具体 C++ 实现代码的前提下,完成了方案规划,Token 消耗极低。 + +#### 阶段 2:编写代码期 (Coding) +- **任务**:在 TS 中实现具体的绑定逻辑,并调用引擎的定时器 `FTimerManager`。 +- **CC 的自动决策**: + 1. CC 调用 `gitnexus-ue-engine`,查询 `GetWorld()->GetTimerManager().SetTimer(...)` 的精准函数签名与参数定义(避免盲猜宏和重载)。 + 2. CC 检索 `Typing/ue/index.d.ts`,确保 Puerts 生成的 `UE.FTimerManager` 包含了正确的映射。 + 3. **结果**:CC 写出的 TypeScript 代码精准无误,甚至连复杂的 C++ 反射导出边界都完全符合规范。 + +#### 阶段 3:调试 Bug 期 (Debugging) +- **任务**:游戏在调用某个 TS 导出的 C++ 接口时发生了崩溃(Crash)或逻辑死锁。 +- **CC 的自动决策**: + 1. CC 拿到调用栈(Callstack)后,直接将崩溃符号输入 `gitnexus-project`。 + 2. GitNexus 逆向追踪该符号的调用链(Caller/Callee),直接指出:“该 C++ 接口被 3 个 TS 脚本在 `OnPostInit` 生命周期中并行调用,可能导致了竞态条件。” + 3. **结果**:无需人工为其复制几千行的生命周期管理代码,CC 通过图谱边(Edges)直接抓住了引发 Bug 的核心链路。 # Debug ## LLDB