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转换为对应的名称来实现的。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值