附有道云笔记排版文档:自定义tolua加载ab模拟机制,完美解决?..
链接:http://note.youdao.com/noteshare?id=c6da58f8245888d33013b7c2aef6bc6c
之前用的AB模拟加载机制,自定义写了一套加载流程,但是无法调试lua或者或者概率性能调试,因此写了一个新的加载流程框架完美解决了AssetBundle模拟调试(修改lua代码后不需要实时打Bundle就能立刻看到lua代码的修改效果)但是tolua不能debug的问题
原理:lua文件是通过路径来加载的,
- 设置好对应的加载路径(如:AddSearchPath)
- 设置好对应的加载方法(如:assetbundle)
- 设置好对应的加载方式(如:dofile(),dostring())
核心思路:
- 保证需要加载的文件全部加载完成
- 保证需要加载的文件启动入口准确
原框架逻辑梳理:
- tolua的打包机制是 提前addbundle预加载包,和后续的ab包,整合在平台的如Android.manifest
- tolua的预加载是通过AddBundle()到指定查询路径
#region 自定义操作行为
/// <summary>
/// 添加打入Lua代码的AssetBundle
/// </summary>
/// <param name="bundle"></param>
public void AddBundle(string bundleName)
{
string url = ELUtil.DataPath + bundleName.ToLower();
Debug.LogError(url);
if (File.Exists(url))
{
var bytes = File.ReadAllBytes(url);
AssetBundle bundle = AssetBundle.LoadFromMemory(bytes);
if (bundle != null)
{
bundleName = bundleName.Replace("lua/", "").Replace(".unity3d", "");
base.AddSearchBundle(bundleName.ToLower(), bundle);
Debug.LogError("true:" + bundleName);
}
}
}
#endregion
/// <summary>
/// 初始化LuaBundle
/// </summary>
void InitLuaBundle()
{
if (_luaLoader.beZip)
{
_luaLoader.AddBundle("lua_lua.unity3d");
_luaLoader.AddBundle("lua_lua_math.unity3d");
_luaLoader.AddBundle("lua_lua_debug.unity3d");
...
}
}
tolua框架加载方法如果是开启zip走zip方法LuaInterface.LuaFileUtilsReadZipFile(string fileName) 否则走正常加载 File.ReadAllBytes(string fullPath);
- 注:zip方法就是相对路径加载方法,通过searchPath来加载
- 否则走全路径加载方法(绝对路径LoadFIle)