Roblox使用RemoteEvents实现零件鼠标跟随时出现Vector3参数无效报错
Roblox RemoteEvent实现零件跟随鼠标功能报错排查
触发的报错信息
workspace.Tool.Handle.Script6: invalid argument#3(Vector3 Expected, Got Instance)
报错核心含义:服务端给零件的Position属性赋值时,预期接收Vector3类型的坐标值,实际收到的是一个对象实例。
原始代码片段
本地脚本(Local Script)
local tool = script.Parent.Parent local rEvent = script.Parent.MoveToMousePos tool.Equipped:Connect(function(mouse) mouse.Move:Connect(function() rEvent:FireServer(mouse.Hit.p) end) end)
服务器脚本(Script)
local tool = script.Parent.Parent local rEvent = script.Parent.MoveToMousePos local part = workspace.Test rEvent.OnServerEvent:Connect(function(mousePos) part.Position = mousePos end)
代码问题定位
- 核心报错根源:Roblox的RemoteEvent在触发服务端回调时,会强制把「发起该事件的玩家实例」作为第一个固定参数传入,这个参数和本地端调用
FireServer时传的自定义参数没有关系。
当前服务端脚本的回调只写了mousePos一个形参,相当于把自动传入的玩家实例直接当成了鼠标坐标值,后续给part.Position赋值时,就会因为类型不匹配触发报错。 - 本地脚本逻辑问题:Tool.Equipped事件的回调入参是装备该工具的玩家实例,不是Mouse对象,当前代码把这个玩家实例命名为
mouse并调用mouse.Move属性,会直接在本地端触发属性不存在的报错,无法正常监听到鼠标移动事件。
修正后的可运行代码
修正后本地脚本
local Players = game:GetService("Players") local tool = script.Parent.Parent local rEvent = script.Parent.MoveToMousePos -- 主动获取本地玩家对应的Mouse对象 local mouse = Players.LocalPlayer:GetMouse() tool.Equipped:Connect(function() mouse.Move:Connect(function() -- 传递鼠标命中点的Vector3坐标给服务器 rEvent:FireServer(mouse.Hit.Position) end) end)
修正后服务器脚本
local tool = script.Parent.Parent local rEvent = script.Parent.MoveToMousePos local part = workspace.Test -- 第一个形参固定接收触发事件的玩家实例,第二个形参才是本地端传入的坐标 rEvent.OnServerEvent:Connect(function(triggerPlayer, mousePos) -- 加基础类型校验避免异常参数触发报错 if typeof(mousePos) == "Vector3" then part.Position = mousePos end end)
内容的提问来源于stack exchange,提问作者GameBuilderLol
相关产品推荐
相关产品推荐

