LineTraceSingle 碰撞不起作用 (Unreal Engine 4)

LineTraceSingle Collision Not Working (Unreal Engine 4)

我在尝试使用 LineTraceSingle 检测命中时遇到了相当大的困难。

void ACustomActor::Tick(float DeltaTime){
    bool isHit = world->LineTraceSingle(HitResult, start, endV,
            traceParams, FCollisionObjectQueryParams(ECC_WorldStatic));
}

我的理解是,这是从起点到终点发出一条线,并试图从类型为 WorldStatic 的对象中发现第一个 "block"(命中)事件。

我正在使用以下代码绘制调试线:

    DrawDebugLine(GetWorld(), start, endV, FColor::Blue, true, 1.0F, (uint8)'[=12=]0', 5.0f);

这很有效,我可以看到我的线穿过墙。

正如你在上面看到的,这面墙的对象类型确实是WorldStatic并且它阻止了所有碰撞。

我做错了什么?

回答

world 需要 GetWorld()


说明

我在 Actor 的构造函数中保存了对 UWorld* 指针的引用,如下所示:

MyActor::MyActor()
{
    PrimaryActorTick.bCanEverTick = true;
    world = GetWorld();
}

问题是 GetWorld() returns NULL here! 我很惊讶没有实际上抛出的错误... 为了防止这种情况发生,这个调用应该在其他地方,比如 BeginPlay():

void AForceField::BeginPlay()
{
    Super::BeginPlay();
    world = GetWorld();
}

但是当我真正查找 GetWorld() 时,我看到它是一个“getter 用于缓存的世界指针 ”。所以将其保存到变量中真的没有意义。


TL;DR

不要将 GetWorld() 保存到变量。