跳至正文
版本:最新版 - a1.148.0 ⚖️

追踪与光线投射

如何在运行时使用追踪与光线投射来获取世界信息。

追踪提供了一种在地图中进行延伸并获取线段上存在何种物体的反馈的方法。 使用它们时,你需要提供两个端点(起点和终点位置),物理系统会在这些点之间“追踪”一条线段,并报告它击中的任何 Actor。 追踪与其他软件套件中的光线投射光线追踪本质上是相同的。

以下示例将向你展示如何获取玩家正在注视的物体以及注视的位置。

Client/Index.lua
-- 每 100 毫秒执行一次追踪
Timer.SetInterval(function()
-- 获取屏幕中心位置
local viewport_2D_center = Viewport.GetViewportSize() / 2

-- 通过反向投影获取屏幕中心的 3D 位置
local viewport_3D = Viewport.DeprojectScreenToWorld(viewport_2D_center)

-- 使用该 3D 位置及其方向乘以 5000 进行追踪
-- 意味着它将在该方向上追踪 5000 个单位
local trace_max_distance = 5000

local start_location = viewport_3D.Position
local end_location = viewport_3D.Position + viewport_3D.Direction * trace_max_distance

-- 确定我们要追踪的目标对象类型(WorldStatic - 静态网格体,以及 PhysicsBody - 道具)
local collision_trace = CollisionChannel.WorldStatic | CollisionChannel.PhysicsBody

-- 设置追踪模式(我们希望它返回实体并绘制一条调试线条)
local trace_mode = TraceMode.ReturnEntity | TraceMode.DrawDebug

-- 最后一个参数为 true 意味着它将在追踪的线段中绘制一条调试线条
local trace_result = Trace.LineSingle(start_location, end_location, collision_trace, trace_mode)

-- 如果击中某些物体,则在对应位置绘制一个调试点
if (trace_result.Success) then

-- 如果击中 Actor,则将点变为红色或绿色
local color = Color(1, 0, 0) -- 红色

if (trace_result.Entity) then
color = Color(0, 1, 0) -- 绿色

-- 在这里你可以检查击中了哪个 actor,例如:
-- if (trace_result.Entity:GetType() == "Character") then ...
end

-- 在击中位置绘制一个持续 5 秒、大小为 10 的调试点
Debug.DrawPoint(trace_result.Location, color, 5, 10)
end
end, 100)
提示

正如你所见,我们可以向 Trace 传递按位运算符,以便一次追踪多个 CollisionChannel! 在 CollisionChannels 之间使用 | 即可实现此目的。