我目前正在使用虚幻引擎4,似乎我无法避免某些演员阵容。
AController* c = this->GetController();
APlayerController* p = (APlayerController*)c;
在我进行演员表之前,有没有办法可以检查c
是否为PlayerController
?
答案 0 :(得分:7)
如果类至少有一个虚函数(可能),则可以使用dynamic_cast
:
APlayerController* p = dynamic_cast<APlayerController*>(c);
如果c
在运行时实际上不是正确类型,则返回空指针。
编辑除了至少一个虚拟功能外,dynamic_cast
还需要在您的构建中启用运行时类型信息(RTTI)。它通常是语言的一部分,但编译器可以支持将其关闭。
答案 1 :(得分:5)
与许多游戏引擎一样,出于性能原因,虚幻引擎在没有RTTI的情况下进行编译,因此dynamic_cast
将无效。
虚幻引擎提供了自己的替代方案,简称为Cast
。我现在无法找到任何文档,但this question很好地描述了它的用法。
AController* c = this->GetController();
APlayerController* p = Cast<APlayerController>(c);
if (p) {
...
}
AController
还有一个便捷方法CastToPlayerController
,它会做同样的事情:
AController* c = this->GetController();
APlayerController* p = c->CastToPlayerController();
if (p) {
...
}
如果您确定c
始终是APlayerController
,那么CastChecked
会更有效率:
AController* c = this->GetController();
APlayerController* p = CastChecked<APlayerController>(c);
...
在调试版本中,这将使用Cast
并抛出一个断言,如果它将返回null;在发布版本中,它会解析为快速static_cast
。