【UE4 C++】碰撞检测与事件绑定
概念
碰撞对象通道与预设
默认提供碰撞对象类型,如 WorldStatic、WorldDynamic等。允许用户自定义
默认提供碰撞预设,如 NoCollision、BloackAll、OverlapAll。允许用户自定义

碰撞响应设置
可以用来设置是否模拟物理碰撞以及触发 Overlap 事件

碰撞响应类型
物体发生碰撞后,会有三种碰撞相响应类型

C++ 实现
Component 碰撞
注意 Overlap Begin/End 的函数参数
注意 OnHit 的函数参数
注意甚至 Generated Hit Event 的函数名
绑定函数可以用 AddDynamic,也可以用 FScriptDelegate 委托
部分设置可不写,蓝图使用时再手动设置
写法支持 UShapeComponent及其派生类,如 USphereComponent 、UBoxComponent 等
UPROPERTY(EditAnywhere)
USceneComponent* Root; UPROPERTY(EditAnywhere)
UStaticMeshComponent* Cube; UFUNCTION()
virtual void OnOverlapBegin(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult); UFUNCTION()
virtual void OnOverlapEnd(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult); UFUNCTION()
virtual void OnHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit);
ACollisionActor::ACollisionActor()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true; Root = CreateDefaultSubobject<USceneComponent>(TEXT("RootScene"));
SetRootComponent(Root); Cube = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Cube"));
Cube->SetupAttachment(Root);
static ConstructorHelpers::FObjectFinder<UStaticMesh> mesh(TEXT("StaticMesh'/Engine/BasicShapes/Cube.Cube'"));
if (mesh.Succeeded())
{
Cube->SetStaticMesh(mesh.Object);
} // 设置是否开启物理模拟
Cube->SetSimulatePhysics(false); // 开启 Generated Hit Event
Cube->SetNotifyRigidBodyCollision(true); // 开启CCD Continuous collision detection (CCD) 连续式碰撞检测
Cube->BodyInstance.SetUseCCD(true); // 开启Generate Overlap Events
Cube->SetGenerateOverlapEvents(true); // 设置碰撞预设
Cube->SetCollisionProfileName(TEXT("OverlapAll"));
//Cube->SetCollisionResponseToAllChannels(ECR_Overlap); // 设置碰撞响应设置
Cube->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics); // 绑定函数
Cube->OnComponentBeginOverlap.AddDynamic(this, &ACollisionActor::OnOverlapBegin); // 绑定函数 使用委托
FScriptDelegate OverlapEndDelegate;
OverlapEndDelegate.BindUFunction(this, TEXT("OnOverlapEnd"));
Cube->OnComponentBeginOverlap.Add(OverlapEndDelegate); // 绑定碰撞函数
Cube->OnComponentHit.AddDynamic(this, &ACollisionActor::OnHit);
} void ACollisionActor::OnOverlapBegin(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
UE_LOG(LogTemp, Warning, TEXT("Overlap Begin"));
} void ACollisionActor::OnOverlapEnd(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
UE_LOG(LogTemp, Warning, TEXT("Overlap End"));
} void ACollisionActor::OnHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit)
{
UE_LOG(LogTemp, Warning, TEXT("Hit"));
Destroy();
}
ATriggerBox 碰撞
OnActorBeginOverlap
OnActorEndOverlap
UFUNCTION()
void HandleOverlap(AActor* OverlappedActor, AActor* OtherActor );
void AMyTriggerBox::BeginPlay()
{
//放在构造函数好像不起作用
OnActorBeginOverlap.AddDynamic(this, &AMyTriggerBox::HandleOverlap);
} void AMyTriggerBox::HandleOverlap(AActor* OverlappedActor, AActor* OtherActor )
{
UClass* ActorClass = OtherActor->GetClass();
// 其他处理逻辑
}
参考
【UE4 C++】碰撞检测与事件绑定的更多相关文章
- MVVM设计模式和WPF中的实现(四)事件绑定
MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- 7 HTML&JS等前端知识系列之jquery的事件绑定
preface 我们知道,每一个a,input等等标签都可以为其绑定一个事件,onclick也好,focus 也罢,都可以绑定的.但是众神key想过这个问题没有,倘若这里有1000个input标签需要 ...
- 兼容8事件绑定与解绑addEventListener、removeEventListener和ie的attachEvent、detachEvent
兼容8事件绑定与解绑addEventListener.removeEventListener和ie的attachEvent.detachEvent ;(function(){ // 事件绑定 bi ...
- jQuery中事件绑定到bind、live、delegate、on方法的探究
1. 给页面上的某个元素绑定事件,最初采用下面的方式实现: $(‘selector’).click(function(){ //code }); 缺点: 不能同时绑定多个事件,不能绑定动态的元素. 后 ...
- jQuery中的事件绑定方法
在jQuery中,事件绑定方法大致有四种:bind(),live(), delegate(),和on(). 那么在工作中应该如何选择呢?首先要了解四种方法的区别和各自的特点. 在了解这些之前,首先要知 ...
- Vue - 事件绑定
1.内联方式: A:将事件处理器绑定到一个方法中,以下所有事件都以click事件作为案例 注意:内联方式下事件处理器只能绑定一个方法,要是想要绑定多个方法,依旧还是使用js中的addEventList ...
- jQuery 2.0.3 源码分析 事件绑定 - bind/live/delegate/on
事件(Event)是JavaScript应用跳动的心脏,通过使用JavaScript ,你可以监听特定事件的发生,并规定让某些事件发生以对这些事件做出响应 事件的基础就不重复讲解了,本来是定位源码分析 ...
- 深入学习jQuery事件绑定
× 目录 [1]bind [2]trigger [3]delegate[4]on[5]one 前面的话 javascript有HTML.DOM0级.DOM2级和IE这四种事件处理程序,而jQuery对 ...
- jQuery-1.9.1源码分析系列(十) 事件系统——事件绑定
事件绑定的方式有很多种.使用了jQuery那么原来那种绑定方式(elem.click = function(){...})就不推荐了,原因? 最主要的一个原因是elem.click = fn这种方式只 ...
随机推荐
- .Net Core配置Configuration源码研究
最近又研究了一下.NetCore配置选项的源码实现,又学习到了不少东西.这篇文章先写一下IConfiguration的学习成果,Options的后面补上 核心类 ConfigurationBuilde ...
- 洛谷P2338 Bessie Slows Down S 题解
题目 [USACO14JAN]Bessie Slows Down S 题解 这道题其实蛮简单的,不知道为什么难度划到了提高+,个人觉得这难度大概就是普及左右. 具体说说怎么做吧,简单模拟一下即可,始终 ...
- GRE隧道协议
1. GRE协议简介 GRE(General Routing Encapsulation ,通用路由封装)是对某些网络层协议(如IP和IPX)的数据报文进行封装,使这些被封装的报文能够在另一网络层协议 ...
- 学习Tomcat(一)之容器概览
Tomcat是Apache软件基金会的一个顶级项目,由Apache.Sun和其它一些公司及个人共同开发,是目前比较流行的Web服务器之一.Tomcat是一个开源的.小型的轻量级应用服务器,具有占用系统 ...
- [Apache Atlas] Atlas 架构设计及源代码简单分析
Apache Atlas 架构图 Atlas 支持多数据源接入:Hive.HBase.Storm等 Type System Type Atlas 中定义了一些元数据类型 ── AtlasBaseTyp ...
- requestAnimationFrame 切换页面问题
requestAnimationFrame 切换页面时, 之前定时的内容还会继续执行. 所以 要注意处理动画函数内容,否则会出现死循环. 遇到的问题: 我在两个页面都有使用 requestAnimat ...
- django安装xadmin
环境:pycharm django1.11.20 python2.7(根据网络上的资料,自己整理实现) 下载:https://github.com/sshwsfc/xadmin/tree/mast ...
- vue 主次页面区分
1.路由设定,增加meta参数 { path: '/', name: 'Home', component: Home, meta: { index: 0, showFooter: true //由这个 ...
- 利用Qt中的ui文件生成PyQt5程序,自定义槽函数
1.在Qt Creator4.8.0上面设计如上.ui文件 2.点击上方图标,可以建立信号-槽连接,button_click()为自定义槽函数 3.设计目的:点击clear按钮,可消除上方文本框中的内 ...
- 关于open falcon 与nightingale 的一些调研
针对 open-falcon 与 nightingale 的调研 一.open-falcon 1.1 组件介绍 1.1.1 agent > agent用于采集机器负载监控指标,比如cpu.idl ...