FiveM ESX Legacy框架运行脚本报vector3(...) argument 1 had type nil求助
问题根因定位
报错vector3(...) argument 1 had type nil的核心原因是ESX框架内部将传入的坐标参数转换为vector3类型时,读取到了空值,具体对应你代码中的几种可能场景:
- 调用
spawnEndObject时传入的x/y/z坐标参数存在空值,逐层传递到deleteLastObject后,传给ESX.Game.GetClosestObject的坐标表中存在nil字段,框架转vector3时报错 - 你使用的二次修改版ESX Legacy调整了
ESX.Game.GetClosestObject的参数要求,新版本第二个参数需要直接传入vector3类型,不兼容你当前写的{x=x,y=y,z=z}表结构,框架解析坐标时读取到nil值 - 你修改ESX框架时改动了
ESX.Game.GetClosestObject的坐标解析逻辑,导致坐标字段读取错误拿到nil
修复方案
- 首先修改
deleteLastObject函数,增加参数合法性校验,避免空值传入,同时兼容ESX的参数要求:
function deleteLastObject(object_end, x, y, z) -- 校验参数合法性,任意为空直接终止执行避免报错 if not object_end or not x or not y or not z then return end local targetCoords = vector3(x, y, z) local closestObj = ESX.Game.GetClosestObject(object_end, targetCoords) -- 额外校验找到的物体是否存在,避免删除空实体报错 if closestObj and DoesEntityExist(closestObj) then ESX.Game.DeleteObject(closestObj) end end
- 同步修改
spawnEndObject函数,增加入参校验同时替换弃用API:
function spawnEndObject(object_start, object_end, x, y, z) -- 入参合法性校验 if not isActionStarted or not object_start or not object_end or not x or not y or not z then return end ESX.Game.SpawnObject(object_end, vector3(x, y, z), function(obj) deleteLastObject(object_start, x, y, z) -----------> line 257 -- 弃用的GetPlayerPed(-1)替换为原生稳定接口PlayerPedId() SetEntityHeading(obj, GetEntityHeading(PlayerPedId())) PlaceObjectOnGroundProperly(obj) end) end
- 如果你自行修改过ESX的
ESX.Game.GetClosestObject实现,可核对原生逻辑:官方原版ESX Legacy的该函数第二个参数同时支持坐标表和vector3两种格式,如果你修改后仅支持vector3,按上述写法统一传vector3即可。
内容的提问来源于stack exchange,提问作者unknownuser
相关产品推荐
相关产品推荐

