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

时间:2014-01-21 21:59:32

标签: lua roblox

我有一个名为门的模型 在里面我有一个名为Open的BoolValue 我有一个名为Top的模型,其中包含名为Work Mabey Comeon和Proboblynot的所有门块 我有阻止,当触摸时应该使Top向上移动

直接在门内我有这个脚本

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 

在触摸时应该激活的按钮内部

script.Parent.Touched:connect(function()
script.Parent.Parent.Open.Value = not script.Parent.Parent.Open.Value
end)

script.Parent.Parent.Open.Changed:connect(Update)
Update()

如果您知道如何解决这个问题,我们将非常高兴地感激不尽。

4 个答案:

答案 0 :(得分:1)

2015年11月更新:

使用PrimaryPart

自写这篇文章以来,ROBLOX在API方面发生了很大变化。要移动所请求的模型,应将模型的PrimaryPart属性设置为模型内的中心部分。这将作为模型运动的origin

然后,您可以使用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 Model对象包含一个名为'TranslateBy'的漂亮方法,该方法采用Vector3参数来转换模型。

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

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

使用TranslateBy方法可以实现获得相同MoveTo效果但没有碰撞的一种方法:

MODEL:TranslateBy(Vector3Position - MODEL:GetModelCFrame().p)

选项B:编写自定义函数来操作模型的CFrame

另一种选择是完全操纵整个模型的CFrame。要做到这一点,你可以写一个聪明的函数,它将相对于'origin'点移动整个模型。这与给定点和原点的网格上的移动形状类似,除了三维。使用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))

答案 1 :(得分:0)

这可以用来移动模型,尝试在代码中添加这样的东西。它更有活力。

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

答案 2 :(得分:0)

您的代码确实需要修复。

你不应该使用永无止境的循环来使你的东西工作(除非这是唯一的方法)。 您应该根据事件制定行动。

考虑使用它:

结构:

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

DoorScript:

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)

你可能想要调整速度。

答案 3 :(得分:0)

这可能很难 除非上面的人员让它工作,否则你可能希望寻找免费模型。 但是,我有一个移动模型的脚本:

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