Как в Unreal Engine 5 на C++ определить тип объекта?

Как можно определить тип объекта, на который игрок направляет свой взгляд в Unreal Engine, и в дальнейшем выполнить различные операции в зависимости от этого типа (например, открыть дверь, нажать кнопку или добавить предмет в инвентарь), используя луч и метод LineTraceSingleByChannel?
  • 13 мая 2024 г. 14:20
Ответы на вопрос 2
Для определения типа объекта, на который игрок направляет свой взгляд в Unreal Engine 5 на C++, можно использовать метод LineTraceSingleByChannel. Этот метод позволяет выпустить луч из определенной точки в определенном направлении и проверить объекты, которые пересекает этот луч.

Пример кода для определения типа объекта, на который игрок направляет свой взгляд и выполнения операций в зависимости от типа объекта:

```cpp
FHitResult HitResult;
FVector StartLocation = PlayerCharacter->GetActorLocation();
FVector EndLocation = StartLocation + PlayerCharacter->GetActorForwardVector() * 1000; // длина луча

FCollisionQueryParams CollisionParams;
CollisionParams.AddIgnoredActor(PlayerCharacter); // игнорировать игрока при проведении луча

if (GetWorld()->LineTraceSingleByChannel(HitResult, StartLocation, EndLocation, ECollisionChannel::ECC_Visibility, CollisionParams))
{
    AActor* HitActor = HitResult.GetActor();
    
    if (HitActor)
    {
        if (HitActor->ActorHasTag("Door"))
        {
            // открыть дверь
        }
        else if (HitActor->ActorHasTag("Button"))
        {
            // нажать кнопку
        }
        else if (HitActor->ActorHasTag("Item"))
        {
            // добавить предмет в инвентарь
        }
    }
}
```

В этом примере мы выпускаем луч из исходной точки игрока и проверяем объекты, которые он пересекает. Затем мы проверяем теги объекта с помощью метода ActorHasTag и выполняем соответствующие операции в зависимости от типа объекта.
Ну FHitResult - это структура и у неё можно поинтересоваться, на какого актера она указывает. 
Типа:
if (HitResult.Actor != NULL)
{
   // здесь уже конкретно узнаём, что это за актер, например с помощью каста
  MyActor* MyAc = Cast<MyActor>(HitResult.Actor);
  if (MyAc != NULL)
  {
     //делаем что-то с нашим актером
  }
}
Похожие вопросы