代码放置目录

KEngine

KEngine的所有运行时代码放置在Assets/KSFramework/KEngine中,编辑器代码放置在KEngine/Editor中。

KSFramework

对比KEngine新加的功能,所有运行时代码放置在Assets/KSFramework中,编辑器相关的代码放置在KSFramework/Editor中。

SLua

KSFramework中SLua采用其默认的目录结构,即C#运行时代码放置在Assets/Plugins/Slua_Managed中,编辑器相关代码放置在Assets/SLua中。

XLua

XLua放置在Assets/XLua目录下,结构和官方保持同步

Lua代码

所有的Lua代码放在Product\Lua目录下,开发期间修改代码后,就会生效,代码无需打包,生成APK时会拷贝到StreamingAssets。

ILRuntime热更代码

ILRuntime热更工程的代码放在HotFix_Project\scripts目录下,注:只有ILRuntime分支有此目录

为什么代码要放在Plugins中?

脚本的修改,会触发Unity的重新编译。一般的项目逻辑都放在非Plugins目录,随着项目的发展,非Plugins目录的代码越来越多,编译越来越慢。把代码放进Plugins目录,可以节约一定的编译时间,改善开发效率。

注:对于unity2018及更高的版本中可以对不同的目录设置Assemly。

其它目录

配置表

策划配置表excel放在 Product\SettingSource,excel转换后的中间文件放在Product\Setting,独立编译配置表的工具放在Product\Tableml_GUI(需要自己从Release下载)

AB文件(Assetbundle)

打包后的ab文件放在Product\Bundles

build_tools

打更新包和自动化生成ab的脚本目录,里面有python和cmd脚本。

资源目录约定

  • Assets/BundleEdting: 一些编辑性的、需要配合编译过程的美术资源。比如UI在保存时自动导出Prefab到Assets/BundleResources目录下
  • Assets/BundleResources: Asset Bundle全自动化导出的关键,此目录下所有的文件都会设置上abName,然后进行导出,并使用Unity管理依赖。KSFramework约定这几个目录:角色,特效,shader,声音中的prefab也会设置abName,在生成ab时一并导出。
  • Product: 默认的产品导出目录,包括Asset Bundle、Lua脚本、配置表,统一放置在这个目录。 编译客户端时,这些资源将被拷贝到StreamingAssets目录后才进行编译打包。

BundleEdting和BundleResources的名称可自定义,修改AppConfig.cs和KEngineDef.cs的路径定义即可。

UI资源

所有的UI都放在根目录(Assets/BundleEdting/UI)下,KSFramrwork建议的分类如下:

-atlas_common/(整个游戏的公共图集)
-系统A/
​   -atlas/(在导出UI时会自动把此目录的小图打包为:系统名.spriteatlas)
​   -面板1
​   -面板2
​   ...更多面板
-系统B
-更多系统...

所有的UI场景在保存时,会导出为prefab放到Assets/BundleResources/UI下:

-系统A的面板1.prefab
-系统A的面板2.prefab
-系统A的面板xxx.prefab
-系统A.spriteatlas
======== 每个面板打包成一个ab,atlas单独打包到一个ab中 ==========


-系统A只有一个同名面板.prefab
-系统A.spriteatlas
======= 这两个文件会打包到一个ab中 ========

场景资源

所有需要打包成ab的场景文件都放在Assets/BundleResources/Scene下,如果多个场景都有用到的共用小物件,建议这些小物件打到共用prefab中

    -场景1001.unity
        -navmesh.asset
        -lightmap/文件夹
        -物件a.prefab
        -物件b.prefab

如果是在editor下不通过ab加载场景则需要将每个sene.unity添加到Build Settings - Scenes In Build中

角色/NPC/怪物资源

所有的角色资源放在BundleEditing/Character/下,每个角色一个文件夹,一个角色中包含几个子文件夹,并且把制作好的prefab放到BundleResources目录下

    -职业A/
        -mesh/
        -anim/
        -tex/
        -xx.prefab放到BundleResources下,如果有共用资源也放到BundleResources目录下
    -职业B/
    -怪物或BOSS/
    -....

对于大多数单个的npc,怪物等,可以将贴图,材质,动作,Mesh打包到一个ab中(只对prefab设置abName即可)

特效资源

所有的特效资源放在BundleEditing/Effect/下,建议将单个effect打包一个ab,如果effect中包含的贴图和材质在多个prefab中用到,则把这些共用的放在Assets/BundleResources/Effect/common下

    -character/(所有的角色特效,包括战斗特效、武器上的特效)
        -mesh/
        -anim/
        -tex/
        -fx_xxx.prefab ->放到BundleResources下,建议单个特效会打成一个ab,mesh,anim,texture等不进行拆分
    -buff/(所有的buff特效)
    -pet、魂器、圣物、坐骑、法宝等文件夹
    -monster/(所有的怪物/boss特效)
    -scene/(场景内的特效)
    -ui/(ui特效资源)
    -common/(公共资源)

Shader资源

KSFramework中建议把所有的shader放在BundleEditing/Shader下,在打包时会把整个目录的shader打包到一个ab中,这样就不会有shader冗余。

TODO 计划:在游戏启动时进行shader预热

如果需要自定义规则:BaseImporter.cs OnPostprocessAssets

声音资源

KSFramework中建议把所有的声音放在BundleEditing/Sounds下,然后在打包时除BGM目录外,其它每个子目录中的声音文件会打包到一个ab中

如果是某个界面特有的音效可以和界面打包到一个ab中,BGM(背景音乐)目录下的音频会每个单独打成一个ab包

如果需要自定义规则:BaseImporter.cs OnPreprocessAudio

AB粒度划分

在KSFramework中是通过LoadFromFile来加载ab,所以我们不建议对ab折分地过细。

根据出现频率和同时加载峰值来划分,尽可能把逻辑上同时出现(非公共部分)、小而细碎的资源(贴图、Material、动画、音效)尽可能打包在一起,并通过

LoadAll来进行加载,这样会带来更好的加载效率,最终我们的结果是减小内存峰值和加快加载速度。

可以参考《AssetBundle 粒度规划