APawn::GetController()
在上一篇文章中,我们已经实现了坦克的移动和旋转。我们还需要坦克上方的炮塔可以移动,以便灵活的指定炮弹发射方向。我们准备使用鼠标控制。
我们的坦克继承自 Pawn 类。像此处,它自带一个 APlayerController 控制器,可以获取鼠标位置、鼠标点投射到世界的射线信息等。所以在这篇文章中,我们先了解如何获取到这个控制器。
我们可以使用 Pawn 类下的 GetController() 函数获取到这个控制器。它的定义如下:
- AController* GetController() const;
可以看到函数返回的类型是 AController 指针,只是一个基类。它有两个重要的子类:一个是上述提及的 APlayerController 类,是玩家控制器;另一个是 AAIController 类,是 AI 控制器。
我们需要使用 Cast 函数将其转化为我们想要的子类。Cast 函数可以简单理解成 UE 版本的 dynamic_cast。
我们此处坦克对应的控制器是 APlayerController。同时注意控制权占有的时机,过早会获取不到控制器。如代码清单 1 所示,我们把控制器的获取放在 BeginPlay() 的时候。之前的玩家控制权设置,可以参考文章 《Pawn 控制权》。
- void ATank::BeginPlay()
- {
- Super::BeginPlay();
- PlayerControllerRef = Cast<APlayerController>(GetController());
- UE_LOG(LogTemp, Warning, TEXT("PlayerControllerRef: %p"), PlayerControllerRef);
- }
如图 1 运行查看,可以看到打印的控制器指针非空。
