如何在Moho的不同Lua环境间传递/访问全局变量?
Moho Lua 跨环境数据传递与环境区分方案
针对你开发Embedded Scripts时遇到的多Lua环境全局变量失效、无法使用require的问题,以下是具体解决方案:
一、跨Lua环境传递数据的可行方案
1. 利用Moho C绑定全局对象共享
Moho导出到Lua的核心对象(如Moho全局表、moho.document文档实例)是跨Lua环境共享的C层面实例,可将需传递的数据挂载到这些对象的自定义字段上:
-- 在初始化环境中存储共享数据 Moho.MySharedState = { cachedConfig = {speed = 2.5, enabled = true}, sharedUtility = function(val) return val * 2 end } -- 在渲染阶段的新环境中读取 local sharedData = Moho.MySharedState print(sharedData.cachedConfig.speed) -- 输出2.5 print(sharedData.sharedUtility(10)) -- 输出20
注意:不要挂载到Lua原生全局表_G上,每个Lua环境的_G都是独立实例。
2. 利用项目元数据持久化
如果需要跨会话存储数据,可将数据序列化后存入Moho项目的元数据:
-- 存储数据(简单序列化示例,复杂数据可自定义序列化逻辑) local dataTable = {frame = 100, opacity = 0.8} local serializedStr = string.format("frame=%d;opacity=%.1f", dataTable.frame, dataTable.opacity) moho.document:SetMetadata("MyScriptSharedData", serializedStr) -- 在新环境中读取并解析 local savedStr = moho.document:GetMetadata("MyScriptSharedData") local parsedData = {} for k, v in string.gmatch(savedStr, "([^=]+)=([^;]+)") do parsedData[k] = tonumber(v) or v end
3. 临时文件存储(应急方案)
若以上方法受限,可使用临时文件读写传递小数据(效率较低,仅作备选):
-- 写入临时文件 local tmpPath = os.tmpname() local file = io.open(tmpPath, "w") file:write("cached_frame=150") file:close() -- 在新环境中读取 local file = io.open(tmpPath, "r") local content = file:read("*a") file:close() local cachedFrame = tonumber(string.match(content, "cached_frame:(%d+)"))
二、区分不同Lua环境的方法
1. 标记环境唯一ID
在每个环境初始化时,给共享的Moho对象添加唯一标识:
-- 脚本初始化时执行 if not Moho.EnvUniqueID then Moho.EnvUniqueID = tostring(math.random() * os.time()) -- 生成唯一标识 end -- 检查当前环境ID print(Moho.EnvUniqueID) -- 不同环境会返回不同值
2. 检查环境专属API
不同类型的Moho脚本环境会存在专属全局对象,可通过检查这些对象区分:
-- 判断是否为渲染阶段环境 function IsRenderEnvironment() return moho.renderer ~= nil end -- 判断是否为Tool Scripts环境 function IsToolEnvironment() return moho.tool ~= nil end
3. 标记当前_G实例
每个Lua环境的_G是独立的,可在初始化时给当前_G添加专属标记:
-- 在渲染脚本开头设置标记 _G.IsRenderEnv = true -- 在其他逻辑中检查 if _G.IsRenderEnv then -- 执行渲染环境专属逻辑 end
内容的提问来源于stack exchange,提问作者Rai
相关产品推荐
相关产品推荐

