代码之家  ›  专栏  ›  技术社区  ›  Lukas Raby

玩Tween后,零件位置被锁定

  •  1
  • Lukas Raby  · 技术社区  · 1 年前

    我正试图用镊子平稳地移动零件。我当前的脚本创建了一个零件,然后在一秒钟内将其移动到目标。由于某种原因,零件的位置在移动后无法通过脚本或移动工具更改。

    这是我的LocalScript,它将零件的创建和移动绑定到TextButton。

    local tweenService = game:GetService("TweenService")
    local runService = game:GetService("RunService")
    local player = game.Players.LocalPlayer
    
    local RunServiceEvent = nil
    local tweenInfo = TweenInfo.new(1, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut)
    
    function SpawnPart()
        local part = Instance.new("Part")
        part.Anchored = true
        part.Parent = game.Workspace.Clutter.Coins
    
        local startPos = Vector3.new(0, 2, 0)
        part.Position = startPos
    
        local TargetPosition = Vector3.new(5, 2, 0)
    
        local Tween = tweenService:Create(part, tweenInfo, {Position = TargetPosition})
        Tween:Play()
    
        local StartTime = tick()
        RunServiceEvent = runService.RenderStepped:Connect(function()
            local Time = (tick() - StartTime) / tweenInfo.Time
    
            if part == nil then return end
    
            if Time > 1 then
                part.Position = TargetPosition
                return
            end
        end)
    
        task.spawn(function()
            Tween.Completed:Wait()
            task.wait()
            RunServiceEvent = nil
        end)
    end
    
    player:WaitForChild("PlayerGui"):WaitForChild("ScreenGui"):WaitForChild("TextButton").Activated:Connect(SpawnPart)
    

    要复制,请创建以下结构,然后玩游戏并单击GUI按钮。

    ├── StarterGui
    │   ├── ScreenGui
    │   │   ├── TextButton
    ├── StarterPlayer
    │   ├── StarterPlayerScripts
    │   │   ├── LocalScript
    

    Tween完成后,移动工具(或试图通过脚本移动)对新零件不再有任何影响。

    您还可以下载此.rbxl文件: TestPlace

    1 回复  |  直到 1 年前
        1
  •  1
  •   Anerdw    1 年前

    问题在于你正在做的工作 RunServiceEvent 。似乎你正试图确保Tween结束后零件位于目标位置,然后删除 RenderStepped 不幸的是, RunServiceEvent = nil 不会为您删除它-它将对象与该名称解除绑定,但不会从内存中删除对象。

    这意味着一秒钟后,您的脚本将不断地将零件移动到目标位置,有效地将其锁定到位。

    好消息是,你根本不需要那一点!如果完全删除该部分,您的脚本可以正常工作:

    local tweenService = game:GetService("TweenService")
    local runService = game:GetService("RunService")
    local player = game.Players.LocalPlayer
    
    local RunServiceEvent = nil
    local tweenInfo = TweenInfo.new(1, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut)
    
    function SpawnPart()
        local part = Instance.new("Part")
        part.Anchored = true
        part.Parent = game.Workspace.Clutter.Coins
    
        local startPos = Vector3.new(0, 2, 0)
        part.Position = startPos
    
        local TargetPosition = Vector3.new(5, 2, 0)
    
        local Tween = tweenService:Create(part, tweenInfo, {Position = TargetPosition})
        Tween:Play()
    end
    
    player:WaitForChild("PlayerGui"):WaitForChild("ScreenGui"):WaitForChild("TextButton").Activated:Connect(SpawnPart)
    

    如果你真的想确保这个部分最终出现在正确的位置,你也可以让你的脚本等到Tween完成使用 task.delay :

    local tweenService = game:GetService("TweenService")
    local runService = game:GetService("RunService")
    local player = game.Players.LocalPlayer
    
    local RunServiceEvent = nil
    local tweenInfo = TweenInfo.new(1, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut)
    
    function SpawnPart()
        local part = Instance.new("Part")
        part.Anchored = true
        part.Parent = game.Workspace.Clutter.Coins
    
        local startPos = Vector3.new(0, 2, 0)
        part.Position = startPos
    
        local TargetPosition = Vector3.new(5, 2, 0)
    
        local Tween = tweenService:Create(part, tweenInfo, {Position = TargetPosition})
        Tween:Play()
    
        task.delay(tweenInfo.Time, function()
            part.Position = TargetPosition
        end)
    end
    
    player:WaitForChild("PlayerGui"):WaitForChild("ScreenGui"):WaitForChild("TextButton").Activated:Connect(SpawnPart)