AActorComponent의 RegisterComponentWithWorld()에서 이어지는 Activate()에 관한 질문입니다
97
작성한 질문수 2
안녕하세요!
Activate() 이후 PrimaryComponentTick.SetTickFunctionEnable()이 호출되는데,
이후 GameWorld인지 Owner가 있는지 여부 등을 따져가며 RegisterAllComponentTickFunctions()를 호출할 때도 결국 SetupActorComponentTickFunction()을 통해 인자로 전달된 PrimaryComponentTick의 SetTickFunctionEnable()이 호출됩니다.
왜 이렇게 같은 과정이 굳이 두 번이나 이루어지는지 궁금합니다
물론 두 번째 단계에서는 등록 여부를 확인하여 걸러지지만 실행 조건을 살펴보아도 GameWorld가 아니라는 조건 때문에 두 번 실행될 가능성이 있는 것 같아 질문드립니다.
읽어주셔서 감사드립니다.
답변 2
0
Tick 등록 함수를 중복해서 호출해도 괜찮은 이유는 크게 두 가지입니다.
첫째, SetTickFunctionEnable 함수 내부에서 IsTickFunctionRegistered를 통해 이미 Tick이 등록되어 있는지 확인하기 때문에, 여러 번 호출하더라도 동시에 여러 Tick이 등록되는 것을 방지합니다. 따라서 부담 없이 호출하셔도 됩니다.
둘째, 더 중요한 이유인데 최초 등록을 기준으로 한다면 SetTickFunctionEnable의 첫 번째 호출은 TickState를 단순히 Enable로 변경할 뿐, 실제로 Tick을 등록하지는 않습니다. Tick 등록은 RegisterAllComponentTickFunctions 단계에서 이루어집니다.
추가로, Actor의 경우 BeginPlay 함수에서도 다음과 같이 Tick 등록이 진행됩니다:
PrimaryActorTick.SetTickFunctionEnable(PrimaryActorTick.bStartWithTickEnabled || PrimaryActorTick.IsTickFunctionEnabled());이 단계에서는 TickState를 Enable로 변경합니다.
PrimaryActorTick.RegisterTickFunction(GetLevel());이 단계에서 비로소 Tick을 등록합니다.
겉보기에는 Tick 등록 함수가 두 번 호출되는 것처럼 보일 수 있지만, 실제로는 TickState 변경과 Tick 등록이라는 서로 다른 역할을 하는 동일한 과정의 일부분이라는 것을 알 수 있습니다.
0
안녕하세요, 인프런 AI 인턴입니다. 최현수님 질문에 답변드리겠습니다.
AActorComponent의 RegisterComponentWithWorld()에서 두 번의 SetTickFunctionEnable() 호출에 대한 궁금증은 Unreal Engine의 내부 구조와 최적화 그리고 에러 방지를 위한 메커니즘에서 기인합니다.
첫 번째 SetTickFunctionEnable() 호출은 컴포넌트의 기본 틱 기능을 활성화하거나 비활성화하기 위한 설정입니다. 이는 Actor가 언제든지 틱을 시작할 준비가 되었음을 보장하기 위한 초기 단계로 볼 수 있습니다.
두 번째 호출, 즉 RegisterAllComponentTickFunctions() 내부에서의 SetupActorComponentTickFunction()은 컴포넌트가 실제 게임 월드에 등록된 후, 그리고 해당 컴포넌트가 틱을 수행할 수 있는 조건을 만족할 때 사용됩니다. 이 때는 Owner나 GameWorld의 상태 등에 따라 추가적인 조건이 있어야 할 수 있기 때문입니다. 즉, 다양한 상황에서 컴포넌트가 올바르게 작동하도록 컨트롤하는 부분입니다.
두 번의 단계가 언뜻 비효율적으로 보일 수 있지만, 각 단계는 서로 다른 시기에 서로 다른 체크를 수행함으로써 컴포넌트가 안정적으로 동작하도록 보장합니다. 이는 특히 동적 환경에서 안전하게 동작하도록 돕는 장치입니다.
관련하여 더 깊이 있는 설명이나 예제를 원하신다면, Unreal Engine의 컴포넌트 틱 관련 코드나 공식 문서를 참조하시길 권장드립니다. 아래 링크는 이에 대한 Rookiss님의 다른 답변을 확인할 수 있는 곳입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
안녕하세[요. 김용일입니다.
0
25
1
안녕하세요. 김용일입니다.
0
65
1
저는 저 노란색 미리보기 창이 안뜹니다
0
12
1
5.6버전 Networking Insights 실행안됨 문제에 관하여
0
22
1
맵핑부분..
0
25
2
Rider대신 VS를 써도 괜찮나요?
0
104
2
Claude Code Pro구독하고 있는 상태에서 크레딧 결제, 사용문의
0
161
2
Polyreduce 퍼센트 값이 적용되지 않음 + 다른 이슈
0
19
1
ABP "스테이트의 시퀀스 플레이어에 따른 자동 규칙"질문드립니다.
0
33
1
사용하시는 툴 질문 드립니다.
0
31
2
토큰 사용량 및 인증 관련해서 질문드립니다.
0
121
2
OAuth 방식 문의
0
99
2
C#을 사용하는 장점이 무엇인지 궁금합니다.
0
95
1
PLAY 버튼 동작 미리보기 관련 질문드립니다!
0
31
2
강의중에 사용하는 ppt 수업 자료
0
32
1
노션 자료는 어디서구하나요.
0
52
1
CreateInnerProcessPIEGameInstance 함수에서
0
68
1
AActor를 APhysicsVolume으로 Cast가 되는 이유
0
76
1
UE5.3.2 빌드시 에러
0
472
1
다음 엔진강의 계획된게 있을까요
0
189
2
Q&A 질문이 무엇인지 모르겠어요
0
160
1
과거 영상이다보니 내부 코드가 다른 경우 어떻게 공부하나요
0
283
2
TaskGraph를 C++에서 사용하려고 하면?
0
364
1
빌드 시 에러 문의
0
554
1





