概念

碰撞对象通道与预设

  • 默认提供碰撞对象类型,如 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++】碰撞检测与事件绑定的更多相关文章

  1. MVVM设计模式和WPF中的实现(四)事件绑定

    MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  2. 7 HTML&JS等前端知识系列之jquery的事件绑定

    preface 我们知道,每一个a,input等等标签都可以为其绑定一个事件,onclick也好,focus 也罢,都可以绑定的.但是众神key想过这个问题没有,倘若这里有1000个input标签需要 ...

  3. 兼容8事件绑定与解绑addEventListener、removeEventListener和ie的attachEvent、detachEvent

    兼容8事件绑定与解绑addEventListener.removeEventListener和ie的attachEvent.detachEvent   ;(function(){ // 事件绑定 bi ...

  4. jQuery中事件绑定到bind、live、delegate、on方法的探究

    1. 给页面上的某个元素绑定事件,最初采用下面的方式实现: $(‘selector’).click(function(){ //code }); 缺点: 不能同时绑定多个事件,不能绑定动态的元素. 后 ...

  5. jQuery中的事件绑定方法

    在jQuery中,事件绑定方法大致有四种:bind(),live(), delegate(),和on(). 那么在工作中应该如何选择呢?首先要了解四种方法的区别和各自的特点. 在了解这些之前,首先要知 ...

  6. Vue - 事件绑定

    1.内联方式: A:将事件处理器绑定到一个方法中,以下所有事件都以click事件作为案例 注意:内联方式下事件处理器只能绑定一个方法,要是想要绑定多个方法,依旧还是使用js中的addEventList ...

  7. jQuery 2.0.3 源码分析 事件绑定 - bind/live/delegate/on

    事件(Event)是JavaScript应用跳动的心脏,通过使用JavaScript ,你可以监听特定事件的发生,并规定让某些事件发生以对这些事件做出响应 事件的基础就不重复讲解了,本来是定位源码分析 ...

  8. 深入学习jQuery事件绑定

    × 目录 [1]bind [2]trigger [3]delegate[4]on[5]one 前面的话 javascript有HTML.DOM0级.DOM2级和IE这四种事件处理程序,而jQuery对 ...

  9. jQuery-1.9.1源码分析系列(十) 事件系统——事件绑定

    事件绑定的方式有很多种.使用了jQuery那么原来那种绑定方式(elem.click = function(){...})就不推荐了,原因? 最主要的一个原因是elem.click = fn这种方式只 ...

随机推荐

  1. Java创建线程池的方法

    Executors创建四种线程池: CachedThreadPool:可缓存的线程池,该线程池中没有核心线程,非核心线程的数量为Integer.max_value,当有需要时创建线程来执行任务,没有需 ...

  2. leetcode 括号

    1. 括号(0809) 设计一种算法,打印n对括号的所有合法的(例如,开闭一一对应)组合. 说明:解集不能包含重复的子集. 例如,给出 n = 3,生成结果为: [ "((()))" ...

  3. shp的基本操作

    本节将介绍如何利用python完成对shp的基本操作 1.读取shp四至 import shapefile sf = shapefile.Reader(r"E:\shp\1.shp" ...

  4. Robot Framework(9)- 使用变量文件

    如果你还想从头学起Robot Framework,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1770899.html 啥是变量文件 变 ...

  5. ARP原理和常见分类

    路由器一个重要功能是隔离广播域.就是不转发广播包,而ARP请求就是个广播包===> arp 代理 1. ARP交互流程: (1)目的地址和主机在同一个网段(A-C): A ----------- ...

  6. DevExpress Silverlight DXChart特效总结

    1.  主题修改 引用  xmlns:core=http://schemas.devexpress.com/winfx/2008/xaml/core 在Grid中添加core:ThemeManager ...

  7. python中的getpass模块问题,在pycharm中不能继续输入密码

    python中getpass模块   在pycharm中运行下面的代码: 1 import getpass 2 name = input('请输入你的名字:') 3 passwd = getpass. ...

  8. 驱动IO模型-select

    新人学习,欢迎指正 部分select.c代码 应用层 select(maxfd+1,&rfds,NULL,NULL,NULL); -------------------(系统调用)------ ...

  9. JSON,XML设计模式详解

    JSON在Java中的应用: Json概念: json 是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式用来存储和表示数据.JSON的语言简洁清晰,广为大众所欢迎,是一种理想的数据交换语言 ...

  10. 解决dede编辑器不能保存word文档样式问题

    ckeditor在dede里不能保存样式,试过多种解决办法都还是没有解决.最终将编辑器换成FCK得到解决. 第一步:下载FCK编辑器 下载地址: 链接: http://pan.baidu.com/s/ ...