Ue0:从零开始的虚幻生活
Posted 才极
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ue0:从零开始的虚幻生活相关的知识,希望对你有一定的参考价值。
碰撞
在虚幻四引擎中碰撞的设计是非常常用的,在虚幻的底层代码中大致将碰撞分为了两种:空间查询类型的碰撞与模拟类型的碰撞。
碰撞的使用
碰撞的话可分为以下两种需求:1.无需碰撞 2.仅对某一个物体的莫一种碰撞模式下才触发碰撞,我们先分别实现以下。
前提
假设我们有一个网格体叫MeshComp。
无需碰撞
MeshComp->SetCollisionEnabled(ECollisionEnabled::NoCollision);//设置:不能碰撞
仅对某一个物体的莫一种碰撞模式下才响应碰撞(以仅对Pawn类的物体在重叠模式下响应)为例
MeshComp->SetCollisionEnabled(ECollisionEnabled::QueryOnly);//设置一个碰撞模式
MeshComp->SetCollisionResponseToAllChannels(ECR_Ignore);//设置对所有物体的碰撞为忽略碰撞
MeshComp->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);//设置pawn对其的碰撞为重叠才响应
碰撞深究
在以上代码中我们在设置碰撞类型时用到了ECollisionEnabled::NoCollision与ECollisionEnabled::QueryOnly,这两个其实都是设置了一种碰撞模式,这种设置其实是一个枚举类型,而这种枚举类型都声明在ECollisionEnabled这个命名空间中,而这个命名空间声明在Engine Types.h这个文件中。
源代码为:
namespace ECollisionEnabled
enum Type
// 不会在物理引擎中创建任何表示。不能用于空间查询(光线投射,扫描,重叠)或模拟(刚体,约束)。最好的性能(特别是移动对象)
NoCollision UMETA(DisplayName="No Collision"),
//仅用于空间查询(光线投射,扫描和重叠)。不能用于模拟(刚体,约束)。适用于角色移动和不需要物理模拟的事物。通过使数据远离仿真树来提高性能
QueryOnly UMETA(DisplayName="Query Only (No Physics Collision)"),
// 仅用于物理模拟(刚体,约束)。不能用于空间查询(光线投射,扫描,重叠)。对于不需要每个骨骼检测的字符的抖动位有用。通过将数据排除在查询树之外来提高性能
PhysicsOnly UMETA(DisplayName="Physics Only (No Query Collision)"),
// 可以用于空间查询(光线投射,扫描,重叠)和模拟(刚体,约束)。
QueryAndPhysics UMETA(DisplayName="Collision Enabled (Query and Physics)")
;
也就是说存在NoCollision(不接受碰撞)、QueryOnly(只接受光线投射,扫描和重叠这类的碰撞)、PhysicsOnly(只接受刚体,约束这类碰撞)、QueryAndPhysics(接受碰撞),这四种碰撞模式。
其实在Engine Types.h这个文件中,我们还能找到一个熟悉的身影ECR_Ignore、ECR_Overlap与ECC_Pawn,而他们都是枚举中的一个元素,它们都是通过UMATE宏将DisplayName转换为对应的名称来实现的。
以上是关于Ue0:从零开始的虚幻生活的主要内容,如果未能解决你的问题,请参考以下文章