打开编辑器设置,点击物理
拉到这个位置
设置两个表面材质
创建新的文件夹
创建物理材质
进入材质,赋予表面
打开该头文件
定义两个变量
#define SURFACE_FLESHDEFAULT SurfaceType1
#define SURFACE_FLESHVULNERABLE SurfaceType2
打开武器类,将打击特效的名字改成默认特效,当没有打到人身上,就用这个特效。
//击中物体(如地板或墙的特效)
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Weapon")
class UParticleSystem * DefaultImpactEffect;
//击中身体特效
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Weapon")
class UParticleSystem * FleshImpactEffect;
导入头文件
#include "PhysicalMaterials/PhysicalMaterial.h"
#include "CoopGame.h"
完善fire函数
void ASWeapen::Fire()
{
//创建一个撞击句柄,用来获取弹道相关信息
FHitResult Hit;
//弹道的起点,我们设置为角色眼睛的位置
AActor * MyOwner = GetOwner();
if (MyOwner)
{ //位置
FVector EyeLocation;
//方向
FRotator EyeRotator;
//得到眼睛的位置和角度
MyOwner->GetActorEyesViewPoint(EyeLocation, EyeRotator);
//弹道的终点就是起点+方向*10000
FVector TraceEnd = EyeLocation + (EyeRotator.Vector() * 1000);
//弹道特效的结束点
FVector TraceEndPoint = TraceEnd;
//设置碰撞通道为可见性通道
FCollisionQueryParams QueryParams;
//让射线忽略玩家和枪
QueryParams.AddIgnoredActor(MyOwner);
QueryParams.AddIgnoredActor(this);
//符合追踪设为true,可以让射击更加精准
QueryParams.bTraceComplex = true;
//返回命中目标的表面材质
QueryParams.bReturnPhysicalMaterial = true;
//在创建一个单轨迹线来计算弹道
//LineTraceSingleByChannel击中物体返回true
if (GetWorld()->LineTraceSingleByChannel(Hit, EyeLocation, TraceEnd, ECC_Visibility, QueryParams))
{
//命中对象
AActor * HitActor = Hit.GetActor();
//调用伤害函数
//参数分别为伤害对象、基础伤害、设计方向、命中信息(命中句柄)、MyOwner->GetInstigatorController(暂时不了解)
//this(伤害者) 和伤害类型
UGameplayStatics::ApplyPointDamage(HitActor, 20, EyeRotator.Vector(), Hit, MyOwner->GetInstigatorController(), this, DamageType);
//得到命中物体表面材质
EPhysicalSurface SurfaceType = UPhysicalMaterial::DetermineSurfaceType(Hit.PhysMaterial.Get());
//根据材质的不同,进行不同的处理
UParticleSystem * SelectedEffect = nullptr;
switch (SurfaceType)
{
//这两种情况是一个效果
case SURFACE_FLESHDEFAULT:
case SURFACE_FLESHVULNERABLE:
SelectedEffect = FleshImpactEffect;
break;
default:
SelectedEffect = DefaultImpactEffect;
break;
}
//生成特效在命中点
//ImpactEffect:特效 ImpactPoint:打击点 Rotation():打击方向
if (SelectedEffect)
{
UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), SelectedEffect, Hit.ImpactPoint, Hit.ImpactNormal.Rotation());
}
//命中的时候,修改弹道特效的终点
TraceEndPoint = Hit.ImpactPoint;
}
//方便debug
DrawDebugLine(GetWorld(), EyeLocation, TraceEnd, FColor::Red, false, 1, 0, 1);
//射击特效
PlayFireEffects(TraceEndPoint);
}
}
编译之后,在蓝图里选择特效
打开人物的材质
右键任意地方,选择人物所有形体
然后按住ctrl点头部,这样头部就不被选中了
这里选择材质
然后给头部也选择一个材质
文章来源:https://www.toymoban.com/news/detail-735030.html
编译测试,打人和打地板特效不一样。文章来源地址https://www.toymoban.com/news/detail-735030.html
到了这里,关于11uec++多人游戏【自定义表面-物理材质】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!