본문 바로가기

Memorize: RECALL

Blueprint의 BeginPlay는 BeginPlay가 아니다.

Skill 클래스를 구현하던 중 C++로 작성한 Base Class BeginPlay가 Blueprint로 작성된 Child Class BeginPlay보다 늦게 호출되는 상황이 발생했다. 때문에 Child Class의 BeginPlay에서 User에 접근하면 값이 Null이어서 에러가 발생했다.

유저의 초기화가 더 늦게 된다.

Skill Class의 BeginPlay는 부모 함수 호출과 User 초기화 밖에 없기에 의심할 코드는 오직 부모 함수 호출이다. 그래서 Actor Class의 BeginPlay 코드를 뜯어보았다.

 

확인해본 결과 Actor의 BeginPlay는 크게 6가지를 수행한다.

  1. 잘 못된 호출인가를 검사하는 ensure문
  2. LifeSpan 설정
  3. Tick 함수 예약
  4. 컴포넌트의 BeginPlay 수행
  5. ReceiveBeginPlay 함수 호출
  6. 이 Actor는 BeginPlay가 호출되었음을 알리는 Enum(EActorBeginPlayState) 설정

나머지는 다 알겠는데, ReceiveBeginPlay는 무슨 일을 함수일까 싶어 다시 한번 뜯어보니 충격적인 사실을 맞이했다.

Blueprint의 BeginPlay의 정체

 

사실 Blueprint의 BeginPlay는 C++의 BeginPlay와 다른 ReceiveBeginPlay라는 함수였다.

Blueprint에서 부모 함수로의 호출 추가를 하지 않아도 C++의 BeginPlay가 잘 호출되는 것도, Blueprint의 BeginPlay가 먼저 호출되는 것도 전부 이 것이 이유였던 것이다.

 

결국 Skill의 BeginPlay에서 Super::BeginPlay를 User 초기화보다 뒤에 두는 것만으로 간단하게 해결하였다. 부모 함수 호출을 항상 맨 앞에 두는 나의 습관에서 벌어진 실수였다. 앞으로 Blueprint의 Event는 꼼꼼히 확인하고 사용해야겠다.

버그를 해결한 코드