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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM