六一的部落格


关关难过关关过,前路漫漫亦灿灿。




说明

  • 实现: 与不同材质的表面发生碰撞时, 产生不同的撞击特效
  • 三类物理材质: 地面和楼梯, 游戏角色身体部分, 游戏角色头部

    也是击中游戏角色不同部位造成不同伤害数值的另一种实现
  • 为网格体设置物理材质 Physical Material
  • 获取撞击物体的物理材质, 生成对应特效

物理材质

如果对物体使能物理仿真, 其会根据设置与其他物体互动

设置物体的物理特性, 对应一种表面类型

通过物理材质, 创建表面类型, 根据撞击物体的表面类型, 产生对应特效

目前只使用物理材质来定义表面类型, 而不用于物理仿真


创建多种特效

  • 未设定当前物理材质对应的特效时, 生成默认特效

    重命名NS_BaseImpact为NS_DefaultImpact, 设置颜色为黑色


  • 按下 Ctrl-D 复制NS_DefaultImpact, 命名为NS_GroundImpact、NS_HeadImpact和NS_BodyImpact

  • 设置NS_GroundImpact

    设置为绿色


  • 设置NS_HeadImpact

    设置为暗红色


    设置粒子数


  • 设置NS_BodyImpact

    设置为红色



创建物理材质

创建文件夹 Content/PhysMaterials


选择类, 命名为PhysMat_Ground


复制PhysMat_Ground, 命名为PhysMat_Head和PhysMat_Body


为物体设置物理材质

物理材质只能应用到网格体, 而地板和楼梯使用几何体笔刷构造, 并不是网格体. 我们可以将其转换为网格体

目前, 击中地板和楼梯时, 生成默认特效

添加几何网格体 Place Actors > Shapes > Cube , 设置物理材质为PhysMat_Ground



为游戏角色设置物理材质

打开 Content > ExternalContent > Animation > Characters > HeroTPP > HeroTPP_Physics

  • 为头部设置物理材质


  • 为身体其他部位挨个设置物理材质



获取物理材质信息生成对应类型特效


添加依赖模块PhysicsCore

ShootThemUp: ShootThemUp.Build.cs

1PublicDependencyModuleNames.AddRange(new string[]
2{
3    "Core",
4    "CoreUObject",
5    "Engine",
6    "InputCore",
7    "Niagara",
8    "PhysicsCore"
9});

发生碰撞时, 传递物理材质信息

FHitResult结构体的PhysMaterial字段存放物理材质信息, 其类型为TWeakObjectPtr, 是Weak指针在虚幻引擎的内部实现

同样, 使用前需检查有效性, 使用时通过Get

使能标志位, 在FHitResult结构体中保存物理材质信息


步枪

ShootThemUp: Weapon/STUBaseWeapon.cpp

1// MakeHit
2CollisionParams.bReturnPhysicalMaterial = true;

榴弹

ShootThemUp: Weapon/STUProjectile.cpp

1// ASTUProjectile
2CollisionComponent->bReturnMaterialOnMove = true;

撞击特效组件: 保存物理材质和特效类型的对应关系

将Effect属性重命名为DefaultEffect, 作为默认特效类型


使用TMap类型保存对应关系

关联容器类型Map在虚幻引擎的内部实现

ShootThemUp: Weapon/Components/STUWeaponFXComponent.h

protected

1class UPhysicalMaterial;
2
3UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
4TMap<UPhysicalMaterial*, UNiagaraSystem*> EffectsMap;

发生碰撞时, 查询特效类型并使用

ShootThemUp: Weapon/Components/STUWeaponFXComponent.cpp

 1#include "PhysicalMaterials/PhysicalMaterial.h"
 2
 3// PlayImpactFX
 4
 5auto Effect = DefaultEffect;
 6
 7if (Hit.PhysMaterial.IsValid())
 8{
 9    const auto PhysMat = Hit.PhysMaterial.Get();
10    if (EffectsMap.Contains(PhysMat))
11    {
12        Effect = EffectsMap[PhysMat];
13    }
14}

查看

设置步枪和榴弹的默认特效为NS_DefaultImpact


步枪

设置物理材质和特效的对应关系

-
PhysMat_Body NS_BodyImpact
PhysMat_Head NS_HeadImpact
PhysMat_Ground NS_GroundImpact


  • 拷贝设置小技巧

    右键EffectsMap, 选择Copy; 去到另一个EffectsMap, 右键粘贴



榴弹


新建Niagara粒子系统资产用于榴弹

  • 如果模板中有 Simple Explosion , 使用现有模板


  • 否则, 选择现有发射器


    依次添加 OmnidirectionalBurst UpwardMeshBurst SimpleSpriteBurst


  • 命名为NS_ProjectileImpact


查看单个发射器效果

点击图标



设置速度方向

Add Velocity from Point > Origin Offset , 对调X和Z的值

  • 如果使用现有发射器创建粒子系统

    • OmnidirectionalBurst

      Velocity Mode : From Point

      Velocity Speed : Random Range Float; Minimum = 350, Maximum = 550

      Offet > Origin Offset : X = -24, Z = 0


    • UpwardMeshBurst

      Velocity Mode : In Cone

      Velocity Speed : Random Range Float; Minimum = 100, Maximum = 400

      Cone > Axis : X = 1, Z = 0

      Cone > Angle : 66


    • SimpleSpriteBurst

      Velocity Mode : From Point

      Velocity Speed : Random Range Float; Minimum = 50, Maximum = 200

      Offet > Origin Offset : X = -85, Z = 0



设置榴弹默认特效为NS_ProjectileImpact


添加插件的方法

Edit > Plugin

勾选NiagaraFluids, 重启


物理材质



说明

  • 实现: 与不同材质的表面发生碰撞时, 产生不同的撞击特效
  • 三类物理材质: 地面和楼梯, 游戏角色身体部分, 游戏角色头部

    也是击中游戏角色不同部位造成不同伤害数值的另一种实现
  • 为网格体设置物理材质 Physical Material
  • 获取撞击物体的物理材质, 生成对应特效

物理材质

如果对物体使能物理仿真, 其会根据设置与其他物体互动

设置物体的物理特性, 对应一种表面类型

通过物理材质, 创建表面类型, 根据撞击物体的表面类型, 产生对应特效

目前只使用物理材质来定义表面类型, 而不用于物理仿真


创建多种特效

  • 未设定当前物理材质对应的特效时, 生成默认特效

    重命名NS_BaseImpact为NS_DefaultImpact, 设置颜色为黑色


  • 按下 Ctrl-D 复制NS_DefaultImpact, 命名为NS_GroundImpact、NS_HeadImpact和NS_BodyImpact

  • 设置NS_GroundImpact

    设置为绿色


  • 设置NS_HeadImpact

    设置为暗红色


    设置粒子数


  • 设置NS_BodyImpact

    设置为红色



创建物理材质

创建文件夹 Content/PhysMaterials


选择类, 命名为PhysMat_Ground


复制PhysMat_Ground, 命名为PhysMat_Head和PhysMat_Body


为物体设置物理材质

物理材质只能应用到网格体, 而地板和楼梯使用几何体笔刷构造, 并不是网格体. 我们可以将其转换为网格体

目前, 击中地板和楼梯时, 生成默认特效

添加几何网格体 Place Actors > Shapes > Cube , 设置物理材质为PhysMat_Ground



为游戏角色设置物理材质

打开 Content > ExternalContent > Animation > Characters > HeroTPP > HeroTPP_Physics

  • 为头部设置物理材质


  • 为身体其他部位挨个设置物理材质



获取物理材质信息生成对应类型特效


添加依赖模块PhysicsCore

ShootThemUp: ShootThemUp.Build.cs

1PublicDependencyModuleNames.AddRange(new string[]
2{
3    "Core",
4    "CoreUObject",
5    "Engine",
6    "InputCore",
7    "Niagara",
8    "PhysicsCore"
9});

发生碰撞时, 传递物理材质信息

FHitResult结构体的PhysMaterial字段存放物理材质信息, 其类型为TWeakObjectPtr, 是Weak指针在虚幻引擎的内部实现

同样, 使用前需检查有效性, 使用时通过Get

使能标志位, 在FHitResult结构体中保存物理材质信息


步枪

ShootThemUp: Weapon/STUBaseWeapon.cpp

1// MakeHit
2CollisionParams.bReturnPhysicalMaterial = true;

榴弹

ShootThemUp: Weapon/STUProjectile.cpp

1// ASTUProjectile
2CollisionComponent->bReturnMaterialOnMove = true;

撞击特效组件: 保存物理材质和特效类型的对应关系

将Effect属性重命名为DefaultEffect, 作为默认特效类型


使用TMap类型保存对应关系

关联容器类型Map在虚幻引擎的内部实现

ShootThemUp: Weapon/Components/STUWeaponFXComponent.h

protected

1class UPhysicalMaterial;
2
3UPROPERTY(EditDefaultsOnly, BlueprintReadWrite)
4TMap<UPhysicalMaterial*, UNiagaraSystem*> EffectsMap;

发生碰撞时, 查询特效类型并使用

ShootThemUp: Weapon/Components/STUWeaponFXComponent.cpp

 1#include "PhysicalMaterials/PhysicalMaterial.h"
 2
 3// PlayImpactFX
 4
 5auto Effect = DefaultEffect;
 6
 7if (Hit.PhysMaterial.IsValid())
 8{
 9    const auto PhysMat = Hit.PhysMaterial.Get();
10    if (EffectsMap.Contains(PhysMat))
11    {
12        Effect = EffectsMap[PhysMat];
13    }
14}

查看

设置步枪和榴弹的默认特效为NS_DefaultImpact


步枪

设置物理材质和特效的对应关系

-
PhysMat_Body NS_BodyImpact
PhysMat_Head NS_HeadImpact
PhysMat_Ground NS_GroundImpact


  • 拷贝设置小技巧

    右键EffectsMap, 选择Copy; 去到另一个EffectsMap, 右键粘贴



榴弹


新建Niagara粒子系统资产用于榴弹

  • 如果模板中有 Simple Explosion , 使用现有模板


  • 否则, 选择现有发射器


    依次添加 OmnidirectionalBurst UpwardMeshBurst SimpleSpriteBurst


  • 命名为NS_ProjectileImpact


查看单个发射器效果

点击图标



设置速度方向

Add Velocity from Point > Origin Offset , 对调X和Z的值

  • 如果使用现有发射器创建粒子系统

    • OmnidirectionalBurst

      Velocity Mode : From Point

      Velocity Speed : Random Range Float; Minimum = 350, Maximum = 550

      Offet > Origin Offset : X = -24, Z = 0


    • UpwardMeshBurst

      Velocity Mode : In Cone

      Velocity Speed : Random Range Float; Minimum = 100, Maximum = 400

      Cone > Axis : X = 1, Z = 0

      Cone > Angle : 66


    • SimpleSpriteBurst

      Velocity Mode : From Point

      Velocity Speed : Random Range Float; Minimum = 50, Maximum = 200

      Offet > Origin Offset : X = -85, Z = 0



设置榴弹默认特效为NS_ProjectileImpact


添加插件的方法

Edit > Plugin

勾选NiagaraFluids, 重启