本篇介绍一些常见的问题及解答
常见问题
编辑器下无需打包资源
在Editor下,无需打包AB资源即可运行,减少打包时间,提高工作效率。
如果需要调试AB资源泄漏问题,请打包AB。
是否所有要打包的资源都需要放到BundleResources?
不是的,BundleResources中的所有资源都会设置abName然后导出,但是按照BaseImporter.cs中约定的目录下的prefab,shader,audio也会设置abName然后导出ab。
如何打包APK?
- 点击菜单栏 KEngine - AutoBuilder - Android/iOS/Windows
- 随后等待Unity执行生成安装包,放在Product/Apps/Android/KSFramework.apk
[根据平台区分目录]
- 打包期间会自动Link AB资源到StreamingAssets目录下
注:如果是xlua,打包前内部会自动生成代码打包成功后会删除生成的代码。其它热更新方案,请参考框架使用说明。
从StreamingAssets目录同步读取文件
对于其它的文件,请使用KResourceModule.LoadAssetsSync
,针对安卓平台有做特殊处理,java源代码在KEngine:KEngine\KEngine.UnityProject\PluginsSrc\KEngine.Android\src\com\github\KEngine\AndroidHelper.java
如果是加载ab,请使用这个接口
var assetBundle = AssetBundleLoader.Load(ab的相对路径);
如何更新仓库?
如果需要单独更新KEngine或者xlua/slua,可以手动删除原有目录,再拷贝新的目录过去。
KSFramework中xlua的lib是从作者的仓库中拉取的(加入了一些常用lua库):https://github.com/chexiongsheng/build_xlua_with_libs
目录结构如下:
KSFramework\Assets\KSFramework\KEngine
KSFramework\Assets\xLua
KSFramework\Assets\slua
OnInit会调用两次?
近期在计划重构这个功能:运行时修改代码后,无感热重载lua脚本,且不重复调用多次OnInit
如果OnInit被调用两次,它是设计用于热重载后,在OnOpen中重新调用一次OnInit。
如果你不希望被调用两次,在LuaUIController.OnOpen中注释掉这两行
//if (!CheckInitScript())
// return;
配置表生成C#代码,如何热更?
可以把数据表生成Lua代码,或在lua中读取tsv,或把数据表保存到数据库,等等方式。
在KSFramework中的Appconfig.cs中修改 IsUseLuaConfig = 1,就会把配置表生成lua代码
更新于2020年-11月,tableml支持把数据表的内容生成为lua代码,目前在lua中读取配置表有这几种方式:
- 数据表转为lua代码
- 仅生成数据表的字段做为lua文件,用于代码提示,把数据内容保存到sqlite中
- 数据表转为csv,在lua中解析csv
- 不需要热更的代码,通过c#读取配置
可以参考我的这篇文章《TableML-GUI篇(C# 编译/解析 Excel/CSV工具)》 ,把数据表保存到sqlite
build之后,运行报错
请检查是否有生成xlua/slua代码,根据具体的报错日志进行排查。
LuaBehaviour
xlua分支,在C#中调用self.ABC为空,已修复
TestLuaBehaivour = {}
function TestLuaBehaivour:Awake()
print("Test Lua Behaivour Awake!")
self.ABC={}
self.ABC["name"]="test"
end
function TestLuaBehaivour:Start()
print("Test Lua Behaivour start!")
print(self.ABC)
print(self.ABC["name"])
end
return TestLuaBehaivour
资源相关
Q:webstrom一直没有释放?
A:资源是否没有打包成assetbundle
Q:部分安卓机型报:local reference table overflow (max=512)
A:在同学反馈用Unity2017打包,在红米部分机型会出现此错误,已添加宏处理Unity版本。
Q:打包后无法加载资源?
A:如果在Editor下正常,请先尝试更新KEngine。
-
Android7出现资源加载失败(小米黑鲨游戏手机 ),把Android的SDK Version改到25以下。
来自群友:pabble(405706175)
Q:Lua如何打包?
A:可以打包成zip,游戏启动时,进行解压
Q:The AssetBundle xxx.ab' can't be loaded because another AssetBundle with the same files is already loaded.
A:同名的ab(包括不同路径但名称相同)如果已加载没有释放,再调用加载Unity会报此错误且不会加载
loadfromfile
lzma也可以loadfromfile
其它热更新方案
理论上只需要修改LuaModule的部分代码,就可以支持其它任意的热更新方案。
KSFramework/Modules/LuaModule/LuaBehaviour.cs
KSFramework/Modules/LuaModule/LuaModule.cs
更多版本信息可查看:https://mr-kelly.github.io/KSFramework/overview/environment-other-hotfix-solution/
slua和xlua相关
lua调试
在我们的项目中是通过emmylua+idea来调试lua,也可以使用rider2020+emmylua(1.3.5及以上版本)调试,请把emmylua的调试代码写在Init.lua的顶部或底部
如果mac os无法调试报错,请参考:dynamic libraries not enabled; check your Lua installation #725
KSFramework中xlua的lib是从xlua作者的仓库中拉取的(加入了一些常用lua库):https://github.com/chexiongsheng/build_xlua_with_libs
问题1
提示:code has not been genrate, may be not work in phone!
这是因为xlua通过 DelegateBridge.Gen_Flag 来判断是否生成代码,但我们在打包过程中,先生成代码,然后删除生成后的代码,并没有设置此flag,但功能是正常的。
问题2
在Unity2019下xlua下调用切换场景(SceneLoader.Load)遇到报错:
LuaException: c# exception:This type must add to CSharpCallLua: System.Action<bool>,stack: at XLua.ObjectTranslator.CreateDelegateBridge (System.IntPtr L, System.Type delegateType, System.Int32 idx) [0x001a8] in E:\Code\KSFramework\KSFramework\Assets\XLua\Src\ObjectTranslator.cs:546
at XLua.ObjectCasters+<>c__DisplayClass23_0.<genCaster>b__1 (System.IntPtr L, System.Int32 idx, System.Object target) [0x0002f] in E:\Code\KSFramework\KSFramework\Assets\XLua\Src\ObjectCasters.cs:442
at XLua.OverloadMethodWrap.Call (System.IntPtr L) [0x001ac] in E:\Code\KSFramework\KSFramework\Assets\XLua\Src\MethodWarpsCache.cs:232
at XLua.MethodWrap.Call (System.IntPtr L) [0x0006b] in E:\Code\KSFramework\KSFramework\Assets\XLua\Src\MethodWarpsCache.cs:304
解决办法:把Api Compatiblity Level从.NET Standard2.0改成.NET 4.x,这是因为.net standard不支持反射调用,原因可看:https://github.com/Tencent/xLua/issues/784#event-3628025061
更多xlua相关的知识,请查看xlua的官方文档
ILRuntime相关
Q:ILRuntime分支怎样开始使用?
A:1. 从github拉取ilruntime分支代码,2.用Unity打开工程,3.点击打包ab,4.再点击生成Dll,然后就可以运行游戏
Q:dll生成失败?
A:如果有安装vs,请把msbuild配置到环境变量中,如果仅安装了Rider,请看我这篇《没有安装vs通过Rider编译Dll》
遇到报错
TargetException: Non-static field reqires a target
调用堆栈 KEngine.Log.Logger
解决办法:游戏启动时,打开Unity的日志窗口(Console界面),因为添加了双击日志跳转到Lua文件中
启动游戏报资源加载的错误
解决办法:
- 重新生成Assetbundle,方法如下:点击菜单项 KEngine - AssetBundle - Bulld All
- 删除xlua或slua的生成代码,重新生成,生成的代码不同的Unity版本有差异
- 如果前两步不能解决问题,请上传报错信息,提issuse。