lua熱過載
阿新 • • 發佈:2018-11-11
熱過載,就是不重新開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_contentif 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