KLingo Project Documentation 1.0.0
Unreal Engine 5.6 C++ Project Documentation
로딩중...
검색중...
일치하는것 없음
UObjectPoolManager.cpp
이 파일의 문서화 페이지로 가기
1// Copyright (c) 2025 Doppleddiggong. All rights reserved. Unauthorized copying, modification, or distribution of this file, via any medium is strictly prohibited. Proprietary and confidential.
2
8#include "Engine/World.h"
9#include "GameFramework/CharacterMovementComponent.h"
10#include "GameFramework/ProjectileMovementComponent.h"
11
12
13void UObjectPoolManager::Initialize(FSubsystemCollectionBase& Collection)
14{
15 Super::Initialize(Collection);
16
17 UE_LOG(LogTemp, Log, TEXT("ObjectPoolManager Initialized."));
18}
19
21{
22 for (auto& Elem : PoolMap)
23 {
24 for (AActor* Actor : Elem.Value)
25 {
26 if (IsValid(Actor))
27 {
28 Actor->Destroy();
29 }
30 }
31 }
32 PoolMap.Empty();
33
34 Super::Deinitialize();
35}
36
37AActor* UObjectPoolManager::GetPoolItem(const UObject* WorldContextObject, const TSubclassOf<AActor> InClass )
38{
39 return GetPoolItemLocationRotator(WorldContextObject, InClass, FVector::ZeroVector, FRotator::ZeroRotator );
40}
41
42AActor* UObjectPoolManager::GetPoolItemLocationRotator(const UObject* WorldContextObject, const TSubclassOf<AActor> InClass, const FVector Location, const FRotator Rotator )
43{
44 if (!InClass)
45 {
46 UE_LOG(LogTemp, Error, TEXT("GetPoolItem failed: InClass is null."));
47 return nullptr;
48 }
49
50 TArray<AActor*>* Pool = PoolMap.Find(InClass);
51 if (Pool && Pool->Num() > 0)
52 {
53 AActor* Actor = Pool->Pop();
54 Actor->SetActorLocationAndRotation(Location, Rotator);
55
56 Actor->SetActorHiddenInGame(false);
57 Actor->SetActorEnableCollision(true);
58 Actor->SetActorTickEnabled(true);
59
60 return Actor;
61 }
62
63 if (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull))
64 return World->SpawnActor<AActor>(InClass, Location, Rotator);
65
66 return nullptr;
67}
68
70{
71 if ( Actor == nullptr )
72 return;
73
74 Actor->SetActorHiddenInGame(true);
75 Actor->SetActorEnableCollision(false);
76 Actor->SetActorTickEnabled(false);
77
78 // 타이머/수명 정리
79 if (UWorld* World = Actor->GetWorld())
80 {
81 World->GetTimerManager().ClearAllTimersForObject(Actor);
82 }
83 Actor->SetLifeSpan(0.f);
84
85 if (UProjectileMovementComponent* Proj = Actor->FindComponentByClass<UProjectileMovementComponent>())
86 {
87 Proj->StopMovementImmediately();
88 Proj->Deactivate();
89 }
90 if (UCharacterMovementComponent* CharMove = Actor->FindComponentByClass<UCharacterMovementComponent>())
91 {
92 CharMove->StopMovementImmediately();
93 CharMove->Velocity = FVector::ZeroVector;
94 }
95 if (UPrimitiveComponent* Prim = Cast<UPrimitiveComponent>(Actor->GetRootComponent()))
96 {
97 Prim->SetPhysicsLinearVelocity(FVector::ZeroVector, true);
98 Prim->SetPhysicsAngularVelocityInDegrees(FVector::ZeroVector, true);
99 Prim->PutRigidBodyToSleep();
100 }
101
102 TSubclassOf<AActor> ActorClass = Actor->GetClass();
103 TArray<AActor*>& Pool = PoolMap.FindOrAdd(ActorClass);
104 Pool.Add(Actor);
105}
UObjectPoolManager 클래스를 선언합니다.
AActor * GetPoolItemLocationRotator(const UObject *WorldContextObject, const TSubclassOf< AActor > InClass, const FVector Location, const FRotator Rotator)
void ReturnActorToPool(AActor *Actor)
TMap< UClass *, TArray< AActor * > > PoolMap
virtual void Deinitialize() override
AActor * GetPoolItem(const UObject *WorldContextObject, TSubclassOf< AActor > InClass)
virtual void Initialize(FSubsystemCollectionBase &Collection) override