You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Roblox开发:实现Proximity Prompt触发动画、限制移动及ID物品存取

完善Roblox Proximity Prompt脚本:限制移动+物品管理+动画播放

原脚本已经实现了触发时播放动画、背包内"ID"物品的暂存与归还功能,但缺少限制玩家移动的核心逻辑。以下是整合所有需求的完整优化版本:

local proximityPrompt = script.Parent
local animation = script:WaitForChild("Dance")
local ServerStorage = game:GetService("ServerStorage")
local backpacks = {}
local ID_ITEM_NAME = "ID" -- 用常量统一物品名称,方便维护

-- 玩家加入时初始化存储文件夹
game.Players.PlayerAdded:Connect(function(player)
    local storageFolder = Instance.new("Folder")
    storageFolder.Name = tostring(player.UserId)
    storageFolder.Parent = ServerStorage
    backpacks[player.UserId] = storageFolder
end)

-- 玩家离开时清理存储
game.Players.PlayerRemoving:Connect(function(player)
    local storage = backpacks[player.UserId]
    if storage then
        storage:Destroy()
        backpacks[player.UserId] = nil
    end
end)

-- 统一处理Proximity Prompt触发逻辑
proximityPrompt.Triggered:Connect(function(player)
    local character = player.Character
    if not character then return end
    
    local humanoid = character:WaitForChild("Humanoid")
    local backpack = player.Backpack
    local equippedTool = character:FindFirstChildWhichIsA("Tool")
    local playerId = player.UserId
    local storage = backpacks[playerId]

    -- 先处理物品:如果物品在背包/身上,暂存;否则归还
    local hasItem = backpack:FindFirstChild(ID_ITEM_NAME) or (equippedTool and equippedTool.Name == ID_ITEM_NAME)
    if hasItem then
        -- 将物品移到存储文件夹
        local itemToStore = backpack:FindFirstChild(ID_ITEM_NAME) or equippedTool
        itemToStore.Parent = storage
    else
        -- 从存储归还物品到背包
        local storedItem = storage:FindFirstChild(ID_ITEM_NAME)
        if storedItem then
            storedItem.Parent = backpack
        end
    end

    -- 限制玩家移动
    local originalWalkSpeed = humanoid.WalkSpeed
    local originalJumpPower = humanoid.JumpPower
    humanoid.WalkSpeed = 0
    humanoid.JumpPower = 0

    -- 播放动画并在结束后恢复移动
    local danceAnim = humanoid:LoadAnimation(animation)
    danceAnim.Looped = false -- 先设置循环属性再播放,避免生效延迟
    danceAnim:Play()

    danceAnim.Stopped:Connect(function()
        -- 动画结束后恢复移动能力
        humanoid.WalkSpeed = originalWalkSpeed
        humanoid.JumpPower = originalJumpPower
    end)
end)

关键优化说明

  1. 合并触发逻辑:把原脚本中两个独立的Triggered事件监听合并为一个,避免逻辑冲突和重复触发
  2. 移动限制实现:
    • 触发时记录玩家原有的WalkSpeed和JumpPower
    • 将两者设为0,彻底限制移动和跳跃
    • 绑定动画的Stopped事件,动画结束后自动恢复玩家的移动能力
  3. 物品逻辑优化:
    • 用常量ID_ITEM_NAME统一物品名称,后续修改更方便
    • 简化物品存在性判断,同时覆盖背包和手持的情况
  4. 代码结构优化:将玩家加入/离开的逻辑放在前面,触发逻辑集中处理,可读性更强

内容的提问来源于stack exchange,提问作者Rollininst_12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 04:23:13