Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
roblox上向上移动模型的lua脚本?_Lua_Roblox - Fatal编程技术网

roblox上向上移动模型的lua脚本?

roblox上向上移动模型的lua脚本?,lua,roblox,Lua,Roblox,我有一个叫门的模型 里面有一个布尔值,名为Open 我有一个名为Top的模型,它有所有的门砖,名为Work Mabey Comeon和Proboblynot 我已经阻止了,当被触摸时,应该使顶部向上移动 就在门里面,我有这个脚本 door = script.Parent open = door.Open Top = door.Top opener = 18 speed = 100 steps = speed startl = Top.CFrame function MoveDoorToCF

我有一个叫门的模型 里面有一个布尔值,名为Open 我有一个名为Top的模型,它有所有的门砖,名为Work Mabey Comeon和Proboblynot 我已经阻止了,当被触摸时,应该使顶部向上移动

就在门里面,我有这个脚本

door = script.Parent
open = door.Open
Top = door.Top

opener = 18
speed = 100
steps = speed

startl = Top.CFrame

function MoveDoorToCFrame(cfrm,dr)
    dr.Work.CFrame = cfrm
dr.Mabey.CFrame = dr.Work.CFrame * CFrame.new(0,-7.2,0)
dr.Comeon.CFrame = dr.Work.CFrame * CFrame.new(0,10.8,0)
dr.Problynot.CFrame = dr.Work.CFrame * CFrame.new(0,10.8,0)
end

function Update()
if speed/steps < 0.5 then
    calc = 1-math.cos(math.rad((-90/speed)*steps*2))
else
    calc = 1+math.sin(math.rad((90/speed)*((speed/2)-steps)*2))
end
MoveDoorToCFrame(startl * CFrame.new(0,(calc/2)*opener,0),Top)
end

Update()
while true do
wait()
if not open.Value and steps < speed then
    steps = steps + 1
    Update()
elseif open.Value and steps > 0 then
    steps = steps - 1
    Update()
end
end 

如果您知道如何修复此问题,将非常感谢。

这可以用于移动模型,请尝试在代码中添加类似的内容。它更有活力

a = Workspace.Model

for i=0.1,40 do
    for i,v in pairs(a:getChildren()) do
        if v:IsA("Part") then
            v.CFrame = CFrame.new(v.CFrame + Vector3.new(0,0.1,0))
        else print("Not a part")
        end
    end
end
2015年11月更新: 使用PrimaryPart

自从写了这篇文章之后,ROBLOX在API方面有了很大的改变。要按要求移动模型,应将模型的PrimaryPart属性设置为模型内部的中心部分。这将充当模型移动的
原点

然后可以使用
model:SetPrimaryPartCFrame(cframe)
设置模型的cframe。您还可以通过使用
model:GetPrimaryPartCFrame()
来检索此属性,尽管我认为这只是
model.PrimaryPart.CFrame
的快捷方法

在代码中,它将如下所示:

-- Set PrimaryPart:
MODEL.PrimaryPart = MODEL.SomeCentralPart
...

-- CFrame movement:
local movement = CFrame.new(0, 10, 0)

-- Move the model:
MODEL:SetPrimaryPartCFrame(MODEL:GetPrimaryPartCFrame() * movement)

选项A:使用模型的方法 我认为你让这件事变得更加困难。无论何时遇到这样的问题,请务必检查当前提供的API。ROBLOX模型对象包含一个称为“TranslateBy”的漂亮方法,该方法使用Vector3参数来转换模型

使用
MODEL:TranslateBy(Vector3)
类似于通过CFrame移动模型,因为它忽略了碰撞

另一种选择是
MODEL:MoveTo(Vector3)
,它将整个模型移动到给定的Vector3世界位置。这样做的缺点是它确实会发生碰撞

使用TranslateBy方法可以获得相同的MoveTo效果,但不会产生碰撞:

MODEL:TranslateBy(Vector3Position - MODEL:GetModelCFrame().p)
选项B:编写自定义函数来操作模型的CFrame 另一种选择是完全操纵整个模型的CFrame。要做到这一点,您可以编写一个聪明的函数,相对于“原点”移动整个模型。这类似于在给定点和原点的栅格上移动形状,三维除外。使用ROBLOX的内置函数,这要容易得多

实现这一点的一个好方法是编写一个函数,该函数允许您实际为整个模型指定一个CFrame值。另一种方法是允许通过CFrame进行翻译

这里有一个例子:

function ModelCFrameAPI(model)

    local parts = {} -- Hold all BasePart objects
    local cf = {} -- API for CFrame manipulation

    do
        -- Recurse to get all parts:
        local function Scan(parent)
            for k,v in pairs(parent:GetChildren()) do
                if (v:IsA("BasePart")) then
                    table.insert(parts, v)
                end
                Scan(v)
            end
        end
        Scan(model)
    end

    -- Set the model's CFrame
        -- NOTE: 'GetModelCFrame()' will return the model's CFrame
        -- based on the given PrimaryPart. If no PrimaryPart is provided
        -- (which by default is true), ROBLOX will try to determine
        -- the center CFrame of the model and return that.
    function cf:SetCFrame(cf)
        local originInverse = model:GetModelCFrame():inverse()
        for _,v in pairs(parts) do
            v.CFrame = (cf * (originInverse * v.CFrame))
        end
    end

    -- Translate the model's CFrame
    function cf:TranslateCFrame(deltaCf)
        local cf = (model:GetModelCFrame() * deltaCf)
        self:SetCFrame(cf)
    end

    return cf
end


-- Usage:
local myModel = game.Workspace.SOME_MODEL
local myModelCF = ModelCFrameAPI(myModel)

-- Move to 10,10,10 and rotate Y-axis by 180 degrees:
myModelCF:SetCFrame(CFrame.new(10, 10, 10) * CFrame.Angles(0, math.pi, 0))

-- Translate by 30,0,-10 and rotate Y-axis by 90 degrees
myModelCF:TranslateCFrame(CFrame.new(30, 0, -10) * CFrame.Angles(0, math.pi/2, 0))

您的代码确实需要修复

你不应该使用永无止境的循环来让你的东西工作(除非这是唯一的方法)。 你应该以事件为基础采取行动

考虑使用以下方法:

结构:

Door [Model]
    DoorScript [Script]
    Button [Part]
    DoorOpen [BoolValue]
    Top [Model]
        Mabey [Part]
        Comeon [Part]
        Problynot [Part]
门框:

local Model = script.Parent
local Door = Model.Top
local Button = Model.Button
local DoorOpen = Model.DoorOpen

local Offset = 0
local ToOffset = 100
local Direction = 1

local StepLength = 0.1

local Moving = false

function StartMoving()
    if Moving then return end
    Moving = true
    while (DoorOpen.Value and Offset ~= ToOffset) or (not DoorOpen.Value and Offset ~= 0) do
        local Change = Offset
        Offset = math.max(0,math.min(ToOffset,Offset + StepLength * (DoorOpen.Value and 1 or -1)))
        Change = Offset - Change
        Top:TranslateBy(Vector3.new(0,Change,0))
        wait()
    end
    Moving = false
end
StartMoving()
DoorOpen.Changed:connect(StartMoving)

local Debounce = false
Button.Touched:connect(function()
    if Debounce then return end
    Debounce = true
    DoorOpen.Value = not DoorOpen.Value
    wait(4)
    Debounce = false
end)
您可能需要调整速度tho。

这可能很难。
除非上面的人能让它工作,否则你可能想为它寻找免费的模型。 一、 但是,您必须具有移动模型的脚本:

game.Workspace.Model:MoveTo(Vector3.new(0,0,0))

我很抱歉,我有另一个项目,忘记了这一点,当我看到这些答案时,我很高兴你们都帮助了我,我按照你们的剧本做了几次尝试,但我成功了。我花了很长时间才弄清楚上面写的是:翻译,因为它应该是门而不是顶,但感谢你们的帮助,这让我的士气提高了10倍。竖起大拇指。
game.Workspace.Model:MoveTo(Vector3.new(0,0,0))