找回密码
 立即注册
查看: 384|回复: 1

UE私房菜-碰撞概述

[复制链接]
发表于 2023-3-23 08:22 | 显示全部楼层 |阅读模式
碰撞选项卡




碰撞选项卡

Collision Preset

通过设置属性进行控制碰撞,常用属性像Default(默认)NoCollisiona(无碰撞)Pawn(Pawn对象)Custom(自定义)等详细的碰撞属性可以查看官方文档
Collision Enabled

当我们使用Custom属性时此选项会高亮显示,其中有四种状态
1. No Collision:不启用碰撞检测和碰撞响应,物体之间不会发生任何碰撞
2. Query Only:启用碰撞检测,但不进行碰撞响应。物体之间会检测是否发生碰撞,但不会产生任何物理效果
启用碰撞不响应的意思是说,启用Query Only后,对象之间会进行碰撞检测,但不会进行任何碰撞响应。这意味着对象之间不会发生物理碰撞,例如反弹、推动或破坏等效果。如果两个对象之间发生了碰撞,那么系统会发送一个通知事件,该事件可以被Actor或Component对象接收到,并可以对其进行处理,例如播放音效或者动画等。
在游戏中,启用Query Only的对象通常用于探测、碰撞检测或者其他需要检测物体是否相交但不需要进行实际碰撞响应的情况。相比启用Collision Enabled的对象,启用Query Only的对象性能开销更小,因为它们不需要进行复杂的物理计算和碰撞响应。
3. Collision Enabled:既进行碰撞检测,也进行碰撞响应。物体之间会检测是否发生碰撞,同时会产生物理效果
4. Physics Only:只进行物理碰撞,不进行触发事件碰撞。当两个物体发生碰撞时,会进行物理模拟,如计算碰撞力和反弹效果
Object Type:


  • World Static:用于表示静态物体,如地形和建筑等,这些物体通常不会移动,与其他物体的碰撞检测由物理引擎进行处理。
  • World Dynamic:用于表示动态物体,如角色和游戏中的其他可移动物体等,这些物体通常会移动,与其他物体的碰撞检测由物理引擎进行处理。
  • Pawn:用于表示玩家控制的角色,与其他物体的碰撞检测由物理引擎进行处理。
  • Physics Body:用于表示带有物理属性的物体,如球体、盒子等,与其他物体的碰撞检测由物理引擎进行处理。
  • Vehicle:用于表示车辆或其他机动物体,与其他物体的碰撞检测由物理引擎进行处理。
Collision Responses:

对于碰撞响应知道有三种响应就行,忽略、重叠、碰撞



碰撞响应

剩下的选项可以看官方的文档,了解每个属性所代表的的意思
碰撞规则

规则1

两个(或多个)Actor被设置为Block时,自然会发生阻塞。但是,需要启用 模拟生成命中事件(Simulation Generates Hit Events) 才能执行 事件命中,该功能在蓝图、可破坏的Actor、触发器等处使用。
规则2

将 Actor 设置为 Overlap 时,它们通常看起来彼此忽略,而如果没有开启 Generate Overlap Events,它们实际上是相同的。这意味着如果两个 Actor 都设置为 Overlap,但没有开启 Generate Overlap Events,则它们将不会检测到彼此的重叠,并且不会触发任何事件。因此,如果需要在两个 Actor 之间检测重叠,并触发事件,需要将它们都设置为 Overlap,并开启 Generate Overlap Events。
规则3

如果一个物体被设置为阻挡其它物体类型,而另一个物体不被设置为与该物体类型阻挡,则它们之间将不会发生阻挡。因此,需要确保两个或多个物体都正确地设置了阻挡其它物体类型,以确保它们能够相互阻挡
规则4

即使一个物体被另一个物体Block,当它们以高速移动时,仍然可能会生成Overlap事件。如果一个物体同时具有collision和overlap事件,不建议这样做,因为这会导致需要手动处理很多问题。
在Unreal Engine中,Collision和Overlap是两个不同的概念。当两个物体发生碰撞时,它们将被阻挡,不会穿过彼此。而当一个物体与另一个物体重叠时,它们可以互相穿过,但是会生成Overlap事件。
在某些情况下,一个物体既需要进行碰撞检测又需要生成Overlap事件。例如,一个玩家角色需要在与地面碰撞时停止移动,同时还需要检测与某些物品的Overlap事件。然而,如果不小心将物体设置为同时具有collision和overlap事件,会导致一些问题,因为这会导致需要手动处理这些事件的优先级、触发顺序等问题。因此,建议在需要时仅使用碰撞或Overlap事件。
规则5

如果一个对象设置为忽略,另一个设置为重叠,则不会触发重叠事件。
交互示例

碰撞

左侧为球体右侧为墙壁



效果



球体

  球体是 物理形体(PhysicsBody),它设置为阻挡(block)场景动态(WorldDynamic)(这是墙壁的类型)



墙壁

  墙壁是 场景动态(WorldDynamic),它设置为阻挡(block)物理形体(PhysicsBody)Actor(这是球体的类型)
碰撞和模拟生成命中事件




效果



球体

  球体是 物理形体(PhysicsBody),它设置为`阻挡(block)场景动态(WorldDynamic)(这是墙壁的类型)。但是,球体也启用了 模拟生成命中事件(Simulation Generates Hit Events),这样每当它发生碰撞时就会针对自己触发事件



墙壁

  墙壁是 场景动态(WorldDynamic),它设置为阻挡(block)物理形体(PhysicsBody)Actor(这是球体的类型)。由于墙壁没有设置为 模拟生成命中事件(Simulation Generates Hit Events),因此不会针对自己生成事件
  通过将球体设置为 模拟生成命中事件(Simulation Generates Hit Events),球体就会告诉自己发生了碰撞。它会触发球体蓝图中的事件,例如 ReceiveHitOnComponentHit。现在,如果箱体发生了碰撞事件,则不会触发,因为它永远不会通知自己发生了碰撞。
重叠和忽略及重叠事件

其实原理基本互通,开启相应碰撞属性,做出相应的事件处理,下面是官方文档
碰撞使用方法

1. 编辑器面板Details设置:

选中想要设置的actor在Details面板中找到碰撞选项卡进行设置
详细参数可以查看官方文档



碰撞选项卡

2. C++进行碰撞设置

  在Unreal Engine中,可以通过在编辑器中的Details面板中选择Collision(碰撞)选项卡,来设置Actor对象的碰撞属性,包括物理形状(Collision Shape)、物理材质(Physical Material)、碰撞频道(Collision Channel)和碰撞响应(Collision Response)等。而SetCollisionProfileName函数则是通过代码方式来设置这些属性的一种方法。



碰撞预设

SetCollisionProfileName()



官网注释


  • 设置碰撞对象的默认碰撞属性
  在构造函数或者 BeginPlay 等函数中调用 SetCollisionProfileName 函数,可以将对象的默认碰撞属性设置为特定的 Collision Profile。
// 在对象的构造函数中设置碰撞属性
MyObject::MyObject()
{
     SetCollisionProfileName(TEXT("MyCustomCollisionProfile"));
}

  • 动态修改对象的碰撞属性
  SetCollisionProfileName 函数还可以用于在运行时动态修改对象的碰撞属性。例如,在处理某些事件时,根据特定条件修改对象的碰撞属性。
以下是一个示例代码,用于在对象接收到某个事件时,将其碰撞属性修改为 "NoCollision":
// 常用的碰撞预设值
// NoCollision:没有碰撞。
// Pawn:Actor 与 Pawn 类型的 Actor 发生碰撞。
// PhysicsActor:Actor 与 PhysicsActor 类型的 Actor 发生碰撞。
// Vehicle:Actor 与 Vehicle 类型的 Actor 发生碰撞。
// Destructible:Actor 与 Destructible 类型的 Actor 发生碰撞。
// Projectile:Actor 与 Projectile 类型的 Actor 发生碰撞。
// Custom:自定义碰撞配置。
MyObject::OnEventReceived()
{
     SetCollisionProfileName(TEXT("NoCollision"));
}

  • 示例
// .h
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "SMagicProjectile.generated.h"
class USphereComponent;

UCLASS()
class ACTIONROGUELIKE_API ASMagicProjectile : public AActor
{
    GENERATED_BODY()
   
public:   
    // Sets default values for this actor's properties
    ASMagicProjectile();
protected:
    // 创建一个Sphere对象

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
    USphereComponent* SphereComp;
    ...
};

// .cpp
// 实例化Sphere对象
SphereComp = CreateDefaultSubobject<USphereComponent>("SphereComp");
// SetCollisionProfileName函数的参数是一个字符串类型的InCollisionProfileName,表示要设置的碰撞配置文件名称。
SphereComp->SetCollisionProfileName("Projectile");
  在C++内设置完配置文件的名字后,我们需要在编辑器的Project Settings(项目设置)找到Collision(碰撞)选项卡点击Preset,新建一个配置,之后在名字中输入C++代码中设置好的配置文件名字就好了



Project Settings



Actor Collision选项卡

https://chat.openai.com/chat/
https://docs.unrealengine.com/4.27/zh-CN/InteractiveExperiences/Physics/Collision/Reference/
https://docs.unrealengine.com/4.27/zh-CN/InteractiveExperiences/Physics/Collision/Overview/
https://www.bilibili.com/video/BV1nU4y1X7iQ/?p=27&spm_id_from=pageDriver&vd_source=a6531e0ff44533694ccbf8c666bf6814

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2023-3-23 08:24 | 显示全部楼层
个人学习时做的总结,有写的不好或者错误的地方欢迎斧正,万分感谢
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-16 19:35 , Processed in 0.103915 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表