1. 개요
C++로 Actor 클래스를 생성해보면 헤더와 소스파일이 기본적인 형태로 제공되는데 이때 코드를 살펴보면 아래 그림과 같이 BeginPlay는 protected에 위치해있고, Tick함수의 경우에는 public에 선언되어 있는 것이 보인다. 당연하게 넘어갈 수도 있는 부분이지만, 널리 사용되는 상용엔진에서 아무런 이유 없이 그런 차별점을 두었을 리가 없다고 생각되어 이에 대해 알아 보았다.
2. BeginPlay와 Tick 함수
BeginPlay()
- 객체가 처음 생성되고 플레이 시작 시에 한 번만 호출되는 함수
- AActor의 라이프사이클에 맞추어 자동으로 호출 ㅡ> 외부에서 직접 호출할 필요 X
위 두 가지 특징에 의해 BeginPlay는 protected에 선언하여, 상속 받은 클래스에서만 override하여 구현 가능하도록 함으로써 외부에서 호출할 수 없도록 제한이 가능 ㅡ> Encapsulation(캡슐화)
Tick(float DeltaTime)
- AActor가 활성화되어 있는 동안 지속적으로 매 프레임마다 호출
- AActor가 프레임 단위로 수행할 동작을 정의하는 함수 ㅡ> 다른 시스템이나 객체에서 접근할 필요가 있음
ex) Tick 을 게임 도중 비활성화하거나 설정을 변경하려면 SetActorTickEnabled(true/false)와 같이 외부 접근 필요
위 두 가지 특징에서 설명했듯이 Tick 함수는 외부에서 접근할 여지를 열어두어야 하는 함수이기 때문에 public으로 선언되어 게임 내 다른 시스템들이 Tick을 관리할 수 있도록 해야함
3. 정리
BeginPlay vs. Tick
함수명 | 접근 지정자 | 호출 시점 | 호출 주체 | 이유 |
BeginPlay() | protected | 액터가 생성되고 플레이 시작 시 한 번 |
엔진 내부 시스템 | AActor 라이프사이클 함수 ㅡ>외부에서 호출할 필요 X |
Tick(float) | public | 매 프레임마다 호출 | 엔진 및 외부 시스템 | 외부에서 접근할 필요 O |
결론은 외부에서 호출할 필요가 없는 BeginPlay의 경우에는 protected로 외부 접근을 제한하여 객체 지향 원칙인 캡슐화(Encapsulation)를 준수한 것이고, Tick의 경우에는 매 프레임마다 호출되어야 하는 함수로 다른 시스템이나 객체에서 접근하여 관리할 필요성이 있기 때문에 외부에서 접근 가능하도록 public으로 선언된 것이다.
별거 아닌 의문에서 시작해 알아보게된 내용이었지만 꽤 느끼는게 많은 내용이었다. 뭔가 이유가 있겠지 싶긴 했지만 객체 지향 원칙을 준수하기 위해서 언리얼 엔진의 라이프사이클 관리 방식에 따라 함수들의 접근 지정자를 달리하는 것을 보니 언리얼 엔진에서 객체 지향 언어를 잘 활용하기 위해서는 언리얼 엔진의 구조와 작동 방식에 대해 자세히 알아 봐야겠다 생각하게 되었다.
참고자료
https://forums.unrealengine.com/t/why-is-beginplay-protected-and-tick-public/432412
Why is BeginPlay protected and Tick public?
I want to know why Begin Play and Tick have different access modifiers.
forums.unrealengine.com
[UE5] 생성자, BeginPlay,Tick 알아보기
생성자, BeginPlay, Tick 아래와 같이 액터 클래스를 처음 생성하면 보통 이 3가지는 기본으로제공 해주는데 과연 이것이 무엇인지 오늘은 이 3가지의 대해서 알아보겠습니다. 생성자 말 그대로 생성
iiii4.tistory.com
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/actor-ticking-in-unreal-engine
'언리얼엔진(UE)' 카테고리의 다른 글
[UE] Lerp (선형 보간, Linear Interpolation) (0) | 2025.02.04 |
---|---|
[UE] Tick, DeltaTime (0) | 2025.02.03 |
[UE] CDO(Class Default Object) (0) | 2025.01.27 |
[UE] 언리얼 엔진 코딩 컨벤션(Coding Convention) (0) | 2025.01.23 |
[UE] 언리얼 엔진 C++ 개발 환경 셋업 (0) | 2025.01.22 |