5. 游戏文件分类与结构设计
2026/4/13大约 3 分钟
游戏文件分类与结构设计
核心原则:高内聚,低耦合
这句话翻译成大白话就是:跟同一个功能相关的东西放在一起,跟它无关的东西放到别处。
很多新手(包括一些有经验的开发者)会犯一个错误:把所有图片放到一个 art/ 文件夹,所有脚本放到一个 scripts/ 文件夹,所有音效放到一个 audio/ 文件夹。看起来很"整齐",但实际上当你项目变大后,找一个素材要在三个文件夹之间反复跳转,非常痛苦。
错误示范:按文件类型分文件夹
res://
├── art/
│ ├── player.png ← 玩家图片
│ ├── player_run.png ← 玩家跑步帧
│ ├── enemy_slime.png ← 史莱姆图片
│ ├── enemy_bat.png ← 蝙蝠图片
│ ├── tile_grass.png ← 草地瓦片
│ ├── tile_stone.png ← 石头瓦片
│ └── ui_button.png ← 按钮图片
├── scripts/
│ ├── player.gd ← 玩家脚本
│ ├── enemy_slime.gd ← 史莱姆脚本
│ ├── enemy_bat.gd ← 蝙蝠脚本
│ ├── tile_map.gd ← 地图脚本
│ └── ui_button.gd ← 按钮脚本
├── audio/
│ ├── jump.wav ← 跳跃音效
│ ├── enemy_die.wav ← 敌人死亡音效
│ └── bgm.ogg ← 背景音乐
└── scenes/
├── player.tscn ← 玩家场景
├── enemy_slime.tscn ← 史莱姆场景
├── enemy_bat.tscn ← 蝙蝠场景
└── game.tscn ← 游戏主场景问题在哪?
你要修改"史莱姆"这个敌人,需要同时打开 art/、scripts/、scenes/ 三个文件夹,分别找到 enemy_slime.png、enemy_slime.gd、enemy_slime.tscn。项目越大,找东西越痛苦。
正确做法:按功能模块分文件夹
一个功能模块用到的所有东西,都放在同一个文件夹里。
res://
├── main_menu/ ← 主菜单模块
│ ├── main_menu.tscn ← 场景
│ ├── main_menu.gd ← 脚本
│ ├── background.png ← 背景图
│ └── button_click.wav ← 按钮音效
│
├── player/ ← 玩家模块
│ ├── player.tscn ← 场景
│ ├── player.gd ← 脚本
│ ├── idle.png ← 站立图片
│ ├── run_1.png ← 跑步帧1
│ ├── run_2.png ← 跑步帧2
│ ├── jump.png ← 跳跃图片
│ └── jump.wav ← 跳跃音效
│
├── enemies/ ← 敌人模块
│ ├── slime/
│ │ ├── slime.tscn ← 史莱姆场景
│ │ ├── slime.gd ← 史莱姆脚本
│ │ ├── slime.png ← 史莱姆图片
│ │ └── slime_die.wav ← 死亡音效
│ └── bat/
│ ├── bat.tscn
│ ├── bat.gd
│ ├── bat.png
│ └── bat_die.wav
│
├── levels/ ← 关卡模块
│ ├── level_01/
│ │ ├── level_01.tscn ← 第一关场景
│ │ ├── level_01.gd ← 第一关脚本
│ │ ├── grass_tileset.tres ← 这关用的瓦片集
│ │ ├── tiles.png ← 瓦片图片
│ │ └── bgm.ogg ← 这关的背景音乐
│ └── level_02/
│ ├── level_02.tscn
│ ├── level_02.gd
│ └── ...
│
├── hud/ ← 游戏内 UI 模块
│ ├── hud.tscn
│ ├── hud.gd
│ ├── heart.png ← 血条图标
│ └── coin.png ← 金币图标
│
└── project.godot ← Godot 项目配置文件(自动生成,不用管)好处:要修改"史莱姆",打开 enemies/slime/ 一个文件夹就够了。所有相关的东西都在这里。
关键原则总结
| 原则 | 说明 |
|---|---|
| 就近原则 | 一个场景用到的图片、音效、脚本,和场景文件放在一起 |
| 不要提前抽象 | 不要为了"以后可能复用"而把素材放到全局文件夹。先做完再说 |
| 模块边界清晰 | 玩家是玩家、敌人是敌人、关卡是关卡,各管各的 |
| 先开发再重构 | 文件结构不需要一开始就完美,做功能的过程中自然调整 |
全局共享资源怎么办
有些资源确实是被多个模块共享的,比如:
- 字体文件:整个游戏都用同一个字体
- 通用 UI 素材:多个界面共用的按钮、面板样式
- 全局配置:游戏设置、常量定义
这些可以放在根目录下的 shared/ 或 common/ 文件夹:
res://
├── shared/
│ ├── fonts/ ← 共享字体
│ ├── ui_theme.tres ← 共享 UI 主题
│ └── constants.gd ← 全局常量
├── player/
├── enemies/
├── levels/
└── ...但注意:只放真正被多处共享的东西。 如果一个素材只被两个地方用到,直接复制一份分别放到各自文件夹里,比建一个"共享文件夹"更简单。
Autoload(全局单例)
有些代码需要在整个游戏中随时访问,比如分数管理、存档系统、音频管理。这类代码使用 Godot 的 Autoload 机制:
设置路径:项目 → 项目设置 → Autoload
| 脚本 | 用途 |
|---|---|
game_manager.gd | 管理游戏状态(分数、生命、关卡) |
audio_manager.gd | 管理音效和音乐的播放 |
save_manager.gd | 管理存档和读档 |
Autoload 脚本通常放在项目根目录下,因为它们不属于任何具体功能模块。
下一章
文件结构设计好了,开始搭建游戏地图。
