1. 程式人生 > >lua熱過載

lua熱過載

熱過載,就是不重新開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