将我们下载好的工程的特效文件夹放在我们自己的工程下
在武器类中添加三个成员变量
//枪口插槽
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Weapon")
FName MuzzleSocketName;
//枪口特效(粒子系统变量)
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Weapon")
class UParticleSystem * MuzzleEffect;
//击中特效
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Weapon")
class UParticleSystem * ImpactEffect;
//弹道特效
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Weapon")
class UParticleSystem * TracerEffect;
//弹道特效目标
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Weapon")
FName TrancerTargetName;
#include "Particles/ParticleSystemComponent.h"
在构造函数中对MuzzleSocketName进行初始化
MuzzleSocketName = "MuzzleSocket";
TrancerTargetName = "Target";
在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;
//在创建一个单轨迹线来计算弹道
//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);
//生成特效在命中点
//ImpactEffect:特效 ImpactPoint:打击点 Rotation():打击方向
if (ImpactEffect)
{
UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), ImpactEffect, Hit.ImpactPoint, Hit.ImpactNormal.Rotation());
}
//命中的时候,修改弹道特效的终点
TraceEndPoint = Hit.ImpactPoint;
}
//方便debug
DrawDebugLine(GetWorld(), EyeLocation, TraceEnd, FColor::Red, false, 1, 0, 1);
//开枪成功,生成枪口特效
if (MuzzleEffect)
{
//粒子特效,组件,组件的socket
UGameplayStatics::SpawnEmitterAttached(MuzzleEffect, MeshComponent, MuzzleSocketName);
}
//然后生成弹道特效
if (TracerEffect)
{
//计算枪口位置
FVector MuzzleLocation = MeshComponent->GetSocketLocation("MuzzleSocket");
//声明一个变量,拿到这个特效实例
UParticleSystemComponent *TracerComp = UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), TracerEffect, MuzzleLocation);
if (TracerComp)
{
TracerComp->SetVectorParameter(TrancerTargetName, TraceEndPoint);
}
}
}
}
编译,然后到武器蓝图里面选择特效
这里提醒一点,枪口的槽位是自带的
==========================
现在添加一个准星
新建一个UI文件夹,并创建一个UI控制蓝图
把image拉进去
在玩家蓝图里面,继续编辑蓝图
测试