ue5 Cast APlayerController与AController 关系

在 Unreal Engine 中,cast 是一种类型转换操作,用于将一个对象从一种类型转换为另一种类型,以便在某种特定场景下使用其特有的属性和方法。Cast 是非常常见的操作,特别是在处理继承关系时,比如将一个基类指针转换为它的子类指针。

1. Cast 的含义

在 C++ 和 Unreal Engine 中,cast 的含义是将一个对象指针或引用转换为另一种类型的指针或引用。Unreal Engine 提供了一个专门的 Cast 函数,用于在运行时检查和转换对象类型。

template<typename To, typename From> To* Cast(From* Src);

  • To: 目标类型,表示你希望转换到的类型。
  • From: 源类型,表示你当前的类型。

如果 SrcTo 类型的实例或者从 To 类型继承而来,Cast 会返回一个指向 SrcTo* 指针。如果 Src 不是 To 类型的实例,Cast 返回 nullptr

示例:

AController* Controller = GetController(); APlayerController* PlayerController = Cast<APlayerController>(Controller); if (PlayerController) { // 现在我们可以使用 PlayerController 的特有功能 PlayerController->ClientMessage("Hello, Player!"); }

在这个例子中,我们将 Controller 类型转换为 APlayerController 类型。如果 Controller 实际上是 APlayerController 的实例,Cast 操作将成功,并返回一个有效的 PlayerController 指针。如果 Controller 不是 APlayerController 类型或其子类,Cast 返回 nullptr

2. Cast 的应用场景

2.1 从基类到子类的转换

Cast 常用于将一个基类指针转换为子类指针,以便调用子类特有的方法或属性。

AActor* SomeActor = GetOwner(); AMyCustomActor* MyActor = Cast<AMyCustomActor>(SomeActor); if (MyActor) { // 使用 MyActor 的特有功能 MyActor->DoSomething(); }

2.2 类型安全性检查

Cast 也可以用于检查一个对象是否属于某种类型:

if (Cast<AMyCustomActor>(SomeActor)) { UE_LOG(LogTemp, Warning, TEXT("This is an instance of AMyCustomActor")); } else { UE_LOG(LogTemp, Warning, TEXT("This is NOT an instance of AMyCustomActor")); }

2.3 不同类型的控制器

在 Unreal Engine 中,AControllerAPlayerControllerAAIController 的基类。你可以使用 Cast 来区分控制器的类型。

示例:判断一个 Controller 是玩家控制器还是 AI 控制器

AController* Controller = GetController(); if (APlayerController* PlayerController = Cast<APlayerController>(Controller)) { // 这是一个 PlayerController UE_LOG(LogTemp, Warning, TEXT("This is a PlayerController")); } else if (AAIController* AIController = Cast<AAIController>(Controller)) { // 这是一个 AIController UE_LOG(LogTemp, Warning, TEXT("This is an AIController")); } else { // 其他类型的 Controller UE_LOG(LogTemp, Warning, TEXT("This is some other type of Controller")); }

3. APlayerControllerAController 的区别

3.1 AController

  • AController 是一个抽象的基类,表示任何能够控制 Pawn 的对象。
  • 它本身不能直接用于控制 Pawn,需要具体的子类来实现控制逻辑。
  • 它包含了一些基本的控制功能,比如拥有 Pawn 和处理控制权的接口。

// AController 基本功能 AController* Controller = GetController(); APawn* ControlledPawn = Controller->GetPawn(); // 获取控制的 Pawn Controller->Possess(SomeOtherPawn); // 控制另一个 Pawn Controller->UnPossess(); // 解除对当前 Pawn 的控制

3.2 APlayerController

  • APlayerControllerAController 的子类,专门用于处理玩家输入和控制 Pawn
  • 它负责管理玩家的输入、视角控制、与游戏界面的交互等。
  • APlayerController 可以管理 HUD、摄像机视角、鼠标光标等与玩家输入相关的功能。

APlayerController* PlayerController = Cast<APlayerController>(GetController()); if (PlayerController) { PlayerController->SetViewTarget(SomeCameraActor); // 切换视角到某个相机 PlayerController->ClientMessage("Hello, Player!"); // 显示消息给玩家 PlayerController->bShowMouseCursor = true; // 显示鼠标光标 }

3.3 APlayerControllerAController 的关系

  • APlayerControllerAController 的子类,因此可以将 APlayerController 转换为 AController 类型。
  • 反之,如果你有一个 AController 类型的指针或引用,可以使用 Cast<APlayerController> 检查它是否是 APlayerController

// APlayerController 转换为 AController APlayerController* PlayerController = GetWorld()->GetFirstPlayerController(); AController* Controller = PlayerController; // AController 转换为 APlayerController AController* Controller = GetController(); APlayerController* PlayerController = Cast<APlayerController>(Controller); if (PlayerController) { // 现在我们可以使用 PlayerController 的功能 }

4. 使用 Cast 的注意事项

4.1 运行时安全性

Cast 是一种运行时检查操作,它会在运行时判断类型是否匹配。如果 Cast 失败,它会返回 nullptr,因此在使用 Cast 时一定要检查返回值是否为空:

APlayerController* PlayerController = Cast<APlayerController>(GetController()); if (PlayerController) { // 成功转换,可以使用 PlayerController 的功能 } else { // 转换失败,不能使用 PlayerController 的功能 }

4.2 性能影响

虽然 Cast 操作非常常见,但它会在运行时进行类型检查,这可能会对性能产生一些影响,尤其是在循环或频繁调用时。因此,在使用 Cast 时需要注意其对性能的影响。

4.3 避免不必要的 Cast

在设计代码时,尽量减少不必要的类型转换。如果能够通过其他方式(如接口、虚函数、多态)实现相同的功能,尽量避免使用 Cast

5. 总结

  • Cast 是一种类型转换操作,用于将一个对象从一种类型转换为另一种类型,通常用于从基类转换到子类。
  • AController 是一个抽象的控制类,管理 Pawn 的控制权和控制逻辑。
  • APlayerControllerAController 的子类,专门用于处理玩家输入和控制 Pawn
  • 使用 Cast 时要注意检查返回值,避免使用 nullptr 引发崩溃。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值