UE可以通过设置物理材质,使物体对于不同材质产生不同交互效果。比如:射击地面和射击人物产生不同效果,不同材质地面行走脚步声不同。
项目设置/物理:
创建物理材质,设置表面类型:
把物理材质设置给物理资产
然后进入代码:
武器的射击函数(使用的是射线检测):
//添加头文件
#include "PhysicalMaterials/PhysicalMaterial.h"
FCollisionQueryParams QueryParams;
QueryParams.bReturnPhysicalMaterial = true;
FHitResult Hit;
if (GetWorld()->LineTraceSingleByChannel(Hit, EyeLocation, TraceEnd, ECC_Visibility, QueryParams))
{
EPhysicalSurface SurfaceType = UPhysicalMaterial::DetermineSurfaceType(Hit.PhysMaterial.Get());
UParticleSystem* SelectedEffect = nullptr;
switch (SurfaceType)
{
case SURFACE_FLESHDEFAULT: //SurfaceType1使用了#defind重定义
case SURFACE_FLESHVULNERABLE: //SurfaceType2
SelectedEffect = FleshImpactEffect;
break;
default:
SelectedEffect = DefaultImpactEffect;
}
if (SelectedEffect)
{
UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), SelectedEffect, Hit.ImpactPoint, Hit.ImpactNormal.Rotation());
}
}
遇到的问题(ue4.27 vs2019):
.build.cs中应加入PHYSICSCORE
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "PHYSICSCORE" });
在项目同名头文件xxx.h中加入#define后,想在武器类中使用,无法#include
//xxx.h 项目同名头文件
#define SURFACE_FLESHDEFAULT SurfaceType1
#define SURFACE_FLESHVULNERABLE SurfaceType2
目前解决方法:打开解决方案属性/VC++目录/常规/包含目录/编辑/创建新行
把xxx.h所在文件夹绝对路径加进去。