UE4 射线拾取&三维画线
原创
©著作权归作者所有:来自51CTO博客作者mb639813d0717d1的原创作品,请联系作者获取转载授权,否则将追究法律责任
虽然有人建议UE4使用C++创建VR项目,能避免一些坑爹的错误,但是我用C++创建,竟然问题更多,还存在创建不了的情况,也不知道是不是我的操作问题,快疯了。
于是我还是选择了蓝图创建VR项目,但是...
可能是写代码习惯了,蓝图用着相当别扭,而且有些功能甚至没有,我也不知道,反正是没找到。
最后,折中,用C++来写部分功能,再在蓝图中调用,这里就写了应用在VR手柄上的一个射线拾取,为了让用户能更好的操作,我们需要将射线在场景中绘制出来。
射线拾取
//起点 终点
FHitResult RayGetHitResult(FVector TraceStart, FVector TraceEnd)
{
FCollisionQueryParams TraceParams(FName(TEXT("TraceUsableActor")), true, this);
TraceParams.bTraceAsyncScene = true;
TraceParams.bReturnPhysicalMaterial = false;
TraceParams.bTraceComplex = true;
//Hit是用来存储射线的一些数据,如Actor、坐标等等
FHitResult Hit(ForceInit);
if (GetWorld()->LineTraceSingle(Hit, TraceStart, TraceEnd, ECC_Visibility, TraceParams))
{
//绘制射线
DrawRayLine(TraceStart, Hit.Location,0.03f);
}
return Hit;
}
三维画线
//起点 终点 绘制线的显示的时间
void DrawRayLine(FVector StartPos, FVector EndPos,float fLifeTime)
{
ULineBatchComponent* const LineBatcher = GetWorld()->PersistentLineBatcher;
const float LifeTime = fLifeTime;
if (LineBatcher != NULL)
{
float LineLifeTime = (LifeTime > 0.f) ? LifeTime : LineBatcher->DefaultLifeTime;
LineBatcher->DrawLine(StartPos, EndPos, FLinearColor::Red, 10, 0.f, LineLifeTime);
}
}
如果需要在蓝图中调用,只需要在函数声明的上面写一个标记
UFUNCTION(BlueprintCallable,Category="Damage")