Skip to main content

常用物理属性

相关组件

对象名说明
LModelComponent模型组件,用于向游戏对象添加一个模型。小到各种物品,大到各种建筑,都可以通过模型组件添加到场景中。
LBoxComponent盒子组件,用于向游戏对象添加一个盒子碰撞体。
LSphereComponent球形组件,用于向游戏对象添加一个球碰撞体。
LCapsuleComponent胶囊体组件,用于向游戏对象添加一个胶囊体碰撞体。
LSkeletalMeshComponent骨骼动画组件,用于向游戏对象添加一个骨骼动画模型。各种角色、怪物,都可以通过骨骼动画组件添加到场景中。

各组件的物理(Physics) 属性内容会存在略微的差异,但碰撞(Collision) 属性内容基本相同。

组件属性

变换

物理属性面板

属性说明
移动性(Mobility)该属性决定组件是否可移动,同时决定组件创建的物理对象为静态还是动态类型。
  • 可移动(Movable):组件创建动态的物理对象
  • 静态(Static):组件创建静态的物理对象

物理

image-20230407171959965

属性说明
覆写物理文件(Override Physics File)是否使用自定义物理资源。
如果覆写物理文件( Override Physics File) = false,则组件会自动寻找并加载与当前模型匹配的物理资源文件。
如果覆写物理文件( Override Physics File) = true,则组件仅加载用户指定的物理资源文件。
如果此时用户指定的文件为空或者不存在,则组件会尝试创建默认的碰撞。
刚体文件(Rigid File)用户指定的物理资源文件路径。
根据组件类型的分类,这个属性的名称也会发生变化。如:
模型组件(LModelComponent)对应的属性名为刚体文件(Rigid File)。
骨骼动画组件(LSkeletalMeshComponent)对应的属性名为布娃娃(Ragdoll File)。
破碎组件(LDestructibleComponent)对应的属性名为可破坏文件(Destructible File)。
注:对于模型组件(LModelComponent),如果刚体文件(Rigid File)属性设置的资源文件为空或者无效,则组件会尝试创建默认的碰撞。
参与物理模拟的组件会默认创建凸包碰撞,其他默认创建网格体(Mesh)碰撞。
注意:尽量通过刚体编辑器为模型组件制作碰撞资源,因为组件的默认碰撞是在编辑器运行时通过模型顶点实时生成的。
同时应尽量使用简单的碰撞形状(比如球/胶囊体/盒子),代替凸包或者网格体(Mesh)碰撞(如果可以的话),因为简单的碰撞形状效率更高。
模拟物理(Simulate Physics)组件是否参与物理模拟。
当模拟物理(Simulate Physics) = true 时,开始游戏后组件会自动开始物理模拟。
当移动性(Mobility)被设置为静态(Static)时,模拟物理(Simulate Physics)属性会自动设置为false。
当模拟物理(Simulate Physics)属性设置为true时,移动性(Mobility)会自动被设置为可移动(Movable)。
初始唤醒(Start Awake)游戏开始后是否唤醒组件。
当组件参与物理模拟,但又希望组件初始静止,直到被其他物体碰撞之后再激活模拟时。
此时可将初始唤醒(Start Awake)属性设置为false以得到上述效果。
自动焊接(Auto Weld)是否自动焊接到父组件。
当自动焊接(Auto Weld) = true时,当前组件会自动焊接到其父组件上,与父组件的碰撞组合成为一个整体。
质量(Mass)质量相关的属性设置。
材质(Material)物理材质相关的属性设置。
重力(Gravity)重力相关的属性设置。

质量

物理属性面板

属性说明
质量覆盖(Mass Override)是否覆盖当前组件的质量。
当覆写默认质量(Mass Override) = true时,组件的质量为质量(Kg)(Mass In Kg)属性的值。
当覆写默认质量(Mass Override) = false时,组件的质量为刚体文件(Rigid File)属性指定的物理资源文件中设置的质量。
如果此时未指定刚体文件(Rigid File)或者不存在对应的物理资源文件,则组件的质量默认为1。
质量(Kg)(Mass In Kg)指定的质量值(Kg)。

材质

image-20230406135549078

属性说明
材质覆盖(Material Override)物理材质文件。
材质覆盖(Material Override)指定的材质文件中的属性会默认设置给组件包含的每一个碰撞体。
赋予碰撞体材质(Apply Material To Colliders)为组件的某个特定的碰撞体指定一个材质文件,会覆盖材质覆盖(Material Override)指定的材质文件中的属性。
当一个模型拥有不同的材质时,可通过赋予碰撞体材质(Apply Material To Colliders)来设置特定的材质。

重力

物理属性面板

属性说明
启用重力(Enable Gravity)是否启用重力。
该属性需要在组件成功加载物理并且模拟物理(Simulate Physics) = true时才生效。
重力类型(Gravity Type)选择不同的重力类型,可获得不同的重力效果,重力类型是可通过程序扩展的。
内置的重力类型如下:
  • Default:默认重力,方向沿世界空间坐标系-Y轴向下的重力,重力加速度默认为9.8。
  • LVectorGravity:向量重力,可自行指定重力方向和加速度大小的重力。
  • LSphereGravity:球形重力,重力方向始终自动指向球心的重力。
  • LVoxelCubeGravity:体素盒子重力,在盒子的6个面与面法线相反方向的重力。
向量重力

image-20230406152838281

属性说明
地形组件(Terrain Component)场景中任意的模型或者地形组件。
地形重力轴(Gravity Axis Of Terrain)根据地形组件(Terrain Component)指定的组件,选择组件任意坐标轴方向为重力方向。
重力加速度(Gravity Acceleration)重力加速度。
球形重力

image-20230406154917407

属性说明
地形组件(Terrain Component)场景中任意的模型或者地形组件。
组件的位置为球心位置。
重力加速度(Gravity Acceleration)重力加速度。
体素盒子重力

image-20230406155143813

属性说明
体素地形组件(Voxel Terrain Component)场景中任意的体素地形组件。
重力加速度(Gravity Acceleration)重力加速度。

进阶

133253327015001530

属性说明
默认激活动态模拟(Start Active Dynamic)开始游戏后是否激活组件的物理模拟。
该属性在模拟物理(Simulate Physics) = true时生效。
当默认激活动态模拟(Start Active Dynamic) = false 时,开始游戏后,组件不会自动开始物理模拟,而是以运动学刚体的状态被创建。
运动学刚体需要通过外部设置来改变位置。
最大角速度(Max Angular Velocity)限制组件在参与物理模拟时,最大的旋转角速度。
线性阻尼 (Linear Damping)影响组件在参与物理模拟时,线性速度衰减的速率。
角阻尼(Angular Damping)影响组件在参与物理模拟时,角速度衰减的速率。
睡眠阈值(Sleep Threshold)设定组件在参与物理模拟时,进入Sleep状态的最小能量阈值。
陷入Sleep状态的组件不会参与模拟,直到被其他物体碰撞或者被强制唤醒,才会退出Sleep状态并重新参与物理模拟。
唤醒计数(Wake Counter)决定组件刚体进入睡眠状态的最小时间。在物体动能还没有低于睡眠阈值(Sleep Threshold)之前,物体是不会进入唤醒计数的。唤醒计数结束后物体进入睡眠状态。
稳定阈值(Stable Threshold)当组件刚体的质量归一化动能(mass-normalized kinetic energy)低于该阈值时,物体将趋于稳定。这里的稳定指的是场景中大量物体间相互作用的稳定性。
最小位置迭代(Position Solver Iteration)位置迭代次数。
该属性可用于提高约束模拟的质量。
例如,组件与约束组件链接,并且在模拟时发生抖动等不稳定的情况,可增大该属性的值,使模拟趋于稳定。
注意:该属性值越大性能消耗就越大。
最小速度迭代(Velocity Solver Iteration)速度迭代次数。
该属性可用于提高物理模拟碰撞点的准确性。
当你发现两个相互碰撞的物体发生严重陷入时,可尝试增大该属性值,让两个物体的碰撞位置更加准确。
注意:该属性值越大性能消耗就越大。
质心偏移(Center Of Mass Offset)用于在组件刚体原本质心的基础上,偏移组件刚体质心位置。
惯性张量缩放系数(Inertia Tensor Scale)用于在组件刚体原本的惯性张量基础上,缩放组件刚体的惯性张量系数。
支配组(Dominance Group)每个组件可以被指定到索引为1到10的支配组中,索引越大支配等级越高。
处于支配地位的组件相对于被支配的组件质量是无限大的。
比如物体A的支配组(Dominance Group) = 1,物体B的支配组(Dominance Group) = 2,在物理模拟中,物体A是撞不动物体B的。
当支配组(Dominance Group) = None时,组件不属于任何支配组,与索引为1到10的支配组都不存在支配关系。
这个属性经常被用于解决一些动态物体,非常容易受运动学物体碰撞挤压后弹飞的情况。

碰撞

碰撞是最常用的物理属性,这组属性被同时应用于物理模拟和场景碰撞检测。

image-20230406162449680

属性说明
碰撞预设(Collision Presets)选择碰撞预设。碰撞预设通常包含一个碰撞通道(Collision Channel)类型以及一组碰撞响应(Collision Response)参数。
碰撞预设可以通过碰撞预设编辑器 (Collision Preset Editor )进行添加/删除/编辑等操作。
引擎提供的碰撞预设:
  • Default:默认的碰撞预设类型。
    如果组件的刚体文件(Rigid File)属性设置有效,组件使用刚体文件(Rigid File)指定的物理资源文件中的碰撞配置。
    如果刚体文件(Rigid File)属性无效,则使用当前组件对象构造时默认的碰撞参数。
  • Custom:自定义的碰撞预设类型。
    当主动修改启用碰撞(Collision Enabled)或通道名称(Channel Name)或碰撞响应(Collision Responses)属性时,组件碰撞预设会自动切换为Custom。
  • NoCollision:与所有的游戏对象(Game Object)都无碰撞。
  • BlockAll:通常用于阻挡所有游戏对象的静态对象。
    默认碰撞通道(Collision Channel) = 世界静态(WorldStatic), 对所有通道碰撞响应为阻挡(Block)。
  • BlockAllDynamic:通常用于与场景中所有游戏对象碰撞的动态对象。
    默认碰撞通道(Collision Channel)= 世界动态(WorldDynamic),对所有通道碰撞响应为阻挡(Block)。
  • OverlapAll:通常用于与场景中所有游戏对象产生重叠的静态对象。
    默认碰撞通道(Collision Channel) = 世界静态(WorldStatic), 对所有通道碰撞响应为重叠(Overlap)。
  • OverlapAllDynamic:通常用于与场景中所有游戏对象产生重叠的动态对象。
    默认碰撞通道(Collision Channel) = 世界动态(WorldDynamic),对所有通道碰撞响应为重叠(Overlap)。
  • Pawn:通常用于玩家或者AI操作的角色。
    默认碰撞通道(Collision Channel) = Pawn, 对所有通道碰撞响应为阻挡(Block)。
  • Destructible:通常用于可破坏物体。
    默认碰撞通道(Collision Channel) = 可破坏的(Destructible),对所有通道碰撞响应为阻挡(Block)。
  • VehicleWheel:通常用于载具车轮。
    默认碰撞通道(Collision Channel) = 载具(Vehicle),对所有通道碰撞响应为忽略(Ignore)。
  • Trigger:通常用于物理触发器。
    默认碰撞通道(Collision Channel) = 触发器(Trigger),忽略世界静态(WorldStatic),对其他通道碰撞响应为重叠(Overlap)。
    也就是说静态对象进入触发器范围,默认不触发事件。
启用碰撞(Collision Enabled)决定组件的碰撞体,是否参与到物理模拟或者场景碰撞检测中。
碰撞类型:
  • 无碰撞(No Collision):组件的碰撞体不参与任何碰撞检测。这种情况下组件不会创建物理。
  • 仅查询(Query Only):组件的碰撞体仅在场景碰撞查询中参与碰撞检测。
  • 仅物理仿真(Physics Only):组件的碰撞体仅在物理模拟中参与碰撞检测。
  • 查询与物理仿真(Query And Physics):组件的碰撞体在场景碰撞查询和物理模拟中都参与碰撞检测。
通道名称(Channel Name)决定组件自身的碰撞通道类型;在被碰撞物体的碰撞响应(Collision Responses)属性中索引碰撞结果的类型。
可通过碰撞预设编辑器编辑添加自己所需的通道类型。
引擎定义的通道类型如下:
  • WorldStatic:场景上位置不会发生改变的静态对象应使用该通道。
  • WorldDynamic:场景上位置可能发生改变的动态对象应使用该通道。如通过物理模拟或者代码控制改变位置(运动学)的物体。
  • Pawn:由玩家或者AI控制位移,代表角色的物体应使用该通道。受动画影响的布娃娃碰撞体也会默认使用该通道。
  • Vehicle:载具类型对象默认使用该通道。
  • Destructible:破碎类型对象默认使用该通道。
  • Visibility:可视性碰撞检测通道。
  • Camera:相机与其他对象的碰撞检测通道。
  • Trigger:触发器专用通道。
注:一共有32种通道类型,其中引擎使用的通道类型14种,可供用户自定义的通道类型18种。
碰撞响应(Collision Responses)碰撞响应本身代表的是一种碰撞结果。一般会与通道类型结合使用,决定某个物体对某种通道类型是否会产生碰撞。
可选碰撞响应值:
  • 阻挡(Block):物体与对应通道类型的物体会产生碰撞。
  • 重叠(Overlap):物体与对应通道类型的物体不会产生碰撞,但会生成穿透事件。
  • 忽略(Ignore):物体忽略与对应通道类型的物体的碰撞。

关于碰撞的判定方式

物理属性面板

上述演示的是一颗飞行中的子弹,在穿透玩家以及与摄像机碰撞后,打在玩家背后岩石上的碰撞判定过程:

  • Step 1. 摄像机/玩家/石头组件用自己的通道(Channel)属性,与子弹响应(Responses)属性中对应的通道类型比对,并获得碰撞响应类型。
  • Step 2. 子弹组件用自己的通道(Channel)属性,分别与摄像机/玩家/石头组件响应(Responses)属性中对应的通道类型比对,并获得碰撞响应类型。
  • Step 3. 两次的碰撞响应类型组合获得最终碰撞结果。
Step 1子弹Step 2子弹Step 3
石头阻挡(Block)+阻挡(Block)=阻挡(Block)
玩家重叠(Overlap)+阻挡(Block)=重叠(Overlap)
摄像机忽略(Ignore)+阻挡(Block)=忽略(Ignore)
总结
阻挡(Block) + Any = Any
忽略(Ignore) + Any = 忽略(Ignore)
重叠(Overlap) + 阻挡(Block)/重叠(Overlap) = 重叠(Overlap)

事件回调

物理属性面板

属性说明
通知接触事件(Notify Contact Event)物理模拟碰撞事件回调。
  • 默认(Default):是否响应碰撞回调由物理资源文件中设置为准。
  • 是(Yes):组件在模拟中与其他物体碰撞结果为阻挡(Block)时,会产生碰撞事件回调。
  • 否(No):不产生碰撞事件回调。
通知重叠事件(Notify Overlap Event)物理模拟穿透事件回调。
  • 默认(Default):是否响应穿透回调由物理资源文件中设置为准。
  • 是(Yes):组件在模拟中自身与其他物体双向查询结果都为重叠(Overlap)时,会产生穿透事件回调。
  • 否(No):不产生穿透事件回调。
通知睡眠事件(Notify Sleep Event)物理模拟睡眠事件回调。
  • 默认(Default):是否响应碰撞回调由物理资源文件中设置为准。
  • 是(Yes):组件在模拟中进入和退出Sleep状态时,会产生睡眠事件回调。
  • 否(No):不产生睡眠事件回调。

进阶

133253196985386258

属性说明
使用CCD(Use CCD)连续碰撞检测功能。仅对参与物理模拟的组件生效。 建议仅在需要解决速度过快,穿透其他物体的组件上开启。 注意:该属性会带来一定性能消耗。
是否总是创建物理状态(Always Create Physics State)始终创建组件物理标志。 是否总是创建物理状态(Always Create Physics State) = true时,即使启用碰撞(Collision Enable) = 无碰撞(No Collision),组件也会创建物理碰撞。
生成重叠事件(Generate Overlap Events)组件移动时是否生成重叠事件。 如果生成重叠事件(Generate Overlap Events) = true,且当前组件是游戏对象(Game Object)的根组件,那么在组件每次移动时会做扫描碰撞(Sweep Collision)检测,并且与其他同样开启生成重叠事件(Generate Overlap Events)属性的组件做碰撞判定,并产生一个重叠(Overlap)事件回调。
注意:当场景中有许多可移动角色都开启该功能时,则会带来较大的性能消耗。因此当需要判断角色周围是否有物体进入一定范围内时,可以考虑使用物理触发器。
角色是否可以上楼(Can Character Step Up On)
  • 否(No):角色不能站立在当前组件上。
  • 是(Yes):角色可以站立在当前组件上。
  • 所有者(Owner):角色是否能站立在当前组件上,由组件Actor的CanBeBaseForCharacter函数实现决定。