【问题标题】:Can someone help explain how this code works in Roblox?有人可以帮助解释此代码在 Roblox 中的工作原理吗?
【发布时间】:2021-04-06 16:58:00
【问题描述】:

我对@9​​87654321@ Roblox 插件有疑问。它将模型转换为脚本。我的问题是它如何转换脚本?如果我有一个带有脚本的模型,它将运行脚本,就好像它在我放置它的模型中一样。我们都知道“scriptModel.Source”仅适用于插件,如果将其转换为脚本,则该脚本不是插件脚本。只是一个普通的脚本。据我所知,这个函数是做什么的:

function sandbox(var,func)
    local env = getfenv(func)
    local newenv = setmetatable({},{
        __index = function(self,k)
            if k=="script" then
                return var
            else
                return env[k]
            end
        end,
    })
    setfenv(func,newenv)
    return func
end

这似乎与环境有关。有人可以帮助我更多地理解这一点吗?我想了解它是如何运作的并且运作良好。

我所理解的是,'var' 是一个脚本实例 (Instance.new)。然后它获取函数的环境/范围。当 'script' 被索引时,它返回那个 'var',否则它返回函数环境变量。我是不是搞错了什么?

谢谢! :D

【问题讨论】:

    标签: plugins lua roblox


    【解决方案1】:

    此函数将替换func 的环境,并将"script" 的任何非赋值索引中继到var。

    这类似于getfenv(func).script = var,唯一的区别是您不修改原始环境。

    【讨论】:

    • 为什么不直接使用getfenv(func).script = var?这不会容易得多吗?
    • 喜欢这里:devforum.roblox.com/t/…
    • @Battledash2 我不知道,我还没有写过那个代码。唯一的区别是你不改变原来的环境。例如,这将允许您为共享公共环境的不同功能使用不同的脚本。
    • 想象你在同一个环境中有两个函数。你可以做sandbox(var1, func1) 和sandbox(var2, func2)。和getfenv(func1).test = "hello!"。现在getfenv(func1).script 是var1,getfenv(func2).script 是var2,getfenv(func1).test 是"hello!" 和getfenv(func2).test 是"hello!",因为他们的环境将除script 之外的任何内容重定向到原始环境。由于我不是 Roblox 专家,因此我不确定实际用例
    • 实际上你需要分配那个“你好!”在您将功能沙箱化之前。我错过了。
    【解决方案2】:

    var:脚本或模型

    功能:我不知道

    首先获取func的环境。然后,使用此属性创建一个新环境:

    • 如果索引位置为空,则触发__index。然后如果索引名称是script,则返回脚本。否则返回函数环境中k的索引位置。

    func的环境然后设置为新环境,然后返回。

    【讨论】:

    • 关于return env[k],为什么不只是return env?另外,__index 接收什么参数? self,然后是索引的内容,但索引的内容可能类似于script.Parent,那么它是“script”而不是“script.Parent”吗?还是第三个参数(如果有的话)“父母”等等?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 2021-12-23
    • 1970-01-01
    • 2021-04-11
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多