在 Roblox 中创建一个飞行物体来检测与固定物体的碰撞
Creating a flying object that detects impact with a fixed object in Roblox
我正在尝试创建一个飞行物体,它基本上可以被放置在其路径中的另一个物体困住。我在 hit/touch 检测方面遇到问题。
对于飞行物体,我们称之为“bug”,我创建了一个模型,其中包含一个名为“Primary”的 PrimaryPart,Primary 部分设置了“CanCollide”、“CanTouch”和“Anchored”为真。
当我使用上述设置 运行 以下脚本时,事情 看起来 就像我期望的那样,只要错误触及我的角色,我就可以看到日志条目,但我看不到错误何时触及我的网络对象。我的理解是,因为两个对象都是“锚定的”,所以不支持碰撞检测(即使其中一个是四处移动的错误)。当我取消选中网络的“锚定”时,它会掉下来。当我取消选中该错误的“锚定”时,它会不稳定地飞行并消失。有没有一种方法可以取消锚定错误,但仍能控制它,按照指示飞行直到被捕获?
local TweenService = game:GetService("TweenService")
local bugAnchor = script.Parent.Parent.BugAnchor
local bug = script.Parent.PrimaryPart
local function onBugTouched(part)
if part:IsDescendantOf(bug) then return end
print(bug:GetFullName() .. " was touched by " .. part:GetFullName())
end
local function randomGoal(anchor)
local random = Random.new()
local randomX = random:NextNumber(-30, 30)
local randomY = random:NextNumber(-15, 15)
local randomZ = random:NextNumber(-30, 30)
return anchor.Position + Vector3.new(randomX, randomY, randomZ)
end
bug.Touched:connect(onBugTouched)
while true do
wait(1)
local goal = randomGoal(bugAnchor)
local move = TweenService:Create(bug, TweenInfo.new(), {Position = goal})
bug.CFrame = CFrame.lookAt(bug.Position,(goal))
move:play()
end
两个锚定对象不能相互触发 Touched 事件,因为引起碰撞的运动必须由物理运动引起。手动更改 CFrame 不会这样做,并且 achnored 部分不受物理影响。
如果您取消锚定错误,它将受到重力的影响,这可能解释观察到的“不稳定”运动。
你可以禁用gravity or to make the bug fly by appling an upward force克服重力的
或者您可以使用 https://developer.roblox.com/en-us/api-reference/function/BasePart/GetTouchingParts
手动检查部件是否接触
如果您仔细阅读手册,我相信您会找到更多选项。
我找到了一个有效的解决方案来解决未锚定时控制错误的问题。由于两个问题,虫子飞行看起来很不稳定:等待周期中的重力和旋转惯性导致虫子因其他力而翻转和旋转。锚定时没有出现任何问题。在等待周期中,虫子会保持静止,并在一秒钟后重新出现,就好像它已经传送到重力自然会占据它的位置一样。它还会在它的路径上翻滚,看起来很糟糕。
我通过在我也添加到 body 的附件上添加一个 VectorForce 来解决重力问题。我让主要 body 部分继续具有质量,并将所有焊接部分的“Massless”设置为 true。它使 bug 在等待周期内保持静止。 VectorForce.Force“y”参数需要设置为(重力 * bug 的质量),在我的例子中大约为 2000。
翻转和旋转是通过向我的脚本中的错误添加一个“BodyGyro”实例来处理的。它就像一个陀螺仪,可以防止 object 旋转。
local bodyGyro = Instance.new("BodyGyro")
bodyGyro.Parent=bug
bodyGyro.MaxTorque = Vector3.new(math.huge, math.huge, math.huge)
每当我想改变虫子的方向时,我都会重置 body陀螺仪的 CFrame 以匹配虫子的 CFrame。
while true do
wait(1)
local goal = randomGoal(bugAnchor)
local move = TweenService:Create(bug, TweenInfo.new(), {Position = goal})
bug.CFrame = CFrame.lookAt(bug.Position,(goal))
bodyGyro.CFrame=bug.CFrame
move:play()
end
我正在尝试创建一个飞行物体,它基本上可以被放置在其路径中的另一个物体困住。我在 hit/touch 检测方面遇到问题。
对于飞行物体,我们称之为“bug”,我创建了一个模型,其中包含一个名为“Primary”的 PrimaryPart,Primary 部分设置了“CanCollide”、“CanTouch”和“Anchored”为真。
当我使用上述设置 运行 以下脚本时,事情 看起来 就像我期望的那样,只要错误触及我的角色,我就可以看到日志条目,但我看不到错误何时触及我的网络对象。我的理解是,因为两个对象都是“锚定的”,所以不支持碰撞检测(即使其中一个是四处移动的错误)。当我取消选中网络的“锚定”时,它会掉下来。当我取消选中该错误的“锚定”时,它会不稳定地飞行并消失。有没有一种方法可以取消锚定错误,但仍能控制它,按照指示飞行直到被捕获?
local TweenService = game:GetService("TweenService")
local bugAnchor = script.Parent.Parent.BugAnchor
local bug = script.Parent.PrimaryPart
local function onBugTouched(part)
if part:IsDescendantOf(bug) then return end
print(bug:GetFullName() .. " was touched by " .. part:GetFullName())
end
local function randomGoal(anchor)
local random = Random.new()
local randomX = random:NextNumber(-30, 30)
local randomY = random:NextNumber(-15, 15)
local randomZ = random:NextNumber(-30, 30)
return anchor.Position + Vector3.new(randomX, randomY, randomZ)
end
bug.Touched:connect(onBugTouched)
while true do
wait(1)
local goal = randomGoal(bugAnchor)
local move = TweenService:Create(bug, TweenInfo.new(), {Position = goal})
bug.CFrame = CFrame.lookAt(bug.Position,(goal))
move:play()
end
两个锚定对象不能相互触发 Touched 事件,因为引起碰撞的运动必须由物理运动引起。手动更改 CFrame 不会这样做,并且 achnored 部分不受物理影响。
如果您取消锚定错误,它将受到重力的影响,这可能解释观察到的“不稳定”运动。
你可以禁用gravity or to make the bug fly by appling an upward force克服重力的
或者您可以使用 https://developer.roblox.com/en-us/api-reference/function/BasePart/GetTouchingParts
手动检查部件是否接触如果您仔细阅读手册,我相信您会找到更多选项。
我找到了一个有效的解决方案来解决未锚定时控制错误的问题。由于两个问题,虫子飞行看起来很不稳定:等待周期中的重力和旋转惯性导致虫子因其他力而翻转和旋转。锚定时没有出现任何问题。在等待周期中,虫子会保持静止,并在一秒钟后重新出现,就好像它已经传送到重力自然会占据它的位置一样。它还会在它的路径上翻滚,看起来很糟糕。
我通过在我也添加到 body 的附件上添加一个 VectorForce 来解决重力问题。我让主要 body 部分继续具有质量,并将所有焊接部分的“Massless”设置为 true。它使 bug 在等待周期内保持静止。 VectorForce.Force“y”参数需要设置为(重力 * bug 的质量),在我的例子中大约为 2000。
翻转和旋转是通过向我的脚本中的错误添加一个“BodyGyro”实例来处理的。它就像一个陀螺仪,可以防止 object 旋转。
local bodyGyro = Instance.new("BodyGyro")
bodyGyro.Parent=bug
bodyGyro.MaxTorque = Vector3.new(math.huge, math.huge, math.huge)
每当我想改变虫子的方向时,我都会重置 body陀螺仪的 CFrame 以匹配虫子的 CFrame。
while true do
wait(1)
local goal = randomGoal(bugAnchor)
local move = TweenService:Create(bug, TweenInfo.new(), {Position = goal})
bug.CFrame = CFrame.lookAt(bug.Position,(goal))
bodyGyro.CFrame=bug.CFrame
move:play()
end