目标: 将分散的命名规范、目录结构和热更技术串联成一条完整的工业化生产管线。 核心文档引用:
graph TD
A[🎨 美术/策划生产] -->|命名规范| B(导入 Unity)
B -->|目录结构| C{资源归档}
C -->|通用资源| D[Assets/_Project/Art]
C -->|模块资源| E[Assets/_Project/Features]
D & E -->|AssetPostprocessor| F[自动设置 Import Settings]
F -->|YooAsset Collector| G[资源收集与分包]
G -->|构建| H[生成 AssetBundles]
H -->|HybridCLR| I[注入热更 DLL]
I -->|上传| J[CDN 分发]
[前缀]_[模块]_[名称]_[变体]。AssetNamingValidator.cs,任何不合规资源导入时会在 Console 报错。goblin_red.fbx -> 打回。SK_Goblin_Red.fbx -> 通过。依据 目录结构 的“混合式架构”:
_Project/Art/ 或 _Project/Audio/。_Project/Features/Enemies/Goblin/。不要依赖人工手动设置 Texture Type 或 Compression。利用命名规范自动处理:
T_ 开头 -> 自动设为 Default, 开启 Mipmap, 压缩格式 ASTC_6x6。UI_ 开头 -> 自动设为 Sprite, 关闭 Mipmap, 压缩格式 ASTC_4x4。SFX_ 开头 -> 自动设为 DecompressOnLoad。BGM_ 开头 -> 自动设为 Streaming。我们将目录结构直接映射到 YooAsset 的收集器规则中,实现零配置分包。
| 目录路径 | 收集规则 (Collector) | 打包方式 (Addressable) | 对应 Package |
|---|---|---|---|
_Project/Art/UI/Common |
PackDirectory |
PackTogether (打成一个大包) |
DefaultPackage |
_Project/Scenes/Boot.unity |
PackFile |
- | DefaultPackage |
_Project/Features/Chapter1 |
PackDirectory |
PackSeparately (每个文件单独打) |
LevelPackage |
_Project/Features/Chapter2 |
PackDirectory |
PackSeparately |
LevelPackage |
Features/Chapter1 下的所有资源,自动打上 Tag = "Chapter1"。package.DownloadAsync("Chapter1") 即可一键下载该目录下所有内容。DefaultPackage (启动包) 严禁 引用 LevelPackage (关卡包) 中的资源。UI_MainMenu (Default) 引用了 T_BossTexture (Level),立即报错。HybridCLR/CompileDll 生成 Assembly-CSharp.dll。_Project/StreamingAssets/RawFiles/ (归属 RawFilePackage)。v1.0.100。v1.0.100 时,会同时下载新的 DLL 和新的 AssetBundle,确保逻辑与资源匹配。场景: 一个 “背包面板” (InventoryPanel),包含:
- 1个独特的背景图:
UI_Inventory_Bg.png(仅此面板使用)。- 2个通用底板:
UI_Common_Frame.png,UI_Common_Button.png(全游戏通用)。- 100个道具图标:
UI_Icon_Sword.png… (全游戏通用)。
我们坚持 “维护性 > 性能” 的原则进行物理存放,性能问题交给构建管线解决。
Assets/_Project/Features/Inventory/Art/UI_Inventory_Bg.png
Assets/_Project/Art/UI/Common/UI_Common_Frame.png
Assets/_Project/Art/UI/Icons/Items/UI_Icon_Sword.png
在构建阶段,我们通过 SpriteAtlas 来解决 DrawCall 问题,而不是通过移动文件。
_Project/Art/UI/Common 下的所有小图。
_Project/Art/UI/Icons 下的所有图标。
Icon_Weapon_Atlas, Icon_Potion_Atlas)。Sprite (Single) 加载即可。结论: 物理上按功能分,逻辑上按图集聚。 不要为了减少 1 个 DrawCall 而破坏项目结构的清晰度。
Prefix_Name 规范?EditorSimulateMode 下运行测试过?