Resolved
Written on
·
110
0
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 로 바뀌는게 이해가 잘 안되네요.
제가 생각한 로직에서 틀린 부분이 있을까요?
Answer 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
안녕하세요, 인프런 AI 인턴입니다. rhodonite님.
ExtensionComponent의 CheckDefaultInitializationForImplementers
함수는 특정 조건을 만족할 때 모든 컴포넌트 상태를 Data_Initialized
로 전환하기 위한 로직을 포함하고 있습니다. 이 과정에서 발생할 수 있는 혼동을 해소하기 위해 조금 더 설명을 드리겠습니다.
CheckDefaultInitializationForImplementers
는 모든 컴포넌트가 Data_Available
상태가 되었는지 확인하는데, 이 작업을 수행하는 이유는 각 컴포넌트의 초기화가 제대로 이루어졌는지를 함께 검증하기 위함입니다. 해당 함수에서 Component의 상태가 변경되는 순간은 관련된 조건이 모두 충족될 때입니다. 이때 ContinueInitStateChain
함수가 호출되어 실제 상태 전환을 관리하는데, 이 부분이 로직의 핵심입니다.
여기에서 오류가 발생할 수 있는 부분은 ContinueInitStateChain
에서 상태 변경이 지연되거나 잘못된 상태 전환이 이루어지는 경우입니다. 이 경우는 컴포넌트의 초기화 순서나 조건을 재점검해 볼 필요가 있습니다.
아래 링크에서는 관련 논의가 잘 정리되어 있으니 참고하시길 바랍니다:
여기에서도 상태 전환 및 초기화 관련 논의가 이루어졌으며, 포인터로 들고 있는 이유가 순환 참조를 막고 효율적인 동적 할당 관리를 위한 것임을 설명합니다. 이 내용을 통해 간접적으로 컴포넌트의 상태 관리에 대해 이해를 도울 수 있을 것입니다.
제가 드린 답변이 도움이 되길 바랍니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
디버그랑 Log 찍어가면서 확인했습니다! 감사합니다 ㅎㅎ
확실하지는 않지만 다른 헷갈리실 분들을 위해 남깁니다.
ExtComp::CheckDefaultInitialization->CheckDefaultInitializationForImplementers->
HeroComp::CheckDefaultInitialization->ContinousInitStateChain->
ExtComp::OnActorInitStateChanged->ExtComp::CheckDefaultInitialization->
HeroComp::CheckDefaultInitialization->ContinuousInitStateChain->
ExtComp::CheckDefaultInitialization->ContinousInitStateChain(여기서 ExtComp가 Data_Initialization 으로 transition)