ExtensionComponent의 CheckDefaultInitialization에 대해서
22분 쯤 모든 Component들의 상태가 Data_Available이 됐을 때
ExtensionComponenot::CheckDefaultInitialization의 CheckDefaultInitializationForImplementers에 의해 다른 Component들이 Data_Initialized State로 전환된다고 하셨는데,
CheckDefaultInitializationForImpleters는 Data_Available 이 될 수 있음에도 되지 못한 Component가 있는지 확인해서 Update 해주고
ContinueInitStateChain 에서 비로소 호출한 Component의 State를 가장 먼저 Change 해주니 ExtensionComponent의 State가 Data_Initailizaed 상태로 바뀌고 나머지 Component들은 ExtensionComponent의 상태를 보고 Data_Initialized 상태로 바뀌는거 같습니다.
CheckDefaultInitializationForImplementers 에서 모든 Component들의 상태가 Data_Initialized 로 바뀌는게 이해가 잘 안되네요.
제가 생각한 로직에서 틀린 부분이 있을까요?
답변 2
1
CheckDefaultInitializationForImplementers는 초기화 상태에 등록된 모든 Component의 CheckDefaultInitialization 메서드를 호출하여, Tick 검사를 하지 않고 PawnExtension을 제외한 다른 Component의 상태가 변경될 때 PawnExtension의 OnActorInitStateChanged가 호출되도록 동작합니다.
변경된 Component의 상태가 InitState_DataAvailable인 경우, CheckDefaultInitialization가 다시 호출되어 PawnExtension 자신과 모든 Component의 상태를 연쇄적으로 업데이트합니다.
마지막으로, PawnExtension을 제외한 다른 Component들은 자신들의 InitState_DataInitialized 단계로 업데이트하기 위해 PawnExtension이 먼저 InitState_DataInitialized로 업데이트되기를 기대하며, PawnExtension이 해당 단계로 업데이트되면 비로소 자신들도 InitState_DataInitialized 단계로 전환됩니다.
이를 통해 각 Component가 서로의 상태를 주고받으며 업데이트를 지속적으로 전파하는 구조를 형성합니다.
구조가 많이 어려운 편이라서 명확하게 순서를 보고 싶으시면 각 상태 업데이트 부분에 Log를 설정해놓으시면 좀 더 이해가 되실꺼에요
0
디버그랑 Log 찍어가면서 확인했습니다! 감사합니다 ㅎㅎ
확실하지는 않지만 다른 헷갈리실 분들을 위해 남깁니다.
ExtComp::CheckDefaultInitialization->CheckDefaultInitializationForImplementers->
HeroComp::CheckDefaultInitialization->ContinousInitStateChain->
ExtComp::OnActorInitStateChanged->ExtComp::CheckDefaultInitialization->
HeroComp::CheckDefaultInitialization->ContinuousInitStateChain->
ExtComp::CheckDefaultInitialization->ContinousInitStateChain(여기서 ExtComp가 Data_Initialization 으로 transition)
0
안녕하세요, 인프런 AI 인턴입니다. rhodonite님.
ExtensionComponent의 CheckDefaultInitializationForImplementers 함수는 특정 조건을 만족할 때 모든 컴포넌트 상태를 Data_Initialized로 전환하기 위한 로직을 포함하고 있습니다. 이 과정에서 발생할 수 있는 혼동을 해소하기 위해 조금 더 설명을 드리겠습니다.
CheckDefaultInitializationForImplementers는 모든 컴포넌트가 Data_Available 상태가 되었는지 확인하는데, 이 작업을 수행하는 이유는 각 컴포넌트의 초기화가 제대로 이루어졌는지를 함께 검증하기 위함입니다. 해당 함수에서 Component의 상태가 변경되는 순간은 관련된 조건이 모두 충족될 때입니다. 이때 ContinueInitStateChain 함수가 호출되어 실제 상태 전환을 관리하는데, 이 부분이 로직의 핵심입니다.
여기에서 오류가 발생할 수 있는 부분은 ContinueInitStateChain에서 상태 변경이 지연되거나 잘못된 상태 전환이 이루어지는 경우입니다. 이 경우는 컴포넌트의 초기화 순서나 조건을 재점검해 볼 필요가 있습니다.
아래 링크에서는 관련 논의가 잘 정리되어 있으니 참고하시길 바랍니다:
여기에서도 상태 전환 및 초기화 관련 논의가 이루어졌으며, 포인터로 들고 있는 이유가 순환 참조를 막고 효율적인 동적 할당 관리를 위한 것임을 설명합니다. 이 내용을 통해 간접적으로 컴포넌트의 상태 관리에 대해 이해를 도울 수 있을 것입니다.
제가 드린 답변이 도움이 되길 바랍니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
AddGameFrameworkComponentReceiver vs AddExtensionHandler
0
22
0
B_TeleportToUserFacingExperience가 추가로 생성되지 않습니다.
0
57
2
.
0
59
1
SpawnDefaultPawnAtTransform_Implementation이 호출되지 않습니다.
0
58
2
Input Subsystem 에서 오류가 발생합니다
0
65
1
7강 GameMode와 Modules관련 질문드립니다.
0
55
1
LyraFrontEnd 에서 로딩화면에서 넘어가지 않는 원인이 뭔지 질문드립니다.
0
82
2
리소스 이주했는데 안보이는데 어떻게 해야하나요?
0
86
3
TakeFromAbilitySystem 함수에서 Array 에 대한 remove 는 수행하지 않나요?
0
57
1
CircumferenceMarkerWidget의 bReticleCornerOutsideSpreadRadius 초기화 관련
0
61
1
Pawn 교체, Possess 후 위젯이 이전 값(상태)을 잘못 보여줄 때 처리법이 궁금합니다.
0
74
2
Pawnextension#3 9:19 질문이 있습니다.
0
61
2
Experience 재시작
0
79
2
Log 파트에서 Subtitution Macro Call 를 사용하는 방법이 무엇인가요?
0
81
2
설치후 빌드하는데 에러가 발생하고 인텔리센스도 잘 활성화되지 않습니다.
0
204
1
FPerContextData에 대해 질문이 있어요
0
49
2
OnGameFeatureActivating와 WorldContext관해 질문 있습니다.
0
68
1
GameFeature Action 및 Common UI Widget 생성 관련 질문
0
80
1
가비지컬렉션 관련 질문있습니다.
0
94
3
Travel관련해서 질문 있습니다.
0
60
1
IMC가 먹통이에요
0
86
2
PawnExtension #3 에서 말한 라이라 공식문서가 뭔가요?
0
65
1
PawnExtensionComponent::SetPawnData에서의 CheckDefaultInitialization
0
58
1
미니맵 제작
0
89
2





