UE4 碰撞射线检测
admin
2024-01-19 09:37:43
0

/**
默认 TraceTypeQuery1 —— Visibility
默认 TraceTypeQuery2 —— Camera
*/
void ATraceCharacter::traceByChannel() {//获取该组件的拥有者AActor* MyOwner = GetOwner();//射线的开始位置和结束位置FVector Start;FRotator StartRotation;MyOwner->GetActorEyesViewPoint(Start, StartRotation);//Start = Mesh1P->GetComponentLocation();FVector End = Start + StartRotation.Vector() * 1000.0f;FHitResult Hit;//根据通道查询 在这里需要注意AddIgnoredActor添加了该射线忽略的Actor,不然会造成检测错误FCollisionQueryParams QueryParams;QueryParams.AddIgnoredActor(MyOwner);/** * 参数类型*Hit碰撞信息 起始点、结束点、碰撞通道、查询参数*/bool BIsTraced = GetWorld()->LineTraceSingleByChannel(Hit, Start, End, ECollisionChannel::ECC_Visibility, QueryParams);if (BIsTraced) {UKismetSystemLibrary::PrintString(GetWorld(), FString::Printf(TEXT("LineTraceSingleByChannel : %s"), *Hit.Actor->GetName()));}
}/**
默认 ObjectTypeQuery1 —— WorldStatic
默认 ObjectTypeQuery2 —— WorldDynamic
默认 ObjectTypeQuery3 —— Oawn
默认 ObjectTypeQuery4 —— PhysicasBody
默认 ObjectTypeQuery5 —— Vehicle
默认 ObjectTypeQuery6 —— Destructible
*/
void ATraceCharacter::traceByObjType() {//获取该组件的拥有者AActor* MyOwner = GetOwner();//射线的开始位置和结束位置FVector Start;FRotator StartRotation;MyOwner->GetActorEyesViewPoint(Start, StartRotation);FVector End = Start + StartRotation.Vector() * 4000;//碰撞对象查询FCollisionObjectQueryParams ObjectQueryParams;ObjectQueryParams.AddObjectTypesToQuery(ECollisionChannel::ECC_WorldStatic);//单通道射线根据对象类型检测FHitResult Hit;/*** 参数类型* Hit碰撞信息、起始点、结束点、对象检测参数。*/bool BIsTraced = GetWorld()->LineTraceSingleByObjectType(Hit, Start, End, ObjectQueryParams);if (BIsTraced) {UKismetSystemLibrary::PrintString(GetWorld(), FString::Printf(TEXT("LineTraceSingleByObjectType : %s"), *Hit.Actor->GetName()));}
}

以下是不常用

void ATraceCharacter::traceHit() {AMainPlayerController* PC = Cast(UGameplayStatics::GetPlayerController(GetWorld(), 0));//获取屏幕宽高int32 width = 0;int32 height = 0;PC->GetViewportSize(width, height);//将屏幕位置投影到世界FVector STMPos;FVector STMDir;//宽高/2就是屏幕中心点PC->DeprojectScreenPositionToWorld(width / 2, height / 2, STMPos, STMDir);FVector CameraPos = PC->PlayerCameraManager->GetCameraLocation();FVector CameraDir = PC->PlayerCameraManager->GetActorForwardVector() * 300;FHitResult Hit;//摄像机发射射线,单射线检查,只有一个目标//Start:CameraPos + CameraDir//End: CameraPos + STMDir * 5000 ,相机位置往世界方向发射一条5000长的射线if (GetWorld()->LineTraceSingleByChannel(Hit, CameraPos + CameraDir, CameraPos + STMDir * 5000, ECC_Camera)) {FString msg = Hit.GetActor()->GetName();GEngine->AddOnScreenDebugMessage(-1, 2.0, FColor::Red, msg + TEXT(" hitting..."));UTraceInterface* trace = Cast(Hit.Actor);if (trace) {UE_LOG(LogTemp, Warning, TEXT("**************"));}}
}void ATraceCharacter::traceFire() {AMainPlayerController* PC = Cast(UGameplayStatics::GetPlayerController(GetWorld(), 0));FVector FireStart, FireEnd;FireStart = FirstPersonCameraComponent->GetComponentLocation() + FirstPersonCameraComponent->GetForwardVector();FireEnd = FirstPersonCameraComponent->GetForwardVector() * 1500 + FireStart;FHitResult OutHit;TArray ActorsToIgnotre;UKismetSystemLibrary::LineTraceSingle(this, FireStart, FireEnd, ETraceTypeQuery::TraceTypeQuery1, false, ActorsToIgnotre, EDrawDebugTrace::ForDuration, OutHit, true);UTraceInterface* trace = Cast(OutHit.Actor);if (trace) {FString msg = OutHit.GetActor()->GetName();GEngine->AddOnScreenDebugMessage(-1, 2.0, FColor::Red, msg + TEXT(" hitting..."));}
}void ATraceCharacter::traceFire2() {FRotator cameraRotator = FirstPersonCameraComponent->GetComponentRotation();//相机向前的方向FVector cameraForward = UKismetMathLibrary::GetForwardVector(cameraRotator);UE_LOG(LogTemp, Warning, TEXT("cameraForward: (X:%f,Y:%f,Z:%f)"), cameraForward.X, cameraForward.Y, cameraForward.Z);//相机的位置 向量的取值范围在 -1 ~ 1之间FVector cameraLocation = FirstPersonCameraComponent->GetComponentLocation();UE_LOG(LogTemp, Warning, TEXT("cameraLocation: (X:%f,Y:%f,Z:%f)"), cameraLocation.X, cameraLocation.Y, cameraLocation.Z);//射线结束位置FVector endLocation = cameraLocation + cameraForward * 1500;UE_LOG(LogTemp, Warning, TEXT("endLocation: (X:%f,Y:%f,Z:%f)"), endLocation.X, endLocation.Y, endLocation.Z);FHitResult hitResult;TArrayignoreArray;bool bHit = UKismetSystemLibrary::LineTraceSingle(GetWorld(), cameraLocation, endLocation, ETraceTypeQuery::TraceTypeQuery1, false, ignoreArray, EDrawDebugTrace::Persistent, hitResult, true/*, FLinearColor::Red, FLinearColor::Green, 2.0*/);if (bHit){UKismetSystemLibrary::PrintString(GetWorld(),FString::Printf(TEXT("Name:%s"), *hitResult.Actor->GetName()));}
}void ATraceCharacter::traceByChannelDraw() {// 碰撞参数FCollisionQueryParams CollisonQueryParams(TEXT("QueryParams"), true, NULL);CollisonQueryParams.bTraceComplex = true;CollisonQueryParams.bReturnPhysicalMaterial = false;CollisonQueryParams.AddIgnoredActor(this);// 起始点和检测结果FVector BeginLoc = GetActorLocation();FVector EndLoc = BeginLoc + GetActorForwardVector() * 4000;FHitResult HitResult;// 射线检测GetWorld()->LineTraceSingleByChannel(HitResult, BeginLoc, EndLoc, ECollisionChannel::ECC_Visibility, CollisonQueryParams);// 绘制射线//DrawDebugLine(GetWorld(), BeginLoc, HitResult.GetActor() ? HitResult.Location : EndLoc, FColor::Red, false, 1.0f);if (HitResult.GetActor()) {UKismetSystemLibrary::PrintString(GetWorld(), HitResult.GetActor()->GetName());}
}

aaa

相关内容

热门资讯

150年的非遗酱油,焕新出圈! 编者按 风华正茂启新程,锐意创新向未来。婺城区新生代企业家正以青春之志、创新之能、实干之姿,扎根经济...
潍坊高密:非遗美食出圈,好品山... 你发现没?现在很多人吃东西,越来越讲究背后的故事。咱们今天就聊聊潍坊高密的美食,为啥能火出圈? ...
原创 早... 早餐主要是摄入什么?午餐主要是摄入什么?晚餐主要是摄入什么? 根据我们的健康饮食理论,早餐主要是摄入...
罗永浩开炮西贝:全是预制菜还那... 一个人均小两百的餐厅,用的可能都是加热一下就上桌的预制菜,这你受得了? 昨晚罗永浩就在微博上开喷西贝...
文旅部:上半年国内居民出游人次... 南都讯 记者王玮 王森 发自北京 9月11日,2025世界旅游合作与发展大会在首钢园国际会展中心举办...
中国新闻网丨吉林桦甸招商活动在... 中新网吉林新闻9月10日电 (石洪宇 刘树彬)9月9日,吉林优质农产品下江南暨桦甸市招商引资推介活动...
九寨沟县文广体旅局通报“一酒店... 本文转自【九寨文体旅】; 情况通报 2025年9月5日晚9时45分许,九寨沟希尔顿度假酒店大堂城堡...
中秋国庆假期机票预订量同比增两... 航旅纵横大数据显示,截至9月8日,今年中秋国庆假期国内航线机票预订量已超过326万张,日均机票预订量...
延边再添50处网红打卡地,我州... 近日,由延边州文广旅局主办的第四届“发现最延边”网红打卡地颁奖典礼圆满落幕,本届活动评选出的“山河画...
安徽3日游攻略,黄山游三天两晚... 黄山,这座被誉为“天下第一奇山”的名山,以其奇松、怪石、云海、温泉四绝闻名于世。一直以来,它都是我心...
入秋后,使劲吃这肉,比牛肉滋补... 导读:入秋后,使劲吃这肉,比牛肉滋补,比鸡鸭香,简单又营养,太香了 “云天收夏色,木叶动秋声。”当第...
黑龙江塔河县采山文化季活动暨厨... 近日,黑龙江省塔河县文旅局、市监局联合举办了采山文化季活动暨第二届厨艺美食大赛,旨在进一步提升旅游和...
因为一只鸡,全红婵大哥把广东人... 谁能想到有一天,南北会因为一只“白切鸡”引发“地域大战”!!! 而这场地域大战的发起人,是奥运冠军全...
美味月报|8月热门菜谱回顾,厨... 导读 下厨房2025年8月热门菜谱内容趋势: 8月开始进入梭子蟹最佳食用季节,多个梭子蟹吃法菜...
全国最好吃的外国餐厅不在上海,... 这可能是全国外国菜系最丰富的地方。 虽然大部分人对香港美食的认知只停留在茶餐厅,但其实这里的异国料理...
带娃江西婺源3日游怎么玩,婺源... 家人们,有没有和我一样,一到假期就琢磨着带娃出去溜达溜达,开阔开阔眼界,放松放松心情。可这旅游目的地...
四川四日游价格表,两个人到成都... 四川,这片神奇而迷人的土地,宛如一颗镶嵌在中国西南部的璀璨明珠,散发着独特的魅力。它拥有着令人叹为观...
四川四日游费用,和女友去成都玩... 家人们,四川,那可是一个充满魅力的旅游胜地!它地处中国西南地区,宛如一颗璀璨的明珠镶嵌在祖国的大地上...