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);
	}
}

最后一个参数: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);
		}
	}
}

放置是三个立方体,从前往后设置参数:
第一个立方体设置【碰撞】->【碰撞预设】->【碰撞相应】->【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!");
	}

}

在这里插入图片描述

aaa

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值