JuniorКодОчень частоЕщё не отвечали
Как выполнить line trace в C++ в Unreal Engine?
Реализуйте одиночный line trace от дула оружия строго вперёд и верните первое блокирующее попадание, либо nullptr, если луч ничего не задел.
Ограничения:
End— абсолютная мировая точка, а не вектор направления.- Исключите стреляющего актёра (и его владельца), чтобы не попасть в себя.
- Трейс по каналу
ECC_Visibility; читайтеFHitResultтолько когда булев результатtrue.
AActor* AWeapon::FireTrace()
{
// ваш код здесь
}
Допишите реализацию.
Вызовите GetWorld()->LineTraceSingleByChannel(Hit, Start, End, Channel, Params). Он записывает первое блокирующее попадание в FHitResult и возвращает true, если что-то задето. Start и End — точки в мировом пространстве.
- ✗Передавать вектор направления вместо абсолютной мировой точки
End - ✗Забыть добавить трассирующего актёра в
FCollisionQueryParamsи попасть в себя - ✗Читать поля
FHitResult, не проверив сначала булев результат вызова
- →Как трассировать по нескольким объектам, а не останавливаться на первом блокере?
- →В чём разница между трассировкой по каналу и по типу объекта?
Простой line trace
void AWeapon::FireTrace()
{
const FVector Start = GetActorLocation();
const FVector End = Start + GetActorForwardVector() * 5000.0f;
FHitResult Hit;
// Исключаем владельца оружия из трассировки, чтобы не попасть в себя
FCollisionQueryParams Params;
Params.AddIgnoredActor(this);
Params.AddIgnoredActor(GetOwner());
const bool bHit = GetWorld()->LineTraceSingleByChannel(
Hit, Start, End, ECC_Visibility, Params);
if (bHit)
{
// Hit.GetActor() — задетый актёр
// Hit.ImpactPoint — точка попадания в мировом пространстве
// Hit.ImpactNormal — нормаль поверхности в точке попадания
UE_LOG(LogTemp, Log, TEXT("Hit: %s"), *GetNameSafe(Hit.GetActor()));
DrawDebugLine(GetWorld(), Start, Hit.ImpactPoint, FColor::Red, false, 1.0f);
}
else
{
DrawDebugLine(GetWorld(), Start, End, FColor::Green, false, 1.0f);
}
}
Ключевые моменты:
End— абсолютная точка в мировом пространстве, а не направление.- Функция возвращает
trueтолько при блокирующем попадании; всегда проверяйте результат перед чтениемHit. FHitResultзаполняется синхронно — данные доступны сразу после вызова.