射线的绘制


  在UE4中,提供了一个DrawDebugLine()方法来帮助我们在游戏窗口中绘制我们的射线,这个方法定义在DrawDebugHelpers.h文件下,我们如果需要使用这个方法,则需要导入DrawDebugHelpers.h头文件。

  我们在浏览源代码时发现,这个函数,我们需要传入的参数如下:


    void DrawDebugLine(
        const UWorld* InWorld,     // 传入的世界
        FVector const& LineStart,  // 射线的起点
        FVector const& LineEnd,    // 射线的终点
        FColor const& Color,       // 射线的颜色
        bool bPersistentLines,     // 是否一直显示
        float LifeTime,            // 显示的持续时间
        uint8 DepthPriority,       // 深度优先?没看懂,一般使用时写0即可
        float Thickness            // 射线有多粗
    );
						


射线的碰撞检测


  一般射线的绘制只是帮我们在游戏窗口中Debug调试使用,在正式的成品中,我们是一般是不显示这个射线的,那么又如何去获取到我们这个射线碰撞到的物体呢,同样,UE4为我们定义了一个LineTraceSingleByObjectType()函数,这个函数是在GetWorld()下,使用的方法如下:


    // 设置查询参数,是否与模型进行复杂碰撞,ture 为复杂碰撞
    FCollisionQueryParams TraceParameters(FName(TEXT("")), false, GetOwner());
    // 设置碰撞物体
    FHitResult Hit;
    // 调用这个函数
    GetWorld()->LineTraceSingleByObjectType(
        Hit,             // 射线碰撞到的物体,返回引用
        LineTraceStart,  // 射线的起点
        LineTraceEnd,    // 射线的终点
        FCollisionObjectQueryParams(ECollisionChannel::ECC_PhysicsBody),// 射线的碰撞类型,在项目设置的碰撞中可以修改
        TraceParameters  // 查询参数,使用我们之前定义的那个即可
    );
    // 通过 GetActor() 方法即可获取碰撞的物体
    AActor *ActorHit = Hit.GetActor();
						

  其源代码定义在World.h中如下:


    // 传入的参数即为上述例子中的一致
    bool LineTraceSingleByObjectType(
        struct FHitResult& OutHit,
        const FVector& Start,
        const FVector& End,
        const FCollisionObjectQueryParams& ObjectQueryParams, 
        const FCollisionQueryParams& Params = FCollisionQueryParams::DefaultQueryParam
    ) const;
						

  我们看到OutHit传入的是一个引用,所以我们只需定义Hit传入这个函数,即可返回这个碰撞的属性Hit,再通过Hit.GetActor()即可获取到我们碰撞的物体(在我们的ObjectQueryParams碰撞规则下)