熱重載,就是不重新開unity讓代碼的變化直接看出來,一般在開發時候使用
lua中通過require導入的文件,最終都存在package.loaded這個table中。
require會判斷是否文件已經加載避免重復加載同一文件
所以需要先把package.loaded中對應的內容置空,然后再重新導入
for key,val in pairs(package.loaded) do print(key) if(key == "xxx") then package.loaded[key] = nil; require(key); end end
這種重新require會讓這個腳本在內存中的數據丟失,謹慎使用
1. 將package.loaded[filename] = nil, 將模塊置空. 2. 重新調用require,require(filename).
所以lua如果做了分層,數據和邏輯分離,只reload邏輯層,應該是可以的
注意的是,如果重新require的代碼出錯了,那么
package.loaded[filename]
會一直為nil的,會影響后面的模塊
解決辦法是把之前的保存一份,如果出錯用老的,並且提示
-- require_ex.lua function require_ex(filename) local old_content if package.loaded[filename] then -- 把舊的模塊保存起來 old = package.loaded[filename] -- 然后package.loaded[filename]賦空 package.loaded[filename] = nil end -- xpcall下執行require local ok,err = pcall(require, filename) if not ok then --熱更失敗,將舊值賦回去 print("hotfix fail, err msg ",err) package.loaded[filename] = old_content return false end return true end
參考文章:https://www.cnblogs.com/lewiskyo/p/6160059.html
之前又看一個框架也有這種功能,不過他是使用類似cookie機制實現:https://www.jianshu.com/p/eebd5cfce87f
