作者:陈怡伶翰纬 | 来源:互联网 | 2023-10-11 19:29
Controller->GetPlayerViewPoint(Point,Direction);得到摄像机位置和方向FHitResulthit(ForceInit);
Controller->GetPlayerViewPoint(Point, Direction);//得到摄像机位置和方向
FHitResult hit(ForceInit); //接受结果用,射线类-ForceInit用于初始话
源码中效果只是为了实现一个初始化
具体实现如下
FVector CamLoc;
FRotator CamRot;
if (COntroller== NULL)
return;
//得到摄像机位置和方向
Controller->GetPlayerViewPoint(CamLoc, CamRot);
APlayerController* pc = GetWorld()->GetFirstPlayerController();
if (pc)
{
ULocalPlayer* localplayer = pc->GetLocalPlayer();
if (localplayer && localplayer->ViewportClient)
{
FVector Dir,pint;
if (pc->DeprojectMousePositionToWorld(pint,Dir))//得到鼠标点击的位置和方向
{
FVector TraceStar = CamLoc;//摄像机所在位置
FVector Direction = CamRot.Vector();//摄像机所看方向//实际上这个方向也可以发射一个射线出去,判断是否在前方
//射线的终点
FVector TranceEnd = TraceStar + (Dir * 10000);//射线的终点
FCollisionQueryParams TraceParams(FName(TEXT("Actor")), true, this);//给射线定义碰撞,并取一个名字
TraceParams.bTraceAsyncScene = true;//场景中所有碰撞
TraceParams.bReturnPhysicalMaterial = false;//物理材质碰撞
TraceParams.bTraceComplex = true;
FHitResult hit(ForceInit);//初始化射线类并且发射一个射线
GetWorld()->LineTraceSingleByChannel(hit, TraceStar, TranceEnd, ECC_Visibility, TraceParams);
if (Cast(hit.GetActor()))//打印被射线碰撞的物体
{
GEngine->AddOnScreenDebugMessage(-1, 0.8f, FColor::Blue, hit.GetActor()->GetName());
}
}
}
}
GetWorld()->PersistentLineBatcher->DrawLine(Star, End, FLinearColor::Red, size);//用来绘制射线