PAYATHON 2026

Roblox 中如何让 Cylinder 沿 Raycast 轨迹正确对齐?

数据阿明

将圆柱体的长度设为 Size.X,再在原有的居中变换后绕局部 Y 轴旋转 90°,就能让 Cylinder 沿 Raycast 轨迹延伸。

linea.Shape = Enum.PartType.Cylinder
linea.Size = Vector3.new(largo, .1, .1)
linea.CFrame = CFrame.lookAt(iniciovisible, impacto)
    * CFrame.new(0, 0, -largo / 2)
    * CFrame.Angles(0, math.rad(90), 0)

为什么 Block 正常,Cylinder 却朝向侧面?

原代码使用 Vector3.new(.1, .1, largo),将 Part 沿局部 Z 轴拉长。CFrame.lookAt(iniciovisible, impacto) 又使局部负 Z 方向指向终点,因此长方体能沿射线延伸。

Cylinder 的中心轴沿局部 X 轴,长度由 Size.X 控制。如果仍将长度放在 Size.Z,增大的就是圆柱体的横截面尺寸,而非轴向长度。Roblox PartType 文档

因此,尺寸和旋转都需要调整:

  • 用 Vector3.new(largo, diameter, diameter) 设置长度和直径。
  • 在 lookAt 生成的坐标系中追加绕 Y 轴旋转 90°,让圆柱体的局部 X 轴与射线方向对齐。
  • 保留沿原局部负 Z 方向移动半个长度的操作,使圆柱体中心位于两点之间。

CFrame 的乘法顺序会影响结果。上述表达式将平移项写在附加旋转项之前。Roblox CFrame 文档

完整修改示例

示例沿用现有的事件和变量名,动画只增加直径、保持长度不变,以免圆柱体逐渐超出射线两端。

trazo.OnServerEvent:Connect(function(usuario, iniciovisible, impacto)
    local largo = (impacto - iniciovisible).Magnitude

    -- 两点重合时没有可显示的线段,也没有确定的朝向。
    if largo <= 0 then
        return
    end

    local linea = Instance.new("Part")
    linea.Shape = Enum.PartType.Cylinder
    linea.Anchored = true
    linea.CanCollide = false
    linea.Size = Vector3.new(largo, .1, .1)
    linea.Transparency = .2

    linea.CFrame = CFrame.lookAt(iniciovisible, impacto)
        * CFrame.new(0, 0, -largo / 2)
        * CFrame.Angles(0, math.rad(90), 0)

    linea.Parent = workspace.Residuos

    for count = 0, 3 do
        linea.Size += Vector3.new(0, .1, .1)
        linea.Transparency = math.min(1, linea.Transparency + .2)
        task.wait(.1)
    end

    linea:Destroy()
end)

示例假设 trazo 已绑定到对应的 RemoteEvent,workspace.Residuos 已存在,且两个位置参数都是有效的 Vector3。

为什么原来的尝试无效?

把长度改到 Y 轴仍然没有对齐

linea.Size = Vector3.new(.1, largo, .1)

Cylinder 的中心轴是局部 X 轴,因此这段代码仍未设置它的轴向长度。即使改成 Vector3.new(largo, .1, .1),也需要补上旋转,否则圆柱体的中心轴仍与 lookAt 指向终点的方向垂直。

修改 lookAt 的目标坐标会改变射线方向

CFrame.lookAt 的前两个参数分别是起点位置和目标位置。这里直接使用 iniciovisible 和 impacto 即可,不需要拆分或替换坐标分量。

原尝试中的 Vector3.new(inicioinvisible, inicioinvisible, impacto) 存在参数问题:Vector3.new 需要三个数值分量,而 impacto 在现有代码中作为位置向量使用。此外,该表达式缺少闭合括号,inicioinvisible 也没有在给出的片段中定义。

三个尺寸分量一起增加会改变线段长度

原动画每次执行:

linea.Size += Vector3.new(.1, .1, .1)

对于 Cylinder,这会同时增加长度和横截面尺寸。如果要在淡出过程中保持两端位置不变,只增加 Y、Z 分量即可:

linea.Size += Vector3.new(0, .1, .1)

以上轴向设置适用于 Part.Shape = Enum.PartType.Cylinder。如果使用 MeshPart 或其他自定义模型,需要根据模型自身的轴向调整旋转。

备注:内容仅供参考。