title: Sect Management作品 · 技术架构总纲 version: v1.0 date: 2026-09-16 status: ⚠️ 引擎章节已过时(见下方横幅)——待重写为 Web 版
Sect Management作品 · 技术架构总纲
## ⚠️ 架构已迁移:本文档部分章节过时(2026-09-17 标注) 项目已放弃 Godot PC 端,改为 Python 后端 + three.js 前端 的 Web 版。 因此本文档以下内容不再适用: - 第一章「项目定位」的引擎/平台/语言 → 现为 Python 3.13 + three.js 0.186,Web 端 - 第一章 §1.1「为什么从 Unity 改到 Godot 4」 → 历史决策记录,结论已被推翻 - 第四章 §4.2「Unity → Godot 概念对照」 → 术语已换为 three.js 体系 - 第六「作品工程架构(game/)」→ PC 端工程已归档至_archive/godot_pc/仍然有效:第三「目录约定」、第五「资产标准」(GLB 格式、面数预算、色板、命名规范全都在用)、 第七「验证策略」、第八「开发阶段」。 📌 当前架构的唯一真相源: -.workbuddy/memory/MEMORY.md(Web 版架构约定) -_archive/godot_pc/README.md(PC 端 → Web 版逐文件移植对应表) - 代码本身:web/backend/gamenet/+web/frontend/src/待办:将本档重写为 Web 版技术宪法。
本文档是项目的技术宪法。所有子系统(作品本体、模型生产工具、美术资源生产工具)的目录约定、技术选型、接口规范以本文为准。 既有三份资产方案文档(3D资产生产体系-总体建设方案.md 等)中与本文冲突的部分,以本文为准——因其假设的引擎为 Unity,而本项目已改为 Godot 4。
一、项目定位
| 维度 | 设定 |
|---|---|
| 引擎 | Godot 4.7.2(绿色免安装版,置于 vendor/godot/) |
| 平台 | PC 端,窗口化运行 |
| 美术风格 | Q 版低模,硬边平面着色,参照《部落冲突》造型语言 |
| 玩法 | Sect Management + 挂机 + SLG |
| 语言 | GDScript(不引入 C#/.NET,保持工程轻量) |
| 资产格式 | glTF 2.0 / GLB(Godot 原生导入,替代既有方案的 FBX 路线) |
1.1 为什么从 Unity 改到 Godot 4
| 理由 | 说明 |
|---|---|
| 环境可行性 | 本机无 Unity、无 Blender;Godot 为绿色版,解压即用,无需激活与账号 |
| 资产格式 | Godot 原生吃 GLB,省掉"GLB → Blender → FBX"的中转,工具链少一跳 |
| 顶点色 | glTF 的 COLOR_0 语义被 Godot 原生支持,顶点色路线落地成本更低 |
| 可命令行验证 | godot --headless 可在无 GUI 环境下做工程导入与脚本语法验证 |
| 授权与体积 | MIT 授权、引擎本体约 86MB,无运行时抽成 |
代价:3D 经营类生态不如 Unity 丰富;无成熟场景编辑器工作流——但本作品的地图与门派是程序化随机生成的,本来就不需要手工摆场景,这个代价实际不成立。
二、双线架构
整个项目切成两条互不阻塞的线,以 GLB 文件为接口。
┌─────────────────────────── 线 B · 工具链 ───────────────────────────┐
│ │
│ model-forge asset-forge │
│ (程序化建模工具) (美术资源生产工具) │
│ Python → GLB Vue3 + FastAPI │
│ │ │ │
│ │ 产出 GLB │ 管理台账 / 提示词 / 管线 / 预览 │
│ ▼ ▼ │
│ out/*.glb ──────────────────► 资产库 │
│ │
└──────────────────────────────┬──────────────────────────────────────┘
│ GLB 文件(唯一接口)
▼
┌─────────────────────────── 线 A · 作品本体 ─────────────────────────┐
│ │
│ game/ (Godot 4 工程) │
│ ├── 随机世界生成 │
│ ├── Sect Management(建设 / 生产 / 招募 / 研究 / 打造) │
│ ├── 人员境界成长(菜鸟 → 武圣,11 境 × 5 级) │
│ ├── 大地图势力(门派 / 山匪 / 官府 / 城镇) │
│ ├── 任务系统(镖局 / 缉拿 / 内务) │
│ ├── 战斗结算与战报 │
│ └── AI 势力成长与争霸 │
│ │
└─────────────────────────────────────────────────────────────────────┘
接口设计原则:线 A 对线 B 的依赖只有文件。作品工程只认 game/assets/models/ 下的 GLB,不关心它是程序化生成的、AI 生成的、还是从 Poly Pizza 下载的。这样任何一环的技术迭代都不会波及另一环。
三、目录约定
D:\3d-game\
├── docs\ # 全部Design Docs
│ ├── 作品设计总纲.md # GDD(策划案)
│ ├── 技术架构总纲.md # 本文档
│ ├── 技术架构-Godot工程.md # Godot 工程实现细则
│ └── 技术架构-美术资源工具.md # Asset Forge 实现细则
├── game\ # ★ 作品本体(Godot 4 工程)
│ ├── project.godot
│ ├── autoload\ # 全局单例
│ ├── scripts\ # GDScript 源码
│ ├── scenes\ # .tscn 场景
│ ├── data\ # JSON 数值配置(与代码分离)
│ └── assets\
│ ├── models\ # ← 从 model-forge 同步过来的 GLB
│ └── materials\ # 共享顶点色材质
├── model-forge\ # ★ 模型生产工具(程序化建模)
│ ├── model_forge\
│ ├── preview\ # Three.js 预览页
│ └── out\ # 产出的 GLB
├── asset-forge\ # ★ 美术资源生产工具
│ ├── backend\ # FastAPI
│ └── frontend\ # Vue 3 + TS
├── vendor\ # 第三方依赖(Godot 引擎等)
├── blender_unity_prep.py # 既有规整脚本(保留,备用)
└── *.md # 既有方案文档(保留,作为历史参照)
同步机制:model-forge/out/ → game/assets/models/ 由 tools/sync_assets.py 完成(增量复制 + 命名规范校验)。
四、Tech stack决策
| 模块 | 选型 | 理由 |
|---|---|---|
| 作品引擎 | Godot 4.7.2 | 见 1.1 |
| 作品逻辑 | GDScript | 与引擎贴合度最高,热重载快,无需编译 |
| 作品数值 | JSON 外置(game/data/) | 数值调整不碰代码;也便于工具链读取同一份配置 |
| 模型生产 | Python 3.13 + numpy | 程序化建模,纯代码可控,零外部依赖 |
| 3D 格式 | 自研 glTF 2.0 导出器 | 避免 trimesh/scipy 的重依赖;格式简单且完全可控 |
| 工具后端 | Python 3.13 + FastAPI + SQLite | 轻量、自带文档(OpenAPI)、与模型工具同语言 |
| 工具前端 | Vue 3 + Vite + TypeScript + Element Plus | 老大指定 Vue;Element Plus 组件完备 |
| 工具预览 | Three.js | 浏览器内直接看 GLB,无需装任何 3D 软件 |
| 通信 | REST + JSON | 本地单机工具,不需要 WebSocket 的复杂度 |
4.1 已废弃的技术选型(不要用)
| 废弃项 | 原方案 | 现方案 | 原因 |
|---|---|---|---|
| FBX | Blender 导出 FBX 给 Unity | GLB 直接给 Godot | Godot 原生支持 glTF,FBX 需插件且易出缩放问题 |
| Blender 规整 | blender_unity_prep.py | 程序化建模直接产出合规资产 | 本机无 Blender;程序化生成本身就能控制面数与尺寸,不需要事后规整 |
| Unity 术语 | MeshInstance / URP / Static Batching | Godot 对应概念 | 见下表 |
| MCP 3D 生成 | Hyper3D MCP | 暂缓(程序化建模先顶上) | 需订阅与 API Key,当前不阻塞 |
4.2 Unity → Godot 概念对照(避免用错术语)
| Unity | Godot 4 |
|---|---|
| GameObject | Node |
| Prefab | PackedScene (.tscn) |
| MonoBehaviour | GDScript (extends Node) |
| MeshRenderer / MeshFilter | MeshInstance3D |
| Material | Material / StandardMaterial3D |
| 静态合批 / Static Batching | 自动批处理(Vulkan 渲染器)/ MultiMesh |
| ScriptableObject | Resource(自定义 .tres) |
| Coroutine | await / Timer |
| Script Execution Order | Autoload 顺序 + process_priority |
| Frame Debugger | 调试器 → 监视器 → 绘制调用 |
五、资产标准(Godot 版)
源自既有方案第八章,但格式与材质落地方式已按 Godot 改写。
5.1 面数预算(三角形)
| 角色(role) | 前缀 | 面数预算 | 默认尺寸 | 说明 |
|---|---|---|---|---|
building | bld_ | 2000 | 6.0 m | 门派建筑,Q 版刻意压矮 |
character | chr_ | 2500 | 1.8 m | 角色,需绑骨,直立 A-Pose |
prop | prp_ | 400 | 1.5 m | 小道具 |
decor | dec_ | 600 | 1.5 m | 装饰摆件 |
envtile | env_ | 2000 | 1.0 m(边长) | 地块,1 米网格便于拼接 |
1 Godot unit = 1 米。
5.2 材质路线:统一顶点色 + 顶点分裂(已定)
| 项 | 做法 |
|---|---|
| 颜色来源 | 16 色色板(见 5.3),面级着色 |
| 交付形态 | 无贴图 + 顶点色(COLOR_0)+ 单一共享材质 |
| 硬边效果 | 顶点分裂——每个三角形独立三个顶点,法线为面法线。天然平坦着色,不依赖着色器设置 |
| 材质 | Godot 侧全局 1 个 StandardMaterial3D:vertex_color_use_as_albedo = true、albedo_color = white、关闭镜面 |
| 收益 | 可合批(Draw Call 大幅下降)、零贴图内存、色板一致性强制成立 |
5.3 16 色色板(menpai_v1)
以既有方案 6 色为核心扩展,具体色值由 model-forge/model_forge/palette.py 定义并与 asset-forge/backend/config/palette.json 保持单一数据源(以 Python 侧为准,工具侧读取同一份 JSON)。
5.4 命名规范(强制)
<类型前缀>_<资产名>_<序号>.glb
示例:bld_shanmen_01.glb、chr_zhangmen_01.glb、dec_denglong_01.glb、env_caodi_01.glb
命名是自动推断资产类型的唯一依据,作品侧同步脚本据此校验。
5.5 其他硬约束
| 项 | 限制 |
|---|---|
| 单 Mesh 顶点数 | ≤ 65535 |
| 单角色骨骼 | ≤ 30 根 |
| 地块网格 | 1.0 m × 1.0 m,XZ 平面 |
| 角色姿态 | 直立 A-Pose(为后续绑骨预留) |
六、作品工程架构(game/)
6.1 分层
┌─ 表现层 scenes/ ────────────────────────────────┐
│ GuildView(门派 3D 等距视图) │
│ WorldMapView(大地图) │
│ ui/(各类面板) │
└───────────────┬─────────────────────────────────┘
│ 只读数据 + 发事件
┌─ 逻辑层 scripts/ ────────────────────────────────┐
│ core/ GameState · EventBus · Clock · Save │
│ world/ WorldGenerator · Faction · Town · Bandit│
│ guild/ Guild · Building · ResourceSystem · Tech│
│ units/ Character · GrowthSystem · Equipment │
│ tasks/ TaskSystem · EscortTask · BountyTask │
│ combat/ BattleSystem · BattleReport │
└───────────────┬─────────────────────────────────┘
│ 读取
┌─ 数据层 data/ ────────────────────────────────────┐
│ realms.json · buildings.json · resources.json │
│ techs.json · equipment.json · tasks.json │
│ balance.json · names.json │
└──────────────────────────────────────────────────┘
铁律:表现层不写逻辑,逻辑层不碰 Node 路径。 逻辑层通过 EventBus 广播状态变化,表现层订阅后刷新。
6.2 Autoload 单例(顺序不可乱)
| 顺序 | 名称 | 职责 |
|---|---|---|
| 1 | DataDB | 加载 data/*.json,提供只读查询接口 |
| 2 | EventBus | 全局信号总线(纯信号定义,无逻辑) |
| 3 | RNG | 确定性随机数(种子可复现,保证同一参数生成同一世界) |
| 4 | Clock | 作品时间推进、挂机 tick、离线结算 |
| 5 | GameState | 世界状态总容器(存盘对象) |
| 6 | SaveSystem | 存档 / 读档 / 版本迁移 |
6.3 数据驱动
**所有数值必须外置到 data/.json*,代码里不允许出现魔法数字。理由:
- 数值调优不需要改代码、不需要重启编辑器
- 工具链(Asset Forge)可以读取同一份配置做展示
- 后续做数值模拟/平衡性测试时可直接跑批量
6.4 挂机结算模型
离线时长 Δt = min(now - last_save_time, 上限)
每秒产出 = Σ(建筑产出 × 门人效率加成 × 加成系数)
离线收益 = 每秒产出 × Δt × 离线系数(建议 0.5~0.7)
必须在 Clock 中集中实现,落盘时间戳与结算逻辑同源,避免多处计算导致不一致。
七、验证策略
本项目无 GUI 自动化能力,因此全部验证靠数值与命令行:
| 层 | 验证手段 | 判定 |
|---|---|---|
| GLB 资产 | 独立脚本读回二进制校验结构 + 面数/尺寸统计 | 100% 通过 |
| Godot 工程 | godot --headless --quit 导入工程 | Sign out码 0,无 ERROR 输出 |
| GDScript 语法 | godot --headless --check-only --script <file> | 无解析错误 |
| 作品逻辑 | 无头模式下跑 N 个 tick,断言数值不越界(资源不为负、等级不倒退) | 断言全通过 |
| 后端 API | curl 实测全部端点 | 全部 2xx |
| 前端 | npm run build 通过 | 零 TS 错误 |
禁止声称"目视检查正常"——没有 GUI 就老老实实用数值证明。
八、开发阶段
| 阶段 | 目标 | 验收标准 |
|---|---|---|
| P0 地基 | 目录、引擎、工具骨架就位 | Godot 能打开工程;两个工具能起来 |
| P1 资产量产 | 程序化建模产出 30+ 资产 | 全部过校验,GLB 合法 |
| P2 视觉打通 | 资产进 Godot,门派场景渲染出来 | 顶点色正确、合批生效 |
| P3 玩法打通 | 核心循环可玩(建设→生产→招募→任务→成长) | 无头跑 1000 tick 无数值异常 |
| P4 世界激活 | 大地图 + AI 势力争霸 | 各族群能自主演化、互相攻打 |
| P5 战斗与终局 | 战斗结算 + 一统Jianghu | 可完整通关 |
核心判断:本项目最大的风险不是技术难度,而是两条线的接口漂移——工具产出的资产规格一旦和作品侧的预期不一致,返工成本极高。因此本文档把"资产标准"(第五章)作为双线共同契约锁定,任何一侧改动都必须先改本文档。