在怪物攻击玩家时,我们需要保证怪物在一次攻击时,只会产生一次有效伤害,所以这里需要用SweepMultiByChannel函数进行碰撞检测,如何进行一次的伤害而不是多次伤害呢?我定义了一个
AActor* HitActor=0;
用来辅助判断是否已经进行了攻击,如果已经获取了对应的玩家碰撞,就不再二次玩家的伤害。
FVector AttLoc = GetMesh()->GetSocketLocation(TEXT("MM-R-Hand"));
TArray<FHitResult> Hits;
FCollisionShape Shape;
Shape.ShapeType = ECollisionShape::Sphere;
Shape.Sphere.Radius = 30;
FCollisionQueryParams QP;
QP.AddIgnoredActor(this);//添加忽略的Actor, 是一个TArray的链表,可以添加多个元素进去
AActor* HitActor=0;
if (GetWorld()->SweepMultiByChannel(Hits, AttLoc, AttLoc, FQuat(0, 0, 0, 0), ECC_Camera, Shape, QP))
{
for (FHitResult Hit : Hits)
{
if (Hit.GetActor())
{
if (Hit.GetActor() != HitActor)
{
UE_LOG(LogTemp, Log, TEXT("Hit Name is %s"), *Hit.GetActor()->GetName());
HitActor = Hit.GetActor();
}
}
}
}
SweepMultiByChannel(Hits, AttLoc, AttLoc, FQuat(0, 0, 0, 0), ECC_Camera, Shape, QP)
参数含义:
Hits表示碰撞到的元素,存放在TArray中
AttLoc:第一个表示开始位置
AttLoc:第二个表示结束位置
FQuat(0,0,0,0):表示转4元数
ECC_Camera:表示碰撞方式
QP:表示判断询问参数,使用AddIgnoredActor()函数,忽略不需要判断的Actor