UE4学习-鼠标事件(按下、释放、物体抓取、计算重量、触发开门)
文章目录
- 关键类
- 鼠标按下、释放事件
- 物体抓取
- 计算物体重量
关键类
本篇博文用到的关键类有:
UInputComponent 用来绑定鼠标的按下和释放事件 BindAction
UPhysicsHandleComponent 设置被抓取物体的抓取,移动,释放
GrabComponentAtLocationWithRotation
ReleaseComponent
SetTargetLocation
UPrimitiveComponent 抓取组件抓取的对象
还可以获取质量 GetMass
鼠标按下、释放事件
首先,添加鼠标事件,在项目设置中,引擎->输入->操作映射,按加号,添加一个映射对象,然后添加一个鼠标左键事件,一个空格键事件。
在代码中创建一个 UInputComponent对象。
在grabber.h文件中,定义个人建议使用前置声明,把头文件放在cpp里面去包含。
并且添加两个函数,一个表示按下,一个表示释放。
#include <Components/InputComponent.h>void Grab();void Release();UInputComponent* inputComponent = nullptr;
在cpp文件中添加:
// Called when the game starts
void Ugrabber::BeginPlay()
{Super::BeginPlay();inputComponent = GetOwner()->FindComponentByClass<UInputComponent>();if (nullptr != inputComponent){UE_LOG(LogTemp, Warning, TEXT("find inputComponent"));inputComponent->BindAction("grab", IE_Pressed, this, &Ugrabber::Grab);inputComponent->BindAction("grab", IE_Released, this, &Ugrabber::Release);}else{UE_LOG(LogTemp, Error, TEXT("not find inputComponent"));}}void Ugrabber::Grab()
{UE_LOG(LogTemp, Warning, TEXT("inputComponent press"));
}void Ugrabber::Release()
{UE_LOG(LogTemp, Error, TEXT("inputComponent release"));
}
然后在虚幻编译器中进行编译,运行,鼠标按下释放,空格按下释放,都能打印日志,表示事件被触发。
物体抓取
首先给pawn添加组件
编译,保存。
添加的句柄对应的类是UPhysicsHandleComponent。
在grabber.h文件中,定义个人建议使用前置声明,把头文件放在cpp里面去包含。
并且添加两个函数,一个表示按下,一个表示释放。
class UPhysicsHandleComponent;
UPhysicsHandleComponent* physicsHandel = nullptr;
在grabber.cpp文件中添加:
BeginPlay()
{physicsHandel = GetOwner()->FindComponentByClass<UPhysicsHandleComponent>();
}// Called every frame
void Ugrabber::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{Super::TickComponent(DeltaTime, TickType, ThisTickFunction);// 设置抓取物体跟随移动if (physicsHandel && physicsHandel->GrabbedComponent){physicsHandel->SetTargetLocation(getLineEnd());}
}void Ugrabber::Grab()
{UE_LOG(LogTemp, Warning, TEXT("inputComponent press"));FHitResult hit = lineTrace();UPrimitiveComponent* primit = hit.GetComponent();if (hit.GetActor() && physicsHandel){UE_LOG(LogTemp, Warning, TEXT("Grab"));physicsHandel->GrabComponentAtLocationWithRotation(primit, NAME_None, primit->GetOwner()->GetActorLocation(), GetOwner()->GetActorRotation());}
}void Ugrabber::Release()
{UE_LOG(LogTemp, Error, TEXT("inputComponent release"));if (physicsHandel){physicsHandel->ReleaseComponent();}
}
这里把物体的抓取和释放的函数修改了。
计算物体重量
要计算物体重量,需要给物体添加一个选项: 生成重叠事件
还要给物体设置重量,桌子20kg,椅子10kg。
一定要把物体的 生成重叠事件 这个选项勾选,否则没法被检查到。物体质量也没法计算。
在openDoor.h文件中添加一个函数:
float GetTotalMassInTrigger();
在openDoor.cpp文件中添加如下代码:
float UopenDoor::GetTotalMassInTrigger()
{if (nullptr == trigger){return 0.0f;}TArray<AActor*> actArr;trigger->GetOverlappingActors(OUT actArr);float totalMass = 0.0f;for (const AActor* act : actArr){totalMass += act->FindComponentByClass<UPrimitiveComponent>()->GetMass();}UE_LOG(LogTemp, Warning, TEXT("total mass %f"), totalMass);return totalMass;
}// Called every frame
void UopenDoor::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{Super::TickComponent(DeltaTime, TickType, ThisTickFunction);// if (nullptr != trigger && trigger->IsOverlappingActor(pawn))if(trigger && GetTotalMassInTrigger() > 25.0f){openDoor();lastTime = GetWorld()->GetTimeSeconds();}if (GetWorld()->GetTimeSeconds() - lastTime > openTime){closeDoor();}
}
在 TickComponent 函数中添加了质量判断,还修改开门的方式,桌子和椅子一共的重量添加,才能触发开门。
运行起来,桌子和椅子一起在触发器范围内,总质量为30kg,触发机关,门打开了。
当然角色老是会在空中飘着,给角色也设置一个模拟物体的属性,这样物体就带重力了,跳上去也会慢慢落下来。
到此,游戏基本完成,下篇博文会使用蓝图对开门等操作,设置动画效果。
UE4学习-鼠标事件(按下、释放、物体抓取、计算重量、触发开门)相关推荐
- 学习记录baxter仿真 物体抓取
笔者所用系统为 ubuntu18.04 ros melodic 1.安装依赖 baxter sdk baxter simulator 能正常在gazebo下加载baxter模型,如图 2.下载lear ...
- 物体抓取位姿估計算法綜述_基于深度学习的物体抓取位置估计
主讲题目:基于深度学习的物体抓取位置估计 主要内容:机械臂抓取技术简介与入门方法 主讲嘉宾:东北大学研究生,主要研究物体六自由度位姿估计,机械臂抓取. 知乎视频www.zhihu.com 往期干货资 ...
- 学校铃声Java_java_java多线程抓取铃声多多官网的铃声数据,一直想练习下java多线程抓取数 - phpStudy...
java多线程抓取铃声多多官网的铃声数据 一直想练习下java多线程抓取数据. 有天被我发现,铃声多多的官网(http://www.shoujiduoduo.com/main/)有大量的数据. 通过观 ...
- 大盘点|基于RGB图像下的机器人抓取
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 前言 近期读取了一些最新基于RGB图像下的机器人抓取论文,在这里分享下思路. 1.Optimizing ...
- 小猪的Python学习之旅 —— 14.项目实战:抓取豆瓣音乐Top 250数据存到Excel中
小猪的Python学习之旅 -- 14.项目实战:抓取豆瓣音乐Top 250数据存到Excel中 标签:Python 一句话概括本文: 利用Excel存储爬到的抓取豆瓣音乐Top 250数据信息,还有 ...
- 物体抓取位姿估計算法綜述_NO. 1 物体位姿估计 机器人抓取
开源算法 [MIT & Princeton 做的物体抓取算法] 基本思想:基于深度学习物体语义分割 -> 基于事先建好的模型进行ICP匹配获得位姿 特色:利用自监督学习减少数据的依赖性 ...
- oracle tcpdump生成bpf,[20140212]linux下使用tcpdump抓取sql语句
[20140212]linu下使用tcpdump抓取sql语句.txt 我们生产系统问题多多,经常要跟踪用户执行的sql语句,当出现问题时要跟踪比较麻烦,我需要一个快捷的方式"看到" ...
- UR5e+robotiq85+kinectV2+gazebo实现物体抓取【4】
文章目录 前言 一.利用find_object_2d包提取特征 三.抓取实现 总结 前言 在前面文章1.2.3的基础上,进一步在ros平台上实现了物体抓取.通过urdf.xacro文件把robot ...
- python selenium鼠标点击_Python+Selenium学习--鼠标事件
场景 前景讲解了鼠标的click()事件,而我们在实际的web产品测试中,有关鼠标的操作,不仅仅只有单击,有时候还包括右击,双击,拖动等操作,这些操作包含在ActionChains类中. Action ...
最新文章
- 详细介绍Java垃圾回收机制
- HokeyPokey — WWDC讲师特供XCode插件高仿版的设计与实现
- Direct2D (25) : 将画笔线条所占用的区域转换为路径 - ID2D1Geometry.Widen()
- java易语言_java程序员,0基础学习开发易语言。
- 数据中心基础设施:建设与设计
- Java:数列排序 给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
- [渝粤教育] 西南科技大学 现代企业管理 在线考试复习资料
- [css] 行内元素和块级元素有什么区别,如何相互转换?
- Linux下CMAKE编译jsoncpp,c – 如何为jsoncpp编写cmake模块?
- Android应用开发—onSaveInstanceState方法什么时候被调用?
- 实战GraphQL+express+mysql项目完整demo
- 您已到达6300千米深度,速度8 公里/秒,正在穿过地心 [置顶]
- scala map,foreach,flatMap等方法对比
- SHFileOperation 用法
- 全能扫描王的实现(python版本)- 目标检测图像矫正
- hotmail 获取邮箱授权码
- Flutter CircularProgressIndicator圆形进度指示器
- CBOW(Continous Bag of Words)模型学习(2020-08-19)
- np.arange函数
- 关于微信卡券47001的问题
热门文章
- TypeScript 里的 unknown 和 never
- SAP Spartacus服务器端渲染模式下的调试方法
- 如何确认客户使用的Spartacus库文件是未经修改过的原始版本
- SAP Spartacus的用户登录页面设计
- TypeScript里的类型为any和泛型的区别
- Eclipse里调试时遇到Source not found应该怎么办
- SAP CRM IBASE read header debug
- why in GM0 our extension component this.sPath is not correct
- 只要200行JavaScript代码,就能把特斯拉汽车带到您身边
- nodejs项目npm start背后的工作原理