Take a look at the ShooterGame example, specifically Source/ShooterGame/Effects/ShooterImpactEffect.cpp. There you will see the game code has mapped some #defines in ShooterTypes.h to various values in the EPhysicalSurface enum. You can give these enums names (like ice) in Projects Settings under Engine > Physics > Physical Surfaces. Once you do that, you can create Physic Material Assets which you can assign these surface types to.
Engine/EngineTypes.h:
/** Types of surfaces in the game. */
UENUM(BlueprintType)
enum EPhysicalSurface
{
SurfaceType_Default UMETA(DisplayName="Default"),
SurfaceType1 UMETA(Hidden),
SurfaceType2 UMETA(Hidden),
SurfaceType3 UMETA(Hidden),
...
ShooterTypes.h
#define SHOOTER_SURFACE_Default SurfaceType_Default
#define SHOOTER_SURFACE_Concrete SurfaceType1
#define SHOOTER_SURFACE_Dirt SurfaceType2
#define SHOOTER_SURFACE_Water SurfaceType3
#define SHOOTER_SURFACE_Metal SurfaceType4
#define SHOOTER_SURFACE_Wood SurfaceType5
#define SHOOTER_SURFACE_Grass SurfaceType6
#define SHOOTER_SURFACE_Glass SurfaceType7
#define SHOOTER_SURFACE_Flesh SurfaceType8
Looking up the surface type in ShooterImpactEffect.cpp:
void AShooterImpactEffect::PostInitializeComponents()
{
Super::PostInitializeComponents();
UPhysicalMaterial* HitPhysMat = SurfaceHit.PhysMaterial.Get();
EPhysicalSurface HitSurfaceType = UPhysicalMaterial::DetermineSurfaceType(HitPhysMat);
// show particles
UParticleSystem* ImpactFX = GetImpactFX(HitSurfaceType);
if (ImpactFX)
{
UGameplayStatics::SpawnEmitterAtLocation(this, ImpactFX, GetActorLocation(), GetActorRotation());
}
...

