Lua学习记录 - 自定义模块管理器

为人所知的是lua自带的require函数加载脚本只会加载一次(就像unity里面的资源管理和AB包管理),而主播调试习惯是用Odin插件的Button在unity编辑器模式里调试而非进入播放模式后调试,今天主播在做热更新相关的时候企图多次调用脚本打印以调试功能,而有时候有些模块需要反复加载,因而主播随便写了个模块管理器。不到好不好用,主要是其一键卸载所有模块好用。

Lua 复制代码
if TDKLuaTookit==nil then
TDKLuaTookit={}
end
TDKLuaTookit.TDKTookit={}
TDKLuaTookit.TDKTookit.__index=TDKLuaTookit.TDKTookit
TDKLuaTookit.TDKTookit.__newindex=TDKLuaTookit.TDKTookit
TDKTookit={}
setmetatable(TDKTookit,TDKLuaTookit.TDKTookit)
TDKTookit.FileDic={}
--本来想用usenamespace的,想想这玩意是能卸载的,还是叫模块比较合适哈

--加载模块
function loadModule(name)
    if TDKTookit.FileDic[name] then
        -- 已经加载过,直接返回缓存
        return TDKTookit.FileDic[name]
    end

    local ok, result = pcall(require, name)
    if not ok then
        error("加载模块失败: " .. tostring(result))
    end

    TDKTookit.FileDic[name] = result
    return result
end
--卸载模块
function unloadModule(name)
    TDKTookit.FileDic[name] = nil
    package.loaded[name] = nil
end
--重载模块
function reloadModule(name)
    TDKTookit.unloadModule(name)
    return TDKTookit.loadModule(name)
end
--列出模块
function listModules(boolPrint)
 	if(boolPrint) then
  print("当前已加载的自定义模块:")
  for k, v in pairs(TDKTookit.FileDic) do
      print(" - " .. k)
  end
  end
   return TDKTookit.FileDic
end

--卸载所有模块
function unloadAllModule()
	for k,v in pairs(TDKTookit.FileDic) do
        TDKTookit.unloadModule(k)
		end
end