KSFramework Note
Table of Contents
KSFramework not.
<!– more –>
KSFramework Note
快速入门
入口
Assets/Code/Game.cs 中
OnFinishInitModules 为所有模块初始化完成的事件
OnGameStart() 为所有模块初始化完成后,回调的事件, 可以在该函数中添加 UIModule.Instance.OpenWindow("Billboard");
运行程序
打开场景 Assets/Game.unity,点击播放按钮
工作流程
美术
美术将资源放置在 BundleEditing 或 BundleResources 目录下。
BundleResources 目录下的资源会被制作为 AssetBundle
UI 制作流程
- 新建一个场景,然后,点击 KEngine/UI(UGUI)/CreateUI(UGUI) 会在该场景下创建一个 UI。
- 编辑完 UI 后,将该场景保存到 Assets/BundleEditing/UI 目录下。
- 最后,点击 KEngine/UI(UGUI)/ExportCurrentUI 会将刚创建的 UI 以 prefab 的形式导出到 Assets/BundleResources/UI/目录。
场景制作流程
人物模型制作流程
人物模型
人物模型动画
粒子特效制作流程
策划
- 策划 excel 表格放在 Product/SettingSources 目录,新建表格都放置在该目录下。
- 配置完表格后,返回 Unity 编辑器,会自动对表格进行编译,生成数据。
- 如果是新加了表格或对表格字段进行了修改,还需要点击 KEngine/Settings/Force Compile Settings+Code 生成相应 csharp 代码
程序
程序的 Lua 目录放置在 Product/Lua 目录,新建 lua 文件都放置在该目录下。这些 lua 文件不需要执行导入工作,框架会到正确目录下去寻找。
打包流程
程序
确保 Lua 中用到的 C#类都已经导出。如果没有,执行 SLua/All/Make
策划-美术
确保 BundleEditing 中的 UI 都已经导出为 Prefab,如果没有,执行 KEngine/UI(UGUI)/ExportCurrentUI
Tips:
目前没有批量导出 UI 界面为 Prefab 的脚本,需要对每个 UI 执行 KEngine/UI(UGUI)/ExportCurrentUI
最终打包
- 点击 KEngine/AssetBundle/Build All 制作 AssetBundle 并导出到 StreamingAssets/Bundles/XXX 目录下。
- 点击 KEngine/AutoBuilder/Android 打包 Android 版本 app。
这一步会自动将 Lua 和 Setting 目录下的内容 copy 到 StreamingAssets 目录下。
源代码笔记
AssetBundle 打包相关
KSFramework\Assets\Plugins\Editor\KEngineEditor\KEngine.Editor\BuildTools.cs 中实现了 AssetBundle 打包相关的逻辑.
ResourceModule
KAbstractResourceLoader.cs
KSFramework\Assets\Plugins\KEngine\KEngine\CoreModules\ResourceModule\KAbstractResourceLoader.cs 中实现了 ResourceLoader 的抽象类。
资源加载器
资源加载器持有自己加载的资源,通过调用 Release 来释放资源加载器持有的资源。
UI 资源加载
UIModule 中通过 UIWindows 字典来保存 ui 所对应的资源加载器。
关闭界面时,释放 ui 对应的加载器。
重新加载界面时,强制释放对应的加载器,重新加载 ui。
// ui 资源加载器为 StaticAssetLoader public virtual IEnumerator LoadUIAsset(UILoadState loadState, UILoadRequest request) { string path = string.Format("ui/{0}.prefab", loadState.TemplateName); var assetLoader = StaticAssetLoader.Load(path); loadState.UIResourceLoader = assetLoader; // 基本不用手工释放的 while (!assetLoader.IsCompleted) yield return null; request.Asset = assetLoader.TheAsset; }
场景资源加载
资源的释放
Q&A
如何解决 AssetBundle 被重复加载的问题?
在 KAbstractResourceLoader 中,有一个 Dictionary _loadersPool,其中保存了所有的 Loader,字典的 Key 为资源路径。调用 AutoNew 方法,为某个资源创建资源加载器时,若在_loadersPool 中已经存在该 loader,则不进行创建,而是使用以前的加载器,并在为之前的加载器增加引用计数。
private static readonly Dictionary<Type, Dictionary<string, AbstractResourceLoader>> _loadersPool = new Dictionary<Type, Dictionary<string, AbstractResourceLoader>>(); protected static T AutoNew<T>(string url, LoaderDelgate callback = null, bool forceCreateNew = false, params object[] initArgs) where T : AbstractResourceLoader, new() { // ....... }
InstanceAssetLoader.Load 是如何每次调用都返回一个对象 copy 的?
InstanceAssetLoader.Load 调用 AutoNew 时,设置 forceCreateNew 为 true,从而每次都会新建一个 loader。
缺点
关于 KSFramework 的表格配置
- KSFramework 的表格配置需要 csharp 代码来解析,这样热更新无法修改表格字段,也无法新加表格。
- 重新生成 csharp 代码后,还需要执行 Slua 导出,否则配置无法在 lua 代码中使用。
优点
表格配置数据、Lua 文件放置在 Assets 目录外
减少了 Unity 工程需要处理的文件,加快了编辑器运行速度
支持编辑器模式不导出 AssetBundle 运行
在编辑器模式下,通过下面配置,支持不使用 AssetBundle,让开发流程更流畅:
[KEngine] AssetBundleExt = .k ;0 表示使用 AssetBundle,1 表示不使用 AssetBundle ;IsEditorLoadAsset = 0 IsEditorLoadAsset = 1
Error
发布 Android 包时,提示 UnityEngine.Windows 不存在
因为 Windows 这个类属于 windows 平台的,所以 Slua 导出时需要去掉这几个类导出。在 CustomExport.cs 类中,添加不需要导出的脚本名称,如下所示:
public static void OnGetNoUseList(out List<string> list) { // ...... // "Windows" }
参考资料
- KSFramework 官方文档 http://mr-kelly.github.io/KSFramework/
- KSFramework 源代码 https://github.com/mr-kelly/KSFramework
- KEngine Readme https://github.com/mr-kelly/KEngine
- KSFramework 作者博客 http://www.jianshu.com/u/674f1a626944