AddActorLocalOffset()

在这篇文章中,我们让坦克动起来。

在此之前,让我们在编辑器视口中了解一下世界坐标系和局部坐标系。如图 1 所示,在视口的左下角是世界坐标系。默认操作轴是世界坐标系,可以在视口右上角(世界坐标系的图标是一个地球)切换为局部坐标系,局部坐标的图标是一个立方体。

在局部坐标系中,X 轴是 Forward 方向。

图1 坐标系

之前我们接触过 SetActorLocation() 函数,它设置的是 Actor 的世界坐标位置。这篇文章介绍一个更方便的函数:AddActorLocalOffset() 函数用于沿着 Actor 的局部坐标系方向移动其位置。它的原型声明为:

  • void AddActorLocalOffset(FVector DeltaLocation,
  •     bool bSweep=false,
  •     FHitResult* OutSweepHitResult=nullptr,
  •     ETeleportType Teleport = ETeleportType::None);

DeltaLocation 参数指定要移动的局部位移向量;bSweep 参数指定是否进行碰撞检测;OutSweepHitResult 参数用于获取碰撞结果;Teleport 参数指定是否瞬移,主要用于网络同步或避免插值动画。

如代码清单 1 所示,我们在绑定的 Move 函数中调用 AddActorLocalOffset() 函数,参数使用外部传递的 Value 值。

代码清单 1 AddActorLocalOffset
  1. void ATank::Move(float Value)
  2. {
  3.     // UE_LOG(LogTemp, Warning, TEXT("Value: %f"), Value);
  4.  
  5.     FVector DeltaLocation = FVector::ZeroVector;
  6.     DeltaLocation.X = Value;
  7.     AddActorLocalOffset(DeltaLocation);
  8. }
  9.  
  10. void ATank::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
  11. {
  12.     Super::SetupPlayerInputComponent(PlayerInputComponent);
  13.  
  14.     PlayerInputComponent->BindAxis(TEXT("MoveForward"), this, &ATank::Move);
  15. }

最终的效果如下方视频所示,我们先后按 W 和 S 键,前进和后退坦克。目前坦克的移动速度有点慢,我们会在下篇文章中实现速度指定功能。