You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:32:53