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 碰撞射线检测 的相关文章

  • 【UE4】【C++】PlayerController、AIController获取玩家对应的Pawn

    先创建一个基本的C 类 Tank 因为要对Tank进行各种操作 移动 寻找目标 所以选择了Pawn类型 PlayerController 再创建一个C 类 TankPlayerController 用以控制玩家操作的对象 Tank 创建好后
  • UE4 解决当角色走到一个物体上时会被弹开的问题

    检查被踩物体的碰撞组件Collision那一栏的CanCharacterStepOn是否是Yes 如果不是请更改之 如果没效那就是其他的碰撞问题
  • UE4 DDC共享

    本人用的是源码引擎编译的 内网使用DDC 先创建一个共享文件夹 这个文件夹来保存共享资源 修改引擎的baseengine ini cpp DerivedDataBackendGraph Shared Type FileSystem Read
  • UE4 蓝图通信:接口调用

    UE4学习心得 蓝图间信息通信的几种方法 UE4的接口调用技术有点简单粗暴 而且主要体现在主蓝图对子蓝图的信息通信 在内容浏览器中添加一个蓝图接口 命名为TestInterface 双击打开接口 直接使用其创建时自带的一个接口函数 将其重命
  • 2022年11月计划(cesium for ue源码抄写+ socket视频学习+ue4 tf视频学习)

    根据规划 进行cesium for ue源码抄写 网络视频教程 ue4 tf1视频学习
  • 修改UE4缓存路径,免得太多占用c盘空间

    UE4系列文章目录 文章目录 UE4系列文章目录 前言 一 修改默认缓存路径 打开Epic Games 自定义缓存位置 前言 在安装好了UE4之后 UE4引擎会默认生成缓存路径 C Users ASUS AppData Local Unre
  • UE4 命令工具打包

    用cmd进入UE4引擎的目录 Engine Build BatchFiles找到RunUAT bat cmd中输入以下命令 RunUAT BuildCookRun project F VidaUpdater VidaUpdater upro
  • UE4 UI界面

    在UE4中创建UI界面是创建一个widget 进去之后左上角是选择控件 找到直接拖上去 中间那个框代表的就是我们的屏幕 在button中打字也就是给button命名时需要在上面在拖一个text控件 更好的排版可以改变锚点 这四个就类似与边距
  • UE4安卓打包配置(大陆内网络整顿后,Android打包时AndroidWorks无法使用的解决方法)

    由于国内进行了网络整顿 UE4官网上用CodeWorksforAndroid下载安卓打包工具配置的方法已经不能使用了 开了VPN也链接不上 这使得用UE4打包配置安卓游戏变得非常麻烦 博主捣鼓了好几天才打包成功 深感在中国学习UE4的艰难与
  • 【UE4】搭建局域网内VR直播 UE4.27

    前言 英伟达显卡 UE4 27的内网搭建360 相机直播 并在内网任意设备使用VR观看 理论上性能足够效果越好 此处使用的VR设备为Vive 梳理了整体构建流程 希望能帮到你 多图警告 图片教程比较直观 1 准备工作 下载UE和OBS所需安
  • UE4 关于使用Webbrowser插件遇到的问题以及解决办法

    1 无法播放网页视频 这是因为UE4的WebBrowser自带的cef3为3071版本 默认不支持h364等直播流 导致web里的直播流无法播放 解决办法 第一种办法 重新编译了cef源码 改成支持H 264 然后在UE4安装目录下替换相关
  • UE4 VR WidgetInteraction 局域网设定

    无论用什么 我们要先确定是什么 鲁迅 下面是关于WidgetInteraction的官方定义 控件交互组件执行光线投射 确定它是否命中世界场景中的控件组件 如命中 可设置规则确定与其交互的方式 交互通过模拟定义的按键来执行 例如一个按钮可通
  • 2021年11月6日-11月12日(ogre抄写+ue4视频,本周35小时,共1035小时,剩8965小时。)

    这周还不错 不但完成了本周学习任务 还完成了本月学习任务 方法就是 拼命抄源码 抄到吐时就再看看Ue4视频教程 内外兼修 可以在未来的日子里这么进行 每天5小时学习 还是进入状态的 5 7 35小时 共1035小时 剩8965小时 另外 去
  • 第十七篇:Unity/UE4如何实现Cave空间(一)

    首先什么叫CAVE空间 CAVE是围绕着观察者具有多个图像画面的虚拟现实系统 多个投影面组成一个虚拟空间 理论上CAVE是基于计算机图形学把高分辨率的立体投影技术和三维计算机图形技术 音响技术 传感器技术等综合在一起 产生一个供多人使用的完
  • ue4 蓝图通信的几种方式

    一 设置公有变量 完成通信 1 蓝图类Door bp中声明变量NewVar 1 为公有 确定好变量类型 编译 2 关卡视口中选中这个蓝图类Door bp的实例 世界大纲视图下的细节面板中 默认下出现公有变量名称NewVar 1 用吸管吸取关
  • UE4 如何使用C++代码实现 在指定范围内随机生成同一个种类的不同物品(怪物,NPC,拾取物)的 自定义蓝图

    一 引言 在游戏世界中有特别多的物品 NPC 怪物 使用UE4中的蓝图我们可以摆放这些事务 但是如何在指定范围内随机生成同一个种类的不同事物呢 这就需要UE4 实现 C 自定义 蓝图功能 二 构思 首先我们构思一下实现上诉功能 应该怎么做
  • UE4 射线检测案例(C++)

    UE4 射线检测 C 开发场景 玩家 C 开发的 武器 C 射线检测函数 蓝图 C 效果 制作流程 添加开火按键映射 新建一个继承ACharacter的C 用蓝图继承刚刚新建的C 然后设置好游戏模式 我 这是是 用了一个枚举 其实你直接调用
  • 4,引擎初始化--(5)初始化actor--6,生成PlayActor--(2)玩家登录--3,PostLogin()(学习资料来自于ue4游戏框架)

    一旦PlayerController生成出来 world关于玩家的网络的初始化工作全部完成 接下来 进行PostLogin 从而在玩家加入游戏时 能做一些设置工作 默认情况下 GameMode会为新生的PlayerController建立一
  • UE4文字显示乱码“字字字字字字字字”的解决办法

    键盘win R 搜索fonts 2 滑到最底下右键复制 宋体常规简体字 3 复制到ue4项目的字体文件夹中 如下 注意在外部文件处复制 4 回到项目界面 此时右下角会有个弹窗提示是否确认导入 点击导入 然后会弹一个 字体样式导入选项 弹框
  • 【UE 材质】任务目标点效果

    效果 步骤 1 新建一个工程 创建一个Basic关卡 2 新建一个材质 这里命名为 M GoalPoint 打开 M GoalPoint 设置混合模式为 半透明 勾选 双面 在材质图表中添加如下节点 此时预览效果如下 继续添加如下节点 此时

随机推荐

  • 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