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

相关内容

热门资讯

鹤岗市第八届中俄界江文化旅游节...   黑龙江网讯(潘凤 记者 张宇)盛夏七月,碧水欢歌。7月19日,鹤岗市第八届中俄界江文化旅游节在萝...
怎么才知道自己是出马仙活是出道... 怎么才知道自己是出马仙活是出道仙看是地仙堂 还是上方仙堂 主要是把仙点出来 我认识的两个朋友...
和希腊神话有关的电影有哪些 和希腊神话有关的电影有哪些《波西·杰克逊与神火之盗》。《诸神之战》
地理科学 地理科学珠江的讯期,水位,流量,含沙量,冰期能答多少是多少。谢谢。珠江多年平均径流量为3360亿立方...
陇湘“文旅+美食”碰撞火花 酒... 陇湘“文旅+美食”碰撞火花 酒泉非遗美食精彩亮相“游甘肃 品甘味” 甘肃文旅(湖南)宣传推介会 7月...
恩施旅游怎么吃?这份美食攻略请... 吃绝对是旅游的一大乐趣!来恩施玩吃些什么?来看看这份攻略吧! 土家风味必尝清单 恩施土家腊肉绝对是第...
小朋友说话时,眼睛总是不看着对... 小朋友说话时,眼睛总是不看着对方,是什么原因?   小朋友说话不看对...
2025年7月佛山朴老师韩语热... 暑假就应该吃着西瓜,追着韩剧 7月值得一看的韩剧有哪几部呢? 佛山朴老师韩语专注个性化韩语教育,致力...
10岁的孩子写作文缺乏想象怎么... 10岁的孩子写作文缺乏想象怎么办?首先你要明确孩子在哪些方面需要帮助,不能反成其累赘,其次家长需要有...
景区发展倒退就是认知不够 大家好,我是张鹏远。 暑期已到,忙的不行,跟同行交流让我很震惊,可能是老君山市场数十年如一日的火爆,...
封神榜中朝歌珍宝有什么用啊? 封神榜中朝歌珍宝有什么用啊?是做诸侯任务时用的,完成给大量给经验的,前提是必须要加了诸侯,你们侯主放...
县域旅游火热 带动文旅新消费 央视网消息(新闻联播):随着暑期旅游的逐渐升温,各地一些小县城凭借着独特的风土人情、完善的交通网络等...
离湖州最近的火车站是哪个城市 离湖州最近的火车站是哪个城市湖州就有火车站啊,最近的当然是湖州站。湖州往北,最近的是宜兴,往南,最近...
哈尔滨凤凰山旅游攻略:探秘北国... 哈尔滨凤凰山,坐落于黑龙江省五常市与吉林省交界处,是长白山余脉张广才岭的瑰宝。这座海拔1696米的高...
一个男人喜欢听情感节目,说明什... 一个男人喜欢听情感节目,说明什么说明是个感情世界很多故事,希望在故事里启迪人生。
有没有关于做生意方面的书籍,关... 有没有关于做生意方面的书籍,关于如何推销,如何寻找客户,还有生意上的小故事,还有或者别的看看杂志吧 ...
最重要的东西眼睛是看不到的,心... 最重要的东西眼睛是看不到的,心比眼睛更明亮的意思最重要的东西眼睛是看不到的,心比眼睛更明亮的意思是眼...
这种局面该怎么办 这种局面该怎么办她的男朋友还有这习惯?我最讨厌这样的人 冒充别人~!!!把事情告诉她吧~!!让她心里...
上联父之言 言之多 多多益善的... 上联父之言 言之多 多多益善的下联是什么子之孝,孝之廖,寥寥无几。对联讲究对称,父与子相对,言与孝都...