GetHitResultUnderCursor()
在上一篇文章中,我们已经获取到 APlayerController 控制器。在这一篇文章中,我们学习它的一个成员函数 GetHitResultUnderCursor()。
GetHitResultUnderCursor() 的作用是,以摄像机位置为起点,以鼠标位置为终点,发出一条射线,检测它击中的对象,并返回结果。它的函数原型为:
- bool GetHitResultUnderCursor(
- ECollisionChannel TraceChannel,
- bool bTraceComplex,
- FHitResult& HitResult) const;
TraceChannel 参数指定射线检测的碰撞通道,此处指定为 ECC_Visibility,表示检测所有可见物体;bTraceComplex 参数指定是否使用复杂碰撞;HitResult 指定输出参数,保存射线检测的结果。
如代码清单 1 所示,我们在 Tick() 函数内,每帧进行射线检测。PlayerControllerRef 是上一篇文章中获取的玩家控制器。我们用 DrawDebugSphere() 函数可视化碰撞点。
- // Called every frame
- void ATank::Tick(float DeltaTime)
- {
- Super::Tick(DeltaTime);
- if (PlayerControllerRef)
- {
- FHitResult HitResult;
- PlayerControllerRef->GetHitResultUnderCursor(
- ECollisionChannel::ECC_Visibility,
- false, HitResult);
- DrawDebugSphere(GetWorld(),
- HitResult.ImpactPoint,
- 25.0f, 12, FColor::Red);
- }
- }
实现好代码之后,我们可以运行程序。如图 1 所示,我们移动鼠标,可以看到绘制的不同方位的碰撞点。在 Cmd 窗体里,我们输入 show collision 指令,可以显示各个组件的碰撞体。
