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

FiveM Lua脚本:进入区域单次打印 离开重进才再次触发

FiveM 区域进入单次触发逻辑修复

问题根因

原逻辑没有做状态留存,每次循环只要检测到距离小于阈值就直接执行打印,没有区分「首次进入」和「停留中」两种状态,才会导致重复输出。

实现方案

引入布尔值做状态标记,做进入/离开的边缘检测:

  • 初始化标记位记录玩家上一次检测时是否在区域内
  • 每次循环先计算当前玩家是否在任意配置区域范围内
  • 仅当上一次状态为不在区域、当前状态为在区域时,执行一次打印逻辑
  • 每次检测结束后更新标记位为当前状态,玩家离开区域后标记位自动重置,下次进入可重新触发

完整修复代码

-- 初始化区域状态:默认玩家不在检测区域内
local isInAnyZone = false

CreateThread(function()
    while true do
        Wait(1000)
        local playerCoords = GetEntityCoords(PlayerPedId())
        local currentZoneState = false

        -- 遍历所有配置的检测区域
        for _, zoneConfig in pairs(zone) do
            -- 注意:GetDistanceBetweenCoords需要拆分传入xyz坐标,最后一个参数启用z轴高度检测
            local distance = GetDistanceBetweenCoords(
                zoneConfig.x, zoneConfig.y, zoneConfig.z,
                playerCoords.x, playerCoords.y, playerCoords.z,
                true
            )
            if distance < 100 then
                currentZoneState = true
                break
            end
        end

        -- 首次进入区域时触发一次逻辑
        if not isInAnyZone and currentZoneState then
            print('test')
        end

        -- 更新状态供下次循环判断
        isInAnyZone = currentZoneState
    end
end)

额外优化点:把玩家坐标、玩家实体的获取提到循环外层,避免重复调用原生接口带来不必要的性能消耗;使用PlayerPedId()替代旧版的GetPlayerPed(-1)写法更符合当前FiveM的编码规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 21:39:16