求助:使用AssetsManagerEx进行lua热更新时,不生效

问题:
热更新的lua文件代码没有生效,仍然执行了apk包里的旧文件,但是经过测试发现图片资源可以生效。

环境:我没有使用quick,直接使用了cocos Code IDE创建了lua工程,cocos引擎版本是3.3rc0;

现象描述:
1.使用了引擎自带的AssetsManagerEx工具类处理资源下载,工作正常,图片和lua文件都可以正常下载到设备可写目录:
local savepath = cc.FileUtils:getInstance():getWritablePath() … “luaTests”

  1. AssetsManagerEx工具在下载后设置了searchPath路径,输出日志查看,貌似也正确,按顺序类似这样:

/data/data/org.cocos2dx.hotUpdateT01/files/luaTests/src/
/data/data/org.cocos2dx.hotUpdateT01/files/luaTests/res/
/data/data/org.cocos2dx.hotUpdateT01/files/luaTests/
/assets/
/assets/src/
/assets/res/

3.下载成功后对新内容使用是这样的:
elseif eventCode == cc.EventAssetsManagerEx.EventCode.ALREADY_UP_TO_DATE or
eventCode == cc.EventAssetsManagerEx.EventCode.UPDATE_FINISHED then
print(“Update finished.”)

require(“AppEntry”)

AppEntry.lua里使用了更新后的代码,而对main.lua 更新文件自身都不需要热更新,AppEntry.lua的内容如下:

–游戏启动入口
require(“Game”)
game.preload()
game.startup()

结果,悲剧的发现,下载的文件怎么都不生效。。。,但一种情况例外:在调试模式下,是正常的,真的可以生效。

大侠们帮忙分析下,是啥原因?

朋友,能把你AssetsManagerEx的代码发来参数一下吗,我一直搞不这个类怎么设置。

没问题。使用cocos ide创建工程,然后把压缩包里的src目录进行覆盖即可。

再次期待大侠们帮忙分析,图片更新成功,但lua文件不行,使用apk包里的。。。

game.lua在更新之前已经加载过了吧?

@阳光七月,没有加载过game.lua,为了确保重现加载,我是这么处理的:
1.AppEntry.lua是更新成功后进行加载;
package.loaded"AppEntry"] = nil
require(“AppEntry”)

2.然后是游戏入口:
–游戏启动入口
package.loaded"Game"] = nil
require(“Game”)
game.preload()
game.startup()

3.game.lua中,

package.loaded"GameScene"] = nil
local scene = require("GameScene")

实际上,我只想更新GameScene.lua,也确认只有game.lua中做了require(“GameScene”)处理;

更新文件确实下载到了手机上,searchpath看上去也对,就是不生效?是不是少了啥步骤?

对main.lua和更新模块自身,不需要进行热更新,我只对game逻辑进行更新,所以,只有在AppEntry.lua中才加载了game.lua。

大侠,帮忙看看到底是啥情况?已经没招了:10:

如果确定前面没加载过,那肯定是优先搜索了apk包里的旧文件了,仔细检查搜索路径的顺序吧

搜索路径应该也是没问题的,我打印日志看过了,类似这样:
/data/data/org.cocos2dx.hotUpdateT01/files/luaTests/src/
/data/data/org.cocos2dx.hotUpdateT01/files/luaTests/res/
/data/data/org.cocos2dx.hotUpdateT01/files/luaTests/
/assets/
/assets/src/
/assets/res/

最终,我这么改了下,可以更新,但总觉得貌似取了个巧,非正统解决方案:
1.在AppDelegate.cpp中添加更新路径;
// 热更新路径设置
FileUtils* sharedFileUtils = FileUtils::getInstance();
string path (sharedFileUtils->getWritablePath() + “upd/src”);
stack->addSearchPathEx(path.c_str());

2.在LuaStack中增加addSearchPathEx函数,将更新路径加入lua searpat的最前面,内容如下:
void LuaStack::addSearchPathEx(const char* path)
{
lua_getglobal(_state, “package”); /* L: package /
lua_getfield(_state, -1, “path”); /
get package.path, L: package path /
const char
cur_path = lua_tostring(_state, -1);
// for test
// lua_pushfstring(_state, “%s;%s/?.lua”, cur_path, path); /* L: package path newpath /
lua_pushfstring(_state, “%s/?.lua;%s”, path , cur_path); /
L: package path newpath */

lua_setfield(_state, -3, "path");          /* package.path = newpath, L: package path */
lua_pop(_state, 2);                                                /* L: - */

}

这样子设置后,热更新生效了。。。

在怀疑,难道是cocos2dx_lua_loader函数有问题?

你这zip 包 少东西吧?

例子 下载不下来东西啊 光说是update finished !

win 上不能用 刚用mac 是可以的

我今天测试 cc.AssetsManager 发现 也是重新reloadModule 模块 之后 能解释你的问题,是main 里面 有cc.FileUtils:getInstance():addSearchPath(“src”)
cc.FileUtils:getInstance():addSearchPath(“res”) 不知道理解的对不,应该是先找src 找到了 就不去upd/src 里面找了

你更新是更新的zip包 然后解压 还是下载的单个文件

问一下 用这个热更是更新的单个文件 我觉得他是更新下来就直接覆盖了上个版本热更的文件
那如果热更中途 更新失败 你是怎么处理的呢???

不生效我之前也遇到过,其实是自己的代码问题,不要在更新功能里require或load需要更新的代码,不然lua require了一次就不会再require了,一定要在更新完成后再去require启动游戏逻辑,如果不是这个问题 那多半是路劲问题 先优先选择更新目录 不过我猜应该是这个问题,第二次运行是不是就没有问题了 第二次的话 找到了正确的文件了