Пикап не подбирается, если боекомплект расходуется в точке респауна пикапа

Ветка с обсуждением вопроса

Проблема

  • Встаем на точку респауна пикапа с полным боекомплектом

  • Расходуем боекомплект (достаточно одного выстрела)

  • Пипкап не подбирается

Решение

  • Создаем в базовом пикапе массив указателей на APawn:

UPROPERTY()
TArray<APawn*> OverlappingPawns;
  • В NotifyActorBeginOverlap если не получилось взять пикап — добавляем указатель на пауна в массив:

void ASTUBasePickup::NotifyActorBeginOverlap(AActor* OtherActor)
{
    Super::NotifyActorBeginOverlap(OtherActor);

    const auto Pawn = Cast<APawn>(OtherActor);
    if (GivePickupTo(Pawn))
    {
        PickupWasTaken();
    }
    else if (Pawn)
    {
        OverlappingPawns.Add(Pawn);
    }
}
  • На тик (можно и кастомный таймер сделать) обходим массив, и смотрим: можем ли мы отдать кому-нибудь пикап из сохраненных паунов в массиве (то есть тем, которые в данный момент пересекают коллизию пикапа), и если можем, то отдаем.

void ASTUBasePickup::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);

    AddActorLocalRotation(FRotator(0.0f, RotationYaw, 0.0f));

    for (const auto OverlapPawn : OverlappingPawns)
    {
        if (GivePickupTo(OverlapPawn))
        {
            PickupWasTaken();
            break;
        }
    }
}
  • Переопределяем функцию NotifyActorEndOverlap (которая вызывается, как несложно догадаться, при выходе актора из коллизии) и в ней удаляем пауна из массива, то есть он покинул пикап:

void ASTUBasePickup::NotifyActorEndOverlap(AActor* OtherActor)
{
    Super::NotifyActorBeginOverlap(OtherActor);

    const auto Pawn = Cast<APawn>(OtherActor);
    OverlappingPawns.Remove(Pawn);
}

Коммит в репозитории

Last updated