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

将Click Detector替换为Proximity Prompt实现门交互的技术求助

将ClickDetector门交互切换为Proximity Prompt触发的实现方案

要把现有基于ClickDetector的门交互改成Proximity Prompt触发(按E键交互),只需两步:修改组件配置 + 调整代码事件绑定,以下是具体实现:

第一步:替换交互组件

  • 找到Button1和Button2对象,删除各自的ClickDetector
  • 给每个按钮添加ProximityPrompt组件,建议配置:
    • ActionText:设置为“按E 开关门”(或根据门状态动态调整,见下文可选优化)
    • MaxActivationDistance:设置为2-3(适配FPS游戏的交互距离)
    • KeyboardKeyCode:保持默认E即可

第二步:修改Lua代码

核心是把MouseClick事件替换为ProximityPrompt.Triggered,同时提取重复逻辑减少冗余,修改后的完整代码如下:

local tweenService = game:GetService("TweenService")

local Door = script.Parent
local DoorMain = script.Parent.Parent.Frame
local DoorStatus = "Closed"
local Debounce = false

-- 模型补间函数(原有逻辑保留)
local function tweenModel(model, cframe, time)
    local cframeValue = Instance.new("CFrameValue")
    cframeValue.Value = model:GetPrimaryPartCFrame()

    cframeValue:GetPropertyChangedSignal("Value"):Connect(function()
        model:SetPrimaryPartCFrame(cframeValue.Value)
    end)

    local info = TweenInfo.new(time, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut)
    local tween = tweenService:Create(cframeValue, info, {Value = cframe})
    tween:Play()

    tween.Completed:Connect(function()
        cframeValue:Destroy()
    end)
end

-- 门位置缓存(原有逻辑保留)
local cframes = {
    door1orig = Door.Door1.Center.CFrame,
    door1TGP = Door.Door1.ToGoPos.CFrame,
    door2orig = Door.Door2.Center.CFrame,
    door2TGP = Door.Door2.ToGoPos.CFrame
}

-- 开门逻辑(原有逻辑保留)
local function Open()
    tweenModel(Door.Door1, cframes.door1TGP, 5)
    task.wait(2.35)
    tweenModel(Door.Door2, cframes.door2TGP, 2.65)
    task.wait(3)
end

-- 关门逻辑(原有逻辑保留)
local function Close()
    tweenModel(Door.Door1, cframes.door1orig, 5)
    tweenModel(Door.Door2, cframes.door2orig, 3)
    task.wait(5)
end

-- 提取通用触发逻辑,避免重复代码
local function HandleDoorTrigger(button)
    if Debounce then return end
    Debounce = true

    button.Click:Play()
    DoorMain.Sound:Play()

    if DoorStatus == "Closed" then
        Open()
        task.wait(1)
        DoorStatus = "Opened"
    else
        Close()
        task.wait(1)
        DoorStatus = "Closed"
    end

    Debounce = false
end

-- 绑定ProximityPrompt的Triggered事件
Door.Button1.ProximityPrompt.Triggered:Connect(function()
    HandleDoorTrigger(Door.Button1)
end)

Door.Button2.ProximityPrompt.Triggered:Connect(function()
    HandleDoorTrigger(Door.Button2)
end)

-- 可选优化:动态更新ProximityPrompt的提示文本
local function updatePromptText()
    local promptText = DoorStatus == "Closed" and "按E 开门" or "按E 关门"
    Door.Button1.ProximityPrompt.ActionText = promptText
    Door.Button2.ProximityPrompt.ActionText = promptText
end

-- 初始化提示文本,后续在状态改变时调用updatePromptText()即可
updatePromptText()

关键修改说明

  1. 事件替换:用ProximityPrompt.Triggered替代ClickDetector.MouseClick,完全匹配FPS游戏按E交互的逻辑
  2. 代码精简:把两个按钮的重复触发逻辑提取到HandleDoorTrigger函数,减少冗余代码
  3. 兼容原有逻辑:保留了原有的补间动画、音效播放、防抖机制和门状态控制,确保功能和之前完全一致
  4. 可选优化:动态更新提示文本,让玩家直观看到当前可执行的操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:30:52