物理材质
2023年10月13日 2024年1月11日
说明
- 实现: 与不同材质的表面发生碰撞时, 产生不同的撞击特效
- 三类物理材质: 地面和楼梯, 游戏角色身体部分, 游戏角色头部
也是击中游戏角色不同部位造成不同伤害数值的另一种实现 - 为网格体设置物理材质
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, 重启