KLingo Project Documentation 1.0.0
Unreal Engine 5.6 C++ Project Documentation
로딩중...
검색중...
일치하는것 없음
UDelayTaskManager 클래스 참조

지정된 시간 후에 함수(콜백)를 실행하는 지연 작업 관리 서브시스템입니다. 더 자세히 ...

#include <UDelayTaskManager.h>

+ UDelayTaskManager에 대한 상속 다이어그램 :
+ UDelayTaskManager에 대한 협력 다이어그램:

클래스

struct  FEntry
 

Public 멤버 함수

bool Cancel (const FDelayHandle &Handle)
 
void CancelAll (UObject *Owner)
 
 DEFINE_SUBSYSTEM_GETTER_INLINE (UDelayTaskManager)
 
virtual void Deinitialize () override
 
FDelayHandle Delay (UObject *Owner, float Seconds, TFunction< void()> Action)
 
FDelayHandle DelayCallBack (UObject *Owner, float Seconds, FDelayCallback Callback)
 
virtual void Initialize (FSubsystemCollectionBase &Collection) override
 
FDelayHandle NextTick (UObject *Owner, TFunction< void()> Action)
 

Private 멤버 함수

void ExecuteById (uint64 SeqIndex)
 
void RemoveEntryById (uint64 SeqIndex)
 

Private 속성

TMap< uint64, FEntryEntries
 
uint64 NextSeqIndex = 1
 
TMultiMap< TWeakObjectPtr< UObject >, uint64 > OwnerIndex
 

상세한 설명

지정된 시간 후에 함수(콜백)를 실행하는 지연 작업 관리 서브시스템입니다.

C++ 람다 및 블루프린트 델리게이트를 모두 지원하며, 생성된 작업을 핸들로 제어하거나 특정 오너와 관련된 모든 작업을 한 번에 취소할 수 있습니다.

UDelayTaskManager.h 파일의 39 번째 라인에서 정의되었습니다.

멤버 함수 문서화

◆ Cancel()

bool UDelayTaskManager::Cancel ( const FDelayHandle Handle)

UDelayTaskManager.cpp 파일의 101 번째 라인에서 정의되었습니다.

102{
103 if (!GetWorld() || !Handle.IsValid())
104 return false;
105
106 FEntry Entry;
107 if (Entries.RemoveAndCopyValue(Handle.SeqIndex, Entry))
108 {
109 // 엔진 타이머도 정리
110 GetWorld()->GetTimerManager().ClearTimer(Entry.TimerHandle);
111 OwnerIndex.RemoveSingle(Entry.Owner, Handle.SeqIndex);
112 return true;
113 }
114
115 return false;
116}
TMultiMap< TWeakObjectPtr< UObject >, uint64 > OwnerIndex
TMap< uint64, FEntry > Entries
bool IsValid() const

다음을 참조함 : Entries, FDelayHandle::IsValid(), UDelayTaskManager::FEntry::Owner, OwnerIndex, FDelayHandle::SeqIndex, UDelayTaskManager::FEntry::TimerHandle.

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ CancelAll()

void UDelayTaskManager::CancelAll ( UObject *  Owner)

UDelayTaskManager.cpp 파일의 118 번째 라인에서 정의되었습니다.

119{
120 if (!GetWorld() || !Owner)
121 return;
122
123 TArray<uint64> Ids;
124 OwnerIndex.MultiFind(Owner, Ids);
125 if (Ids.Num() == 0)
126 return;
127
128 FTimerManager& TM = GetWorld()->GetTimerManager();
129
130 for (uint64 Seq : Ids)
131 {
132 FEntry Entry;
133 if (Entries.RemoveAndCopyValue(Seq, Entry))
134 {
135 TM.ClearTimer(Entry.TimerHandle);
136 OwnerIndex.RemoveSingle(Entry.Owner, Seq);
137 }
138 }
139}

다음을 참조함 : Entries, UDelayTaskManager::FEntry::Owner, OwnerIndex, UDelayTaskManager::FEntry::TimerHandle.

◆ DEFINE_SUBSYSTEM_GETTER_INLINE()

UDelayTaskManager::DEFINE_SUBSYSTEM_GETTER_INLINE ( UDelayTaskManager  )

◆ Deinitialize()

void UDelayTaskManager::Deinitialize ( )
overridevirtual

UDelayTaskManager.cpp 파일의 16 번째 라인에서 정의되었습니다.

17{
18 if (auto World = GetWorld())
19 {
20 FTimerManager& TM = World->GetTimerManager();
21
22 for (const auto& KVP : Entries)
23 {
24 FTimerHandle TempHandle = KVP.Value.TimerHandle;
25 World->GetTimerManager().ClearTimer(TempHandle);
26 }
27 }
28 Entries.Empty();
29 OwnerIndex.Empty();
30
31 Super::Deinitialize();
32}

다음을 참조함 : Entries, OwnerIndex.

◆ Delay()

FDelayHandle UDelayTaskManager::Delay ( UObject *  Owner,
float  Seconds,
TFunction< void()>  Action 
)

UDelayTaskManager.cpp 파일의 42 번째 라인에서 정의되었습니다.

43{
44 FDelayHandle Out;
45 if (!GetWorld() || Seconds < 0.f || !Action)
46 return Out;
47
48 const uint64 SeqIndex = NextSeqIndex++;
49
50 FTimerHandle Handle;
51 FTimerDelegate D;
52 D.BindUObject(this, &UDelayTaskManager::ExecuteById, SeqIndex); // 핸들 대신 Seq 바인딩
53
54 GetWorld()->GetTimerManager().SetTimer(Handle, D, Seconds, /*bLoop=*/false);
55
56 FEntry& E = Entries.Add(SeqIndex);
57 E.Owner = Owner;
58 E.Action = MoveTemp(Action);
59 E.SeqIndex = SeqIndex;
60 E.TimerHandle = Handle;
61
62 if (Owner)
63 {
64 OwnerIndex.Add(Owner, SeqIndex);
65 }
66
67 Out.SeqIndex = SeqIndex;
68 return Out;
69}
void ExecuteById(uint64 SeqIndex)
UDelayTaskManager에 의해 생성된 지연 작업을 식별하고 제어하기 위한 핸들입니다.

다음을 참조함 : UDelayTaskManager::FEntry::Action, Entries, ExecuteById(), NextSeqIndex, UDelayTaskManager::FEntry::Owner, OwnerIndex, FDelayHandle::SeqIndex, UDelayTaskManager::FEntry::SeqIndex, UDelayTaskManager::FEntry::TimerHandle.

다음에 의해서 참조됨 : DelayCallBack().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ DelayCallBack()

FDelayHandle UDelayTaskManager::DelayCallBack ( UObject *  Owner,
float  Seconds,
FDelayCallback  Callback 
)

UDelayTaskManager.cpp 파일의 34 번째 라인에서 정의되었습니다.

35{
36 return Delay(Owner, Seconds, [Callback]() {
37 if (Callback.IsBound())
38 Callback.Execute();
39 });
40}
FDelayHandle Delay(UObject *Owner, float Seconds, TFunction< void()> Action)

다음을 참조함 : Delay().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ ExecuteById()

void UDelayTaskManager::ExecuteById ( uint64  SeqIndex)
private

UDelayTaskManager.cpp 파일의 141 번째 라인에서 정의되었습니다.

142{
143 FEntry Entry;
144 if (!Entries.RemoveAndCopyValue(SeqIndex, Entry))
145 {
146 return;
147 }
148
149 const bool bOwnerValid = Entry.Owner.IsValid();
150 if (bOwnerValid && Entry.Action )
151 {
152 Entry.Action();
153 }
154
155 OwnerIndex.RemoveSingle(Entry.Owner, SeqIndex);
156}

다음을 참조함 : UDelayTaskManager::FEntry::Action, Entries, UDelayTaskManager::FEntry::Owner, OwnerIndex.

다음에 의해서 참조됨 : Delay(), NextTick().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ Initialize()

void UDelayTaskManager::Initialize ( FSubsystemCollectionBase &  Collection)
overridevirtual

UDelayTaskManager.cpp 파일의 11 번째 라인에서 정의되었습니다.

12{
13 Super::Initialize(Collection);
14}

◆ NextTick()

FDelayHandle UDelayTaskManager::NextTick ( UObject *  Owner,
TFunction< void()>  Action 
)

UDelayTaskManager.cpp 파일의 71 번째 라인에서 정의되었습니다.

72{
73 FDelayHandle Out;
74 if (!GetWorld() || !Action)
75 return Out;
76
77 const uint64 SeqIndex = NextSeqIndex++;
78
79 // 다음 틱 보장 & 취소 가능성을 위해 0초 타이머 사용(엔진은 다음 프레임에 실행)
80 FTimerHandle Handle;
81 FTimerDelegate D;
82 D.BindUObject(this, &UDelayTaskManager::ExecuteById, SeqIndex);
83
84 GetWorld()->GetTimerManager().SetTimer(Handle, D, /*Rate=*/0.0f, /*bLoop=*/false);
85
86 FEntry& E = Entries.Add(SeqIndex);
87 E.Owner = Owner;
88 E.Action = MoveTemp(Action);
89 E.SeqIndex = SeqIndex;
90 E.TimerHandle = Handle;
91
92 if (Owner)
93 {
94 OwnerIndex.Add(Owner, SeqIndex);
95 }
96
97 Out.SeqIndex = SeqIndex;
98 return Out;
99}

다음을 참조함 : UDelayTaskManager::FEntry::Action, Entries, ExecuteById(), NextSeqIndex, UDelayTaskManager::FEntry::Owner, OwnerIndex, FDelayHandle::SeqIndex, UDelayTaskManager::FEntry::SeqIndex, UDelayTaskManager::FEntry::TimerHandle.

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ RemoveEntryById()

void UDelayTaskManager::RemoveEntryById ( uint64  SeqIndex)
private

UDelayTaskManager.cpp 파일의 158 번째 라인에서 정의되었습니다.

159{
160 if (FEntry* Found = Entries.Find(SeqIndex))
161 {
162 OwnerIndex.RemoveSingle(Found->Owner, SeqIndex);
163 Entries.Remove(SeqIndex);
164 }
165}

다음을 참조함 : Entries, OwnerIndex.

멤버 데이터 문서화

◆ Entries

TMap<uint64, FEntry> UDelayTaskManager::Entries
private

UDelayTaskManager.h 파일의 81 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : Cancel(), CancelAll(), Deinitialize(), Delay(), ExecuteById(), NextTick(), RemoveEntryById().

◆ NextSeqIndex

uint64 UDelayTaskManager::NextSeqIndex = 1
private

UDelayTaskManager.h 파일의 87 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : Delay(), NextTick().

◆ OwnerIndex

TMultiMap<TWeakObjectPtr<UObject>, uint64> UDelayTaskManager::OwnerIndex
private

UDelayTaskManager.h 파일의 84 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : Cancel(), CancelAll(), Deinitialize(), Delay(), ExecuteById(), NextTick(), RemoveEntryById().


이 클래스에 대한 문서화 페이지는 다음의 파일들로부터 생성되었습니다.: