Unity项目结构
开发中,好的项目结构可以起到事半功倍的作用.
经过很多项目的洗礼,总结了一下自己常用的项目结构
Assets/
├── _Project/ # 项目特定的内容
│ ├── Scripts/ # 脚本
│ │ ├── Managers/ # 管理器类(如GameManager、UIManager等)
│ │ ├── Systems/ # 系统逻辑模块(如战斗系统、任务系统等)
│ │ ├── Utilities/ # 工具类和通用代码
│ │ └── [FeatureName]/ # 按功能划分的子目录
│ ├── Art/ # 美术资源
│ │ ├── Textures/ # 纹理
│ │ ├── Materials/ # 材质
│ │ ├── Models/ # 3D模型
│ │ └── Animations/ # 动画
│ ├── Audio/ # 音频资源
│ │ ├── Music/ # 背景音乐
│ │ ├── SFX/ # 声效
│ │ └── Voices/ # 配音
│ ├── Prefabs/ # 预制件
│ │ ├── Characters/ # 角色预制件
│ │ ├── Environments/ # 场景环境预制件
│ │ └── UI/ # UI预制件
│ ├── Scenes/ # 场景
│ │ ├── MainMenu.unity # 主菜单场景
│ │ ├── Level01.unity # 第一关
│ │ └── [OtherScenes]/ # 其他场景
│ ├── UI/ # UI相关资源
│ │ ├── Sprites/ # UI精灵
│ │ ├── Fonts/ # 字体
│ │ └── [UIFeature]/ # 按功能分类的UI资源
│ ├── Plugins/ # 插件和外部工具
│ ├── Resources/ # Resources加载的资源
│ ├── StreamingAssets/ # 流媒体资源
│ └── Tests/ # 测试文件
│ ├── PlayMode/ # 游戏运行模式测试
│ └── EditMode/ # 编辑器模式测试
├── ExternalAssets/ # 外部导入的资产
├── Editor/ # 编辑器工具和自定义Inspector
└── ThirdParty/ # 第三方库和插件
详细说明
-
脚本组织 (Scripts)
- 按功能划分:将脚本按具体功能(如管理器、系统逻辑等)划分目录,方便定位。
- 工具类 (Utilities):放置一些与具体功能无关的工具类,比如日志工具、数学工具等。
-
资源分类 (Art/Audio/Prefabs)
- 资源按照类型和用途组织,保持整洁。
- 使用一致的命名规则,比如:[用途]_[描述](如UI_HealthBar.prefab)。
-
场景管理 (Scenes)
- 主场景放在一个单独的文件夹中,便于快速访问。
- 命名规则清晰(如Level01.unity),可快速区分关卡。
-
插件和第三方库
- 将插件放在单独的Plugins或ThirdParty目录中,避免与项目代码混淆。
-
UI资源
- 使用单独的目录存放UI相关资源(如Sprites、Fonts等)。
- 如果UI逻辑较复杂,可进一步细分为模块或页面。
-
测试
- 包含测试脚本,用于编辑器模式或游戏运行模式的单元测试和集成测试。
-
自定义Editor工具
- 如果开发自定义的Inspector或工具,放在Editor目录下以保持清晰的结构。
命名规范
- 文件夹命名:单词首字母大写,采用驼峰命名法,如GameManager、UIElements。
- 资源命名:统一前缀和功能描述,如Player_Model.fbx、BGM_MainTheme.mp3。
- 脚本命名:采用单一职责原则,命名与其功能一致。
Tips
- 保持简洁:避免不必要的目录嵌套。
- 版本控制友好:尽量减少动态生成的文件在版本控制中的频繁变更。
- 使用工具:可以结合Unity的Addressables和自动化脚本,优化资源管理。
一、基础目录结构(根层级)
Assets/
├── _Core # 核心功能模块(项目核心逻辑,通常不随版本迭代大幅变动)
│ ├── Scripts # 核心脚本(单例管理器、基础工具类等)
│ ├── Managers # 系统管理器(如GameManager、UIManager、ResourceManager)
│ ├── Events # 全局事件系统(可基于C#事件或Unity Event)
│ └── Utilities # 通用工具(扩展方法、自定义Attribute、日志系统等)
├── _Gameplay # 游戏玩法模块(与具体玩法相关的资源和逻辑)
│ ├── Characters # 角色相关(玩家、NPC、敌人)
│ │ ├── Models # 角色模型(FBX/GLTF)
│ │ ├── Animations # 动画控制器、动画片段、Avatar
│ │ ├── Materials # 角色材质球、Shader
│ │ └── Scripts # 角色逻辑脚本(移动、战斗、AI等)
│ ├── Weapons # 武器系统(枪械、刀剑、技能特效)
│ ├── Levels # 关卡设计(场景布局、地形、机关)
│ │ ├── Prefabs # 关卡预制体(如房间、障碍物、传送门)
│ │ └── SceneSettings # 场景光照、天气等设置文件
│ └── AI # 人工智能相关(行为树、状态机、导航网格)
├── _UI # 界面系统(UI资源与逻辑)
│ ├── Artworks # UI美术资源(Sprite、图标、字体、动画)
│ ├── Prefabs # UI预制体(按钮、弹窗、背包界面等)
│ ├── Scripts # UI逻辑脚本(界面管理器、交互逻辑)
│ └── StyleSheets # UI样式表(颜色主题、字体样式、布局规范)
├── _Resources # 资源管理(动态加载资源,对应Unity Resources系统)
│ ├── Textures # 纹理资源(Sprite、材质贴图,压缩格式如ASTC)
│ ├── Sounds # 音频资源(BGM、音效,建议区分2D/3D)
│ ├── Shaders # 着色器(Shader文件、材质实例)
│ └── Configs # 配置文件(JSON/XML,如物品数据、角色属性)
├── _ThirdParty # 第三方插件(避免与项目资源混淆)
│ ├── Plugins # 原生插件(如Android/iOS SDK、AR/VR插件)
│ ├── Runtime # 运行时插件(如Odin、PlayMaker、DOTween)
│ └── Documentation # 插件文档与示例
├── _Editor # 编辑器扩展(仅编辑器运行,不参与打包)
│ ├── Scripts # 自定义编辑器脚本(工具窗口、Inspector扩展)
│ ├── Tools # 自动化工具(构建脚本、资源检查工具)
│ └── Tests # 单元测试脚本(基于Unity Test Framework)
├── _Art # 美术资源(按资源类型细分,可与_Gameplay/_UI交叉引用)
│ ├── Models # 3D模型(通用模型,非角色专属)
│ ├── Textures # 原始纹理素材(PSD/AI,未导入Unity的源文件)
│ ├── Materials # 共享材质库(如通用金属材质、植被材质)
│ └── VFX # 视觉特效(粒子系统、后处理效果)
├── Scenes # 游戏场景(按关卡或功能命名,如Menu、Level_01)
├── StreamingAssets # 流媒体资源(直接读取,不压缩,如视频、大文件)
└── README.md # 项目结构说明文档(供团队成员参考)
二、关键设计原则
-
功能模块化
- 将核心逻辑(_Core)、玩法(_Gameplay)、界面(_UI)等模块分离,避免资源交叉引用混乱。
- 示例:角色模型放入_Gameplay/Characters/Models,而通用建筑模型放入_Art/Models。
-
资源类型与平台分离
- 在_Resources下按类型(纹理、音频、着色器)分类,便于动态加载;
- 若涉及多平台(如移动端/PC/主机),可在资源目录下添加平台子文件夹(如_Resources/Sounds/Android、_Resources/Sounds/Desktop),利用Unity的平台过滤功能。
-
编辑器与运行时隔离
- 所有编辑器脚本(如自定义工具)放入_Editor目录,确保不会被打包到游戏程序中。
-
版本控制友好
- 第三方插件放入_ThirdParty,避免与项目原生资源冲突;
- 美术源文件(如PSD)可放入_Art/Textures等目录,但建议通过Perforce等工具单独管理大文件。
三、扩展与变体
-
小型项目简化版
- 合并_Gameplay和_Art为“GameAssets”,_Core和_UI保持独立;
- 移除_ThirdParty(若无需第三方插件),直接使用Unity Asset Store资源。
-
多人团队协作
- 添加“_Local”目录(如_Local/Username)用于存放个人测试资源,避免提交到版本库;
- 使用Unity Addressables替代传统Resources系统,可在_Assets下创建“Addressables”目录管理可寻址资源。
-
特定类型项目调整
- 2D游戏:将_Models替换为_Sprites,增加_Anims(动画帧资源);
- AR/VR项目:在_ThirdParty下添加“XR”子目录,存放VR插件和设备配置。
四、工具与最佳实践
-
自动生成目录结构
- 使用Unity插件如Asset Manager或自定义脚本,基于模板自动创建项目目录。
-
资源命名规范
- 前缀标识类型:
MAT_Stone
(材质)、SPR_UI_Button
(UI Sprite)、SND_Explosion
(音效); - 避免中文路径,确保跨平台兼容性。
- 前缀标识类型:
-
常用忽略文件
- 在
.gitignore
中添加:Library/
、obj/
、Temp/
、*.user
、*.pidb
等Unity自动生成文件。
- 在
通过以上结构,可显著提升资源查找效率、降低团队协作冲突,并为后续项目迭代和扩展奠定基础。如需进一步针对特定需求(如URP/HDRP管线、热更新资源)调整结构,可以随时告知! 🛠️