首先看一下,Hit打击句柄里面存放的内容
我们找到了一个关键的成员,这是记录被打击对象的
在武器蓝图中,添加伤害类型变量
//先声明一下类型
class UDamageType;
//伤害类型
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Weapon")
TSubclassOf<UDamageType> DamageType;
#include "Kismet/GameplayStatics.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);
//设置碰撞通道为可见性通道
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);
}
//方便debug
DrawDebugLine(GetWorld(), EyeLocation, TraceEnd, FColor::Red, false, 1, 0, 1);
}
}
编译,然后回到我们的虚幻编辑器
新建一个actor蓝图
添加一个骨骼网格组件
选择人形网格体
然后打开碰撞
将其拖入场景中
再编写该靶子的蓝图伤害事件
编译,测试成功
现在更改一下蓝图