Tencent / UnLua

A feature-rich, easy-learning and highly optimized Lua scripting plugin for UE.
Other
2.19k stars 603 forks source link

热重载不支持新增函数 #683

Closed GotGimhong closed 7 months ago

GotGimhong commented 9 months ago

我们发现热重载对于新增函数是没有效果的。例如在 BP_PlayerController_C.lua 里面增加一个函数,热重载后,调用这个函数仍然会报错,提示找不到新增的函数。代码如下:

-- BP_PlayerController_C.lua

function M:Fire_Pressed()
    -- 通过主角开火来调用新增的函数
    self:TestHotReload()
    if self.Pawn then
        self.Pawn:StartFire_Server()
    else
        UE.UKismetSystemLibrary.ExecuteConsoleCommand(self, "RestartLevel")
    end
end

-- 新增的函数
function M:TestHotReload()
    print("Test HotReload")
end

我们看过 HotReload.lua 里面的代码,对于 debug.getregistry() 中的元表和 Lua 对象实例,目前都是只支持同名函数的替换。请问官方对此有什么建议呢,是后续会完善热重载,还是需要开发者自行处理新增函数的情况?

jozhn commented 7 months ago

因为lua module在绑定实例的时候是深拷贝一份作为uobject对象的元表的,所以reload lua module不会影响到拷贝的那份元表里的函数,你可以自己处理下。比如在绑定时把这种拷贝的元表放到registry的一个表里,reload之后对表里的元表执行update_table,也可以用其他一些方式实现。

GotGimhong commented 7 months ago

因为lua module在绑定实例的时候是深拷贝一份作为uobject对象的元表的,所以reload lua module不会影响到拷贝的那份元表里的函数,你可以自己处理下。比如在绑定时把这种拷贝的元表放到registry的一个表里,reload之后对表里的元表执行update_table,也可以用其他一些方式实现。

了解,感谢您的建议。