5#include "CoreMinimal.h"
6#include "GameFramework/Actor.h"
7#include "ObjectPool.generated.h"
9#define DEBUG_OBJECT_POOL 0
22 static AObjectPool* Get(UObject*
const WorldContextObject);
23 virtual void EndPlay(
const EEndPlayReason::Type EndPlayReason)
override;
28 FTransform
const& Transform,
29 AActor* Owner =
nullptr,
30 AActor* Instigator =
nullptr
33 UWorld*
const World = GetWorld();
34 if (!World || World->bIsTearingDown)
39 if (!ObjectPool.Contains(
Class))
41 ObjectPool.Add(
Class);
44 TArray<AActor*>& AvailablePool = ObjectPool[
Class];
45 for (
int i = AvailablePool.Num()-1; i >= 0; i--)
47 AActor*
const SpawnedActor = AvailablePool[i];
48 AvailablePool.RemoveAt(i);
50 if (!SpawnedActor || SpawnedActor->IsPendingKillPending())
55 SpawnedActor->SetOwner(Owner);
56 SpawnedActor->SetInstigator(Instigator);
57 SpawnedActor->SetActorTransform(Transform);
60 UE_LOG(LogTemp,
Log, TEXT(
"[Object Pool] Reuse Actor '%s' from pool. Available of type: %d"), *SpawnedActor->GetName(), AvailablePool.Num());
63 return Cast<T>(SpawnedActor);
66 UE_LOG(LogTemp,
Log, TEXT(
"[Object Pool] Spawned Actor '%s'. No pool actors available. Will cache to pool."), *
Class->GetName());
68 return World->SpawnActorDeferred<T>(
Class, Transform, Owner, Instigator, ESpawnActorCollisionHandlingMethod::AlwaysSpawn);
71 void FinishSpawning(AActor*
const Actor, FTransform
const& Transform);
72 void ReleaseActorToPool(AActor*
const Actor);
Definition: ObjectPool.h:13
TMap< TSubclassOf< AActor >, TArray< AActor * > > ObjectPool
Definition: ObjectPool.h:20
T * SpawnActorDeferred(UClass *Class, FTransform const &Transform, AActor *Owner=nullptr, AActor *Instigator=nullptr)
Definition: ObjectPool.h:26
static TMap< TWeakObjectPtr< UWorld >, AObjectPool * > Singleton
Definition: ObjectPool.h:19