记录一下免得忘太快了
FVector StartPoint = FirstPersonCameraComponent->GetComponentLocation();
FVector EndPoint = StartPoint + FirstPersonCameraComponent->GetForwardVector()*200000.f;
//给碰撞方法添加条件的结构体
FCollisionQueryParams* TraceParam = new FCollisionQueryParams();
//可以保存一次撞击过程中的信息
FHitResult *MyHitResualt = new FHitResult();
//LineTraceSingleByChannel检测第一个碰撞到的物体
if (World->LineTraceSingleByChannel(*MyHitResualt, StartPoint, EndPoint, ECC_Visibility, *TraceParam))
{
//画一条可见的线段来查看效果
DrawDebugLine(GetWorld(), StartPoint, EndPoint, FColor::Green, false, 4.f);
//从保存的碰撞信息中获取命中的物体
AEnemy *Target = Cast<AEnemy>(MyHitResualt->GetActor());
//判断不为空,且不是待销毁状态。之后还可以在这里限定命中的类型
if (Target != nullptr&&!Target->IsPendingKill())
{
//调用目标自己的伤害方法
Target->GetDemage(DemageValue);
}
}
目标类中仅仅是简单的设定了生命值,调用GetDemage时扣除生命值并判断是否为低于或等于0,决定是否调用销毁方法。
关于LineTraceSingleByChannel和LineTraceSingleByObjectType可以参考这里