GetHitResultUnderCursor()

在上一篇文章中,我们已经获取到 APlayerController 控制器。在这一篇文章中,我们学习它的一个成员函数 GetHitResultUnderCursor()

GetHitResultUnderCursor() 的作用是,以摄像机位置为起点,以鼠标位置为终点,发出一条射线,检测它击中的对象,并返回结果。它的函数原型为:

  • bool GetHitResultUnderCursor(
  •        ECollisionChannel TraceChannel,
  •        bool bTraceComplex,
  •        FHitResult& HitResult) const;

TraceChannel 参数指定射线检测的碰撞通道,此处指定为 ECC_Visibility,表示检测所有可见物体;bTraceComplex 参数指定是否使用复杂碰撞;HitResult 指定输出参数,保存射线检测的结果。

如代码清单 1 所示,我们在 Tick() 函数内,每帧进行射线检测。PlayerControllerRef 是上一篇文章中获取的玩家控制器。我们用 DrawDebugSphere() 函数可视化碰撞点。

代码清单 1 射线检测
  1. // Called every frame
  2. void ATank::Tick(float DeltaTime)
  3. {
  4.     Super::Tick(DeltaTime);
  5.  
  6.     if (PlayerControllerRef)
  7.     {
  8.         FHitResult HitResult;
  9.         PlayerControllerRef->GetHitResultUnderCursor(
  10.             ECollisionChannel::ECC_Visibility,
  11.             false, HitResult);
  12.  
  13.         DrawDebugSphere(GetWorld(),
  14.             HitResult.ImpactPoint,
  15.             25.0f, 12, FColor::Red);
  16.     }
  17. }

实现好代码之后,我们可以运行程序。如图 1 所示,我们移动鼠标,可以看到绘制的不同方位的碰撞点。在 Cmd 窗体里,我们输入 show collision 指令,可以显示各个组件的碰撞体。

图1 运行结果