Skill 클래스를 구현하던 중 C++로 작성한 Base Class BeginPlay가 Blueprint로 작성된 Child Class BeginPlay보다 늦게 호출되는 상황이 발생했다. 때문에 Child Class의 BeginPlay에서 User에 접근하면 값이 Null이어서 에러가 발생했다.
Skill Class의 BeginPlay는 부모 함수 호출과 User 초기화 밖에 없기에 의심할 코드는 오직 부모 함수 호출이다. 그래서 Actor Class의 BeginPlay 코드를 뜯어보았다.
확인해본 결과 Actor의 BeginPlay는 크게 6가지를 수행한다.
- 잘 못된 호출인가를 검사하는 ensure문
- LifeSpan 설정
- Tick 함수 예약
- 컴포넌트의 BeginPlay 수행
- ReceiveBeginPlay 함수 호출
- 이 Actor는 BeginPlay가 호출되었음을 알리는 Enum(EActorBeginPlayState) 설정
나머지는 다 알겠는데, ReceiveBeginPlay는 무슨 일을 함수일까 싶어 다시 한번 뜯어보니 충격적인 사실을 맞이했다.
사실 Blueprint의 BeginPlay는 C++의 BeginPlay와 다른 ReceiveBeginPlay라는 함수였다.
Blueprint에서 부모 함수로의 호출 추가를 하지 않아도 C++의 BeginPlay가 잘 호출되는 것도, Blueprint의 BeginPlay가 먼저 호출되는 것도 전부 이 것이 이유였던 것이다.
결국 Skill의 BeginPlay에서 Super::BeginPlay를 User 초기화보다 뒤에 두는 것만으로 간단하게 해결하였다. 부모 함수 호출을 항상 맨 앞에 두는 나의 습관에서 벌어진 실수였다. 앞으로 Blueprint의 Event는 꼼꼼히 확인하고 사용해야겠다.
'Memorize: RECALL' 카테고리의 다른 글
Catmull-Rom Spline을 이용한 도약 공격 제작 (0) | 2020.09.22 |
---|---|
UObject에서 Replication 지원하기 (0) | 2020.09.21 |
Weapon 초기화를 위한 새로운 설계 (0) | 2020.06.12 |
Runtime에 생성된 Anim Instance의 BeginPlay (0) | 2020.06.12 |
Buff Storage 클래스를 설계한 이유 (0) | 2020.05.26 |