1. 개요
C++ 클래스를 상속받은 블루프린트 객체의 이벤트 그래프에서 BeginPlay가 호출되지 않는 문제가 발생했다. 혹시나 싶어서 Tick에도 중단점을 걸어보니 Tick조차 호출되지 않고 있었다. 처음엔 Auto Possess AI의 설정 값이 Placed로 설정되지 않아서 그런건가 싶었지만 설정에는 문제가 없었다.
2. 원인
// .h
UCLASS()
class ABYSSDIVERUNDERWORLD_API AMonster : public AUnitBase
{
GENERATED_BODY()
public:
AMonster();
protected:
virtual void BeginPlay() override;
}
// .cpp
AMonster::AMonster()
{
}
void AMonster::BeginPlay()
{
}
언뜻 보면 문제가 없어 보이지만, UnitBase 클래스를 상속받은 Monster 클래스의 BeginPlay에서 Super::BeginPlay를 호출하지 않고 있다. 설마 이게 문제겠어 하는 마음에 Super::BeginPlay를 넣고 컴파일을 해본 결과 블루프린트 객체의 BeginPlay와 Tick이 정상 작동했다.
하지만 여기서 추가적으로 드는 의문점이 있었다. 분명 UnitBase의 생성자에서 "PrimaryActorTick.bCanEverTick = false"를 작성했는데 어떻게 블루프린트 객체의 이벤트 그래프에서 Tick이 작동하는걸까 ..
3. C++ vs 블루프린트
자식과 부모의 Tick 설정은 각각 해줘야 하는 건가하는 마음에 Monster 클래스에서 Tick 함수를 구현해봤지만 로그는 출력되지 않았다. 결론은 블루프린트와 C++의 Tick 이벤트는 따로 논다였다. C++에서 Super::BeginPlay를 넣었는데 블루프린트의 Tick 이벤트가 작동하는 이유를 찾아보니 블루프린트 설정에 Start with Tick Enabled 라는 속성이 있었다.

해당 옵션을 활성화해주면 블루프린트 이벤트 그래프에서 BeginPlay가 호출되면 Tick 이벤트가 호출된다. C++에서 Tick 이벤트를 활성화하려면 PrimaryActorTick.bCanEverTick = true 를 작성해야한다.
4. 느낀 점
엔진에 대한 이해도가 중요하다는 의미가 무엇인지 몸소 체감하는 시간이었다. BeginPlay는 C++과 블루프린트가 연동되는 느낌으로 동작하지만, Tick은 개별이었다는 것. 이래서 **버그를 해결하는 경험도 중요하다** ! 라고 하는 건가 보다..
'언리얼 엔진 > 트러블슈팅' 카테고리의 다른 글
| [언리얼엔진] 범위 공격 - RadialDamage (1) | 2025.05.15 |
|---|---|
| [언리얼엔진] 경로 활용 변수 할당 (0) | 2025.05.13 |
| [언리얼엔진] Git Issue, PR Template 사용법 (0) | 2025.05.07 |
| [언리얼엔진] 마우스 커서 변경 (0) | 2025.04.27 |
| [언리얼엔진] Git LFS 사용법 (0) | 2025.04.26 |