• UE4碰撞射线检测2


    1. UE4内置的函数:UWorld::LineTraceSingleByChannel
      该线轨迹将光线射入空间,并根据选定的轨迹通道进行碰撞
    void AFirstPawn::lineTraceSingleByChannel() {
    	FHitResult HitResult;
    	FVector Start = GetActorLocation() /*+ FVector(0.f, 0.f, 75.f)*/;
    	FVector End = Start + GetActorForwardVector() * 500.f;
    	FCollisionQueryParams CollisionQueryParams;
    	CollisionQueryParams.AddIgnoredActor(this);
    	GetWorld()->LineTraceSingleByChannel(HitResult, Start, End, ECollisionChannel::ECC_Visibility, CollisionQueryParams);
    	if (HitResult.bBlockingHit) {
    		//DrawDebugSphere(GetWorld(), HitResult.Location, 15.f, 12, FColor::Red, false, 5.f);
    		//DrawDebugLine(GetWorld(), Start, HitResult.Location, FColor::Red, true, 3.f);
    		DrawDebugPoint(GetWorld(), HitResult.Location, 5.f, FColor::Blue, false, 5.f);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    最后一个参数:FCollisionQueryParams的对象作为可选参数,该参数可以指定有关冲突查询的详细信息,例如要忽略的参与者.
    我们在场景中摆放三个立方体
    第一个立方体设置【碰撞】->【碰撞预设】->【碰撞相应】->【Visibility】->【阻挡】
    第二个立方体设置【碰撞】->【碰撞预设】->【碰撞相应】->【Visibility】->【重叠】
    第三个立方体设置【碰撞】->【碰撞预设】->【碰撞相应】->【Visibility】->【忽略】
    在这里插入图片描述
    可以看到只有第一个设置【Visibility】->【阻挡】发生了作用
    2. UWorld::LineTraceMultiByChannel

    void AFirstPawn::lineTraceMultiByChannel() {
    	FHitResult HitResult;
    	FVector Start = GetActorLocation() /*+ FVector(0.f, 0.f, 75.f)*/;
    	FVector End = Start + GetActorForwardVector() * 1000.f;
    	FCollisionQueryParams CollisionQueryParams;
    	CollisionQueryParams.AddIgnoredActor(this);
    	TArray<FHitResult> HitResults;
    	GetWorld()->LineTraceMultiByChannel(HitResults, Start, End,	ECollisionChannel::ECC_Visibility); 
    	for (int32 i = 0; i < HitResults.Num(); i++) {
    		if (HitResults[i].bBlockingHit) {
    			FString ActorName = HitResults[i].Actor->GetName();
    			printf_k(i, "%d Actor Name: %s", i, *ActorName);
    		} else {
    			//printf_k(i, "%d Failed hit!", i);
    			FString ActorName = HitResults[i].Actor->GetName();
    			printf_k(i, "%d Failed hit: %s", i, *ActorName);
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    放置是三个立方体,从前往后设置参数:
    第一个立方体设置【碰撞】->【碰撞预设】->【碰撞相应】->【Visibility】->【忽略】
    第二个立方体设置【碰撞】->【碰撞预设】->【碰撞相应】->【Visibility】->【重叠】
    第三个立方体设置【碰撞】->【碰撞预设】->【碰撞相应】->【Visibility】->【阻挡】
    在这里插入图片描述
    第一个立方体直接被忽略掉,第二个立方体检测到重叠但是没有检测到碰撞,第三个检测到了碰撞
    3.UKismetSystemLibrary::BoxTraceSingleForObjects

    /**
    * ObjectTypeQuery1 : World Static
    * ObjectTypeQuery2 : World Dynamic
    * ObjectTypeQuery3 : Pawn
    * ObjectTypeQuery4 : Physics Body
    * ObjectTypeQuery5 : Destructible
    * ObjectTypeQuery6 : First Custom Object Type
    * ObjectTypeQuery7 : Second Custom Object Type
    */
    
    void AFirstPawn::boxTraceSingleForObjects() {
    	FHitResult HitResult;
    	FVector Start = GetActorLocation() /*+ FVector(0.f, 0.f, 75.f)*/;
    	FVector End = Start + GetActorForwardVector() * 1000.f;
    	FCollisionQueryParams CollisionQueryParams;
    	CollisionQueryParams.AddIgnoredActor(this);
    	TArray<TEnumAsByte<EObjectTypeQuery>> ObjectTypes;
    	ObjectTypes.Add(EObjectTypeQuery::ObjectTypeQuery2);
    	TArray<AActor*> ActorsToIgnore;
    	ActorsToIgnore.Add(this);
    	FHitResult BoxTraceResult;
    
    	UKismetSystemLibrary::BoxTraceSingleForObjects(
    		GetWorld()//UWorld对象
    		, Start   //跟踪的起始位置                        
    		, End     //是跟踪的结束位置
    		, FVector(32.f, 32.f, 32.f) //跟踪盒子一半的大小
    		, FRotator() //跟踪盒子旋转方向
    		, ObjectTypes//是对象类型数组
    		, true //是否对复杂的几何图形进行跟踪
    		, ActorsToIgnore//要忽略数组的参与者
    
    		/**
    		* ForOneFrame:来绘制单个帧的跟踪
    		* ForDuration:使跟踪能够持续指定的时间
    		* None:示不绘制任何调试形状
    		* Persistent:表示调试形状将在世界中持续存在
    		*/
    		, EDrawDebugTrace::ForDuration
    		, BoxTraceResult //碰撞的结果
    		, true
    		, FColor::Red //跟踪颜色,它将用于绘制方框
    		, FColor::Blue//是跟踪命中颜色,用于显示命中的点
    	);
    	if (BoxTraceResult.bBlockingHit) {
    		print_k(1, "Blocking Hit!");
    	}
    
    }
    
    • 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

    在这里插入图片描述

    aaa

  • 相关阅读:
    前端面试题---作用域链和原型链
    MySQL日期函数
    Hive的内部表与外部表
    快速排序.
    SQL注入漏洞(postgresql注入)
    tensorflow学习1.3-创建会话,启动会话
    JavaScript apply、call、bind 函数详解
    【Oracle】多表联合查询超时问题排查
    WPF中, 如何将控件的触发事件绑定到ViewModel
    k8s--基础--27.2--企业级devops平台--安装jenkins
  • 原文地址:https://blog.csdn.net/wb175208/article/details/127822874