UE4 碰撞射线检测

2023-11-01


/**
默认 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<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());
	}
}

aaa

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UE4 碰撞射线检测 的相关文章

随机推荐

  • CORS与CSRF

    本文首发于我的Github博客 本篇文章介绍了CORS和CSRF的概念 作者前几天在和带佬们聊天的时候把两个概念搞混了 所以才想要了解 简单来说 CORS Cross Origin Resource Sharing 跨域资源分享 是一种机制
  • (1)基础学习——图解pin、pad、port、IO、net 的区别

    本文内容有参考多位博主的博文 综合整理如下 仅做和人学习记录 如有专业性错误还请指正 谢谢 参考1 芯片资料中的pad和pin的区别 imxiangzi的博客 CSDN博客 pin和pad的区别 参考2
  • IntelliJ IDEA 运行卡顿解决方案

    IntelliJ IDEA 运行卡顿解决方案 1 开启IntelliJ IDEA缓慢 想要提升启动速度 则打开D JetBrains IntelliJ IDEA 2020 3 2 bin 依据实际安装路径 目录下对应文件idea64 exe
  • 对csv文件,又get了新的认知

    背景 在数据分析时 有时我们会碰到csv格式文件 需要先进行数据处理 转换成所需要的数据格式 然后才能进行分析 业务侧的同学可能对Excel文件比较熟悉 Excel可以把单个sheet直接保存为csv文件 也可以直接读取csv文件 变成Ex
  • Qt 进程间通信

    Qt进程间通信的方法 TCP IP Local Server Socket 共享内存 D Bus Unix库 QProcess 会话管理 TCP IP 使用套接字的方式 进行通信 之前介绍了 这里就不介绍了 Local Server Soc
  • 用Tensorflow Agents实现强化学习DQN

    在我之前的博客中强化学习笔记 4 深度Q学习 gzroy的博客 CSDN博客 实现了用Tensorflow keras搭建DQN模型 解决小车上山问题 在代码里面 需要自己实现经验回放 采样等过程 比较繁琐 Tensorflow里面有一个a
  • C/C++编程:模板特例

    为什么要引入 单一模板很难兼顾各种情况 为此 C 提供了一种特例机制 对于某个已有模板 可以为某个或者某组模板参数类型另外指定一种变体 以应对原模板无法处理的情况 或者提供更高效的实现方案 这就是模板特例 实例 vector
  • win7 & centos7 双系统安装方法

    1 准备 1 Centos7镜像 官方 https www centos org 阿里镜像64位 http mirrors aliyun com centos 32位 https mirrors aliyun com centos alta
  • 计算机专业考哪些证书含金量高?考到就能加薪吗

    计算机专业要不要考证 考证很重要吗 考哪个好 对于有些人而言 他们可能会有人认为认证就是一张纸 没有太大的用处 看到大家都在考 心里又会产生动摇 还有人会认为考证的价格太高 担心自己没有办法考上白白浪费自己的金钱和时间 或者还有的人在认证的
  • MarkDown中写E-R图、甘特图、饼图的方法

    目录 序 E R 图 E R图的构成 关系的类型 关系的存在性 关系的语法 Mermaid中E R图的简单例子 样例 实体与关系的表示 属性的表示 特殊约束关系的表示 甘特图 Mermaid中甘特图的简单例子 样例 甘特图的标题 子任务的表
  • 如何进阶优秀数据分析师行列?方法、技术与工具,缺一不可!

    更多精彩推荐 请关注我们 入行数据分析师 从来都不是一蹴而就的 好比钓鱼 不是简单地把诱饵放上鱼钩 然后扔到水中 就可以有鱼上钓 方法 技术与工具 缺一不可 什么是举一反三 什么是学以致用 什么是融会贯通 不是靠一味地执著和花时间就可以达到
  • ajax发送post请求报403

    ajax发送post请求报403 检查提交的参数是否和后端接收的参数是否一直
  • 2022最新阿里Java面经,转疯了

    写在前面 最近 很多小伙伴出去面试都被问到了Spring问题 关于Spring 细节点很多 面试官也非常喜欢问一些很细节的技术点 所以 在 Spring 专题中 我们尽量把Spring的每个技术细节说清楚 将透彻 概述 自定义组件要想使用S
  • QCustomplot基本使用(一)

    文章目录 简述 下载 使用 简述 QCustomPlot是一个基于Qt C 的图形库 用于绘制和数据可视化 制作漂亮的2D图 曲线图 趋势图 坐标图 柱状图等 并为实时可视化应用程序提供高性能服务 它没有进一步的依赖关系 并有着良好的文档记
  • 环境配置相关

    anaconda pip无法识别 win10安装了Anaconda之后 未设置环境变量 想用pip命令导入第三方库 在anaconda文件夹下打开命令窗口 输入pip install tensorflow 报错如下 pip 无法将 pip
  • NFT数字藏品平台开发——如何快速搭建搭建数字藏品平台

    2021年可以称为元宇宙年 随着元宇宙概念的兴起 好多人都在关心我们是否可以成功构建元宇宙 显然是可以实现的 2022年年初 NFT在国内的热潮兴起 国内也称之为数字藏品 NFT由于具有不可置换 不可分割的特性 很快在国内掀起一热潮 西西弗
  • 线程间的通讯

    一 为什么需要线程通讯 线程是操作系统调度的最小单位 有自己的栈空间 可以按照既定的代码逐步的执行 但是如果每个线程间都孤立的运行 那就会造资源浪费 所以在现实中 我们需要这些线程间可以按照指定的规则共同完成一件任务 所以这些线程之间就需要
  • LoadRunner--并发测试(多用户)

    并发测试 多用户进行并发测试 即在同一时刻同时进行某种操作 1 何时使用集合点 并发测试时使用 2 并发测试的两个条件 1 脚本中加入集合点 在事务开始之前添加集合点 则所有虚拟用户执行到集合点时停止 等待并发 2 控制台中设置集合点策略设
  • TypeScript 枚举(enum)

    枚举定义 枚举通过enum关键字来定义 使用枚举我们可以定义一些有名字的数字常量 enum Direction Up 1 Down Left Right 枚举成员 一个枚举类型可以包含零个或多个枚举成员 枚举成员具有一个数字值 它可以是常数
  • UE4 碰撞射线检测

    默认 TraceTypeQuery1 Visibility 默认 TraceTypeQuery2 Camera void ATraceCharacter traceByChannel 获取该组件的拥有者 AActor MyOwner Get