射线的绘制
在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碰撞规则下)