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

之前我们接触过 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 值。
- void ATank::Move(float Value)
- {
- // UE_LOG(LogTemp, Warning, TEXT("Value: %f"), Value);
- FVector DeltaLocation = FVector::ZeroVector;
- DeltaLocation.X = Value;
- AddActorLocalOffset(DeltaLocation);
- }
- void ATank::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
- {
- Super::SetupPlayerInputComponent(PlayerInputComponent);
- PlayerInputComponent->BindAxis(TEXT("MoveForward"), this, &ATank::Move);
- }
最终的效果如下方视频所示,我们先后按 W 和 S 键,前进和后退坦克。目前坦克的移动速度有点慢,我们会在下篇文章中实现速度指定功能。