UP | HOME

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 的表格配置

  1. KSFramework 的表格配置需要 csharp 代码来解析,这样热更新无法修改表格字段,也无法新加表格。
  2. 重新生成 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"
}

参考资料