• UE4 碰撞射线检测


    
    /**
    默认 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()));
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    以下是不常用

    void ATraceCharacter::traceHit() {
    
    	AMainPlayerController* PC = Cast<AMainPlayerController>(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<UTraceInterface>(Hit.Actor);
    		if (trace) {
    			UE_LOG(LogTemp, Warning, TEXT("**************"));
    		}
    
    	}
    }
    
    void ATraceCharacter::traceFire() {
    	AMainPlayerController* PC = Cast<AMainPlayerController>(UGameplayStatics::GetPlayerController(GetWorld(), 0));
    
    	FVector FireStart, FireEnd;
    	FireStart = FirstPersonCameraComponent->GetComponentLocation() + FirstPersonCameraComponent->GetForwardVector();
    	FireEnd = FirstPersonCameraComponent->GetForwardVector() * 1500 + FireStart;
    	FHitResult OutHit;
    	TArray<AActor*> ActorsToIgnotre;
    	UKismetSystemLibrary::LineTraceSingle(this, FireStart, FireEnd, ETraceTypeQuery::TraceTypeQuery1, false, ActorsToIgnotre, EDrawDebugTrace::ForDuration, OutHit, true);
    
    	UTraceInterface* trace = Cast<UTraceInterface>(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;
    	TArray<AActor*>ignoreArray;
    	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());
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91

    aaa

  • 相关阅读:
    nginx进行资源动静分离
    Kibana功能栏中找不到Timelion功能模块的解决
    SpringBoot + oss 实现文件上传
    qt day3
    HDFS集成Kerberos并使用Python调用
    探索前沿:云计算环境下的网络安全策略与技术实践
    Azure Kubernetes(AKS)部署及查看应用资源
    开闭环系统性能分析(稳定性、收敛性、可控性)
    为什么WinXP SP2有时候会忘记CD自动播放的设置?
    高性能网络编程 - The C10K problem 以及 网络编程技术角度的解决思路
  • 原文地址:https://blog.csdn.net/wb175208/article/details/127680027