Пикап не подбирается, если боекомплект расходуется в точке респауна пикапа
Проблема
Встаем на точку респауна пикапа с полным боекомплектом
Расходуем боекомплект (достаточно одного выстрела)
Пипкап не подбирается
Решение
Создаем в базовом пикапе массив указателей на
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
Was this helpful?