文章目录

  • 关键类
  • 鼠标按下、释放事件
  • 物体抓取
  • 计算物体重量

关键类

本篇博文用到的关键类有:

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学习-鼠标事件(按下、释放、物体抓取、计算重量、触发开门)相关推荐

  1. 学习记录baxter仿真 物体抓取

    笔者所用系统为 ubuntu18.04 ros melodic 1.安装依赖 baxter sdk baxter simulator 能正常在gazebo下加载baxter模型,如图 2.下载lear ...

  2. 物体抓取位姿估計算法綜述_基于深度学习的物体抓取位置估计

    主讲题目:基于深度学习的物体抓取位置估计 主要内容:机械臂抓取技术简介与入门方法 主讲嘉宾:东北大学研究生,主要研究物体六自由度位姿估计,机械臂抓取. 知乎视频​www.zhihu.com 往期干货资 ...

  3. 学校铃声Java_java_java多线程抓取铃声多多官网的铃声数据,一直想练习下java多线程抓取数 - phpStudy...

    java多线程抓取铃声多多官网的铃声数据 一直想练习下java多线程抓取数据. 有天被我发现,铃声多多的官网(http://www.shoujiduoduo.com/main/)有大量的数据. 通过观 ...

  4. 大盘点|基于RGB图像下的机器人抓取

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 前言 近期读取了一些最新基于RGB图像下的机器人抓取论文,在这里分享下思路. 1.Optimizing ...

  5. 小猪的Python学习之旅 —— 14.项目实战:抓取豆瓣音乐Top 250数据存到Excel中

    小猪的Python学习之旅 -- 14.项目实战:抓取豆瓣音乐Top 250数据存到Excel中 标签:Python 一句话概括本文: 利用Excel存储爬到的抓取豆瓣音乐Top 250数据信息,还有 ...

  6. 物体抓取位姿估計算法綜述_NO. 1 物体位姿估计 机器人抓取

    开源算法 [MIT & Princeton 做的物体抓取算法] 基本思想:基于深度学习物体语义分割 -> 基于事先建好的模型进行ICP匹配获得位姿 特色:利用自监督学习减少数据的依赖性 ...

  7. oracle tcpdump生成bpf,[20140212]linux下使用tcpdump抓取sql语句

    [20140212]linu下使用tcpdump抓取sql语句.txt 我们生产系统问题多多,经常要跟踪用户执行的sql语句,当出现问题时要跟踪比较麻烦,我需要一个快捷的方式"看到" ...

  8. UR5e+robotiq85+kinectV2+gazebo实现物体抓取【4】

    文章目录 前言 一.利用find_object_2d包提取特征 三.抓取实现 总结 前言   在前面文章1.2.3的基础上,进一步在ros平台上实现了物体抓取.通过urdf.xacro文件把robot ...

  9. python selenium鼠标点击_Python+Selenium学习--鼠标事件

    场景 前景讲解了鼠标的click()事件,而我们在实际的web产品测试中,有关鼠标的操作,不仅仅只有单击,有时候还包括右击,双击,拖动等操作,这些操作包含在ActionChains类中. Action ...

最新文章

  1. 详细介绍Java垃圾回收机制
  2. HokeyPokey — WWDC讲师特供XCode插件高仿版的设计与实现
  3. Direct2D (25) : 将画笔线条所占用的区域转换为路径 - ID2D1Geometry.Widen()
  4. java易语言_java程序员,0基础学习开发易语言。
  5. 数据中心基础设施:建设与设计
  6. Java:数列排序 给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
  7. [渝粤教育] 西南科技大学 现代企业管理 在线考试复习资料
  8. [css] 行内元素和块级元素有什么区别,如何相互转换?
  9. Linux下CMAKE编译jsoncpp,c – 如何为jsoncpp编写cmake模块?
  10. Android应用开发—onSaveInstanceState方法什么时候被调用?
  11. 实战GraphQL+express+mysql项目完整demo
  12. 您已到达6300千米深度,速度8 公里/秒,正在穿过地心 [置顶]
  13. scala map,foreach,flatMap等方法对比
  14. SHFileOperation 用法
  15. 全能扫描王的实现(python版本)- 目标检测图像矫正
  16. hotmail 获取邮箱授权码
  17. Flutter CircularProgressIndicator圆形进度指示器
  18. CBOW(Continous Bag of Words)模型学习(2020-08-19)
  19. np.arange函数
  20. 关于微信卡券47001的问题

热门文章

  1. TypeScript 里的 unknown 和 never
  2. SAP Spartacus服务器端渲染模式下的调试方法
  3. 如何确认客户使用的Spartacus库文件是未经修改过的原始版本
  4. SAP Spartacus的用户登录页面设计
  5. TypeScript里的类型为any和泛型的区别
  6. Eclipse里调试时遇到Source not found应该怎么办
  7. SAP CRM IBASE read header debug
  8. why in GM0 our extension component this.sPath is not correct
  9. 只要200行JavaScript代码,就能把特斯拉汽车带到您身边
  10. nodejs项目npm start背后的工作原理