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

Roblox Studio挖矿游戏:如何实现仅持镐子时才能开采矿石?

解决Roblox挖矿游戏的镐子机制:装备触发+动画音效播放

嘿,作为刚从模型制作转脚本开发的新手,你已经开了个好头!咱们把你的初始代码完善一下,实现仅装备镐子时才能挖矿,同时播放对应R6/R15动画和挖矿音效的功能。

先理清楚核心要点:

  • Tool.Activated事件本身只有当工具被装备到角色身上时才会触发,所以天然满足“仅装备时可挖矿”的要求,不用额外做复杂检测~
  • 动画要从当前装备的镐子里取,而不是StarterPack里的副本(因为StarterPack的工具会被复制到玩家背包/角色身上,原对象不会跟着走)
  • 需要根据玩家角色的体型(R6/R15)加载对应的动画
  • 挖矿时要播放音效,记得处理音效的重复播放问题(比如防止连续点击时音效重叠)

完善后的代码(附详细注释)

把这段代码替换你原来的脚本,记得提前把R6/R15动画和挖矿音效放到镐子Tool对象里:

-- 获取当前镐子工具
local tool = script.Parent

-- 从工具内获取动画和音效(提前把这些资源拖进Tool里)
local r6Anim = tool:WaitForChild("Pickaxe Anim R6")
local r15Anim = tool:WaitForChild("Pickaxe Anim R15")
local mineSound = tool:WaitForChild("MineSound")

-- 存储动画控制器,避免重复加载
local animator = nil
local miningAnimation = nil

-- 当工具被装备时,初始化动画控制器
tool.Equipped:Connect(function(player)
    -- 获取角色的Humanoid
    local humanoid = player.Character:WaitForChild("Humanoid")
    -- 获取Animator组件(播放动画必须用这个)
    animator = humanoid:WaitForChild("Animator")
    
    -- 根据角色体型选择对应的动画
    if humanoid.RigType == Enum.HumanoidRigType.R6 then
        miningAnimation = animator:LoadAnimation(r6Anim)
    else
        miningAnimation = animator:LoadAnimation(r15Anim)
    end
end)

-- 当工具被激活(玩家点击)时触发挖矿逻辑
tool.Activated:Connect(function()
    -- 检查动画是否已初始化(确保工具已装备)
    if not miningAnimation then return end
    
    -- 处理音效:如果音效正在播放就先停止,再重新播放
    if mineSound.IsPlaying then
        mineSound:Stop()
    end
    mineSound:Play()
    
    -- 播放挖矿动画:如果动画正在播放就重置,否则播放
    if miningAnimation.IsPlaying then
        miningAnimation:Stop()
    end
    miningAnimation:Play()
    
    -- 【可选】添加矿石检测逻辑(用射线检测前方的矿石)
    local player = game.Players:GetPlayerFromCharacter(tool.Parent)
    if not player then return end
    
    local character = player.Character
    local rootPart = character:WaitForChild("HumanoidRootPart")
    
    -- 发射一条从角色眼睛向前的射线,检测矿石
    local rayParams = RaycastParams.new()
    rayParams.FilterType = Enum.RaycastFilterType.Blacklist
    rayParams.FilterDescendantsInstances = {character}
    
    local rayResult = workspace:Raycast(rootPart.Position, rootPart.CFrame.LookVector * 5, rayParams)
    if rayResult then
        local hitPart = rayResult.Instance
        -- 假设你的矿石都有"Ore"标签,这里判断是否是矿石
        if hitPart:FindFirstAncestorWhichIsA("Model") and hitPart.Parent:FindFirstChild("Ore") then
            -- 这里写开采逻辑,比如销毁矿石、给玩家加资源等
            print("开采到矿石啦!")
            -- hitPart.Parent:Destroy() -- 示例:销毁矿石模型
        end
    end
end)

-- 当工具被卸下时,停止动画和音效
tool.Unequipped:Connect(function()
    if miningAnimation and miningAnimation.IsPlaying then
        miningAnimation:Stop()
    end
    if mineSound.IsPlaying then
        mineSound:Stop()
    end
end)

额外注意事项:

  • 确保你的动画是Action类型的动画,这样播放时不会和其他动作冲突
  • 音效的Looped属性设为false,避免一直重复播放
  • 矿石模型可以添加一个BoolValue或者直接打标签,方便射线检测时识别
  • 如果要做挖矿冷却,可以加个cooldown变量,比如设置1秒冷却,防止玩家疯狂点击

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:42:36