在 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