8

我目前正在使用虚幻引擎 4,似乎无法避免一些演员表。

AController* c = this->GetController();
APlayerController* p = (APlayerController*)c;

有没有办法在我做演员之前检查是否c是 a ?PlayerController

4

2 回答 2

7

和很多游戏引擎一样,出于性能原因,虚幻引擎编译时没有使用 RTTI,因此dynamic_cast无法正常工作。

虚幻引擎提供了自己的替代方案,简称为Cast. 我现在找不到任何文档,但是这个问题很好地描述了它的使用。

AController* c = this->GetController();
APlayerController* p = Cast<APlayerController>(c);
if (p) {
    ...
}

AController还有一个方便的方法CastToPlayerController可以做同样的事情:

AController* c = this->GetController();
APlayerController* p = c->CastToPlayerController();
if (p) {
    ...
}

如果你确定这c总是一个APlayerControllerthenCastChecked更有效:

AController* c = this->GetController();
APlayerController* p = CastChecked<APlayerController>(c);
...

在调试版本中,这将使用Cast并抛出一个断言,如果它返回 null;在发布版本中,它解析为快速static_cast.

于 2014-03-24T13:28:13.243 回答
0

尽管我觉得你不需要对你的播放器控制器进行检查,使用IsA函数,你不需要做额外的演员。

AController* c = GetController();
if (c->IsA(APlayerController::StaticClass()))
{
    //bla bla
}

作为个人建议检查您的代码设计

于 2022-03-04T07:56:57.090 回答