我有一个名为门的模型 在里面我有一个名为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()
如果您知道如何解决这个问题,我们将非常高兴地感激不尽。
答案 0 :(得分:1)
使用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)
我认为你使这个问题变得更加困难。每当遇到这样的问题时,请务必检查提供的当前API。 ROBLOX Model对象包含一个名为'TranslateBy'的漂亮方法,该方法采用Vector3参数来转换模型。
使用MODEL:TranslateBy(Vector3)
类似于通过CFrame移动模型,因为它忽略了冲突。
另一种选择是MODEL:MoveTo(Vector3)
,它将整个模型移动到给定的Vector3世界位置。这样做的缺点是 碰撞。
使用TranslateBy方法可以实现获得相同MoveTo效果但没有碰撞的一种方法:
MODEL:TranslateBy(Vector3Position - MODEL:GetModelCFrame().p)
另一种选择是完全操纵整个模型的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))