- 문제점

생성자에서 Owner를 멤버 필드로 캐싱해 두는 경우 주소가 달라지는 현상

- Character는 ItemComponent를 멤버 필드로 가지고 있으며, 생성자에서 CreateDefaultSubobject를 통해 생성.

- BaseComponent에서 Component의 Owner인 Character를 멤버 필드로 캐싱

 

* BeginPlay에서 Character의 Address와 ItemComponent의 RefernceCharacter Address가 다른 현상 발생

 

 

 

 

 

 

 

- 결론

BP로 상속된 클래스의 경우 멤버 필드로 레퍼런싱을 하고자 할 때, BeginPlay에서 작업하자.

혹은, C++ 클래스를 기반으로 생성된 BP는 BP내부에서 레퍼런싱 해서 사용하자.

혹은, BP 상속 없이 순수 C++ 클래스로 사용하자.

PackageLoad, Default BP 생성 등 불필요한 작업이 없어 순수 의도대로 코드를 구현할 수 있다.

 

  • 관련 로그 정리
더보기
// Editor 실행 후 최초 Play 로그
BaseComponent Name : ItemComponent ,OwnerName : Default__BP_Character_C, Owner Address : 4414eb00
BaseComponent Address : 44201d80 ,OwnerName : Default__BP_Character_C, Reference_Character Address : 4414eb00
Character(31)CONSTRUCT OwnerName : Default__BP_Character_C, Address : 4414eb00
Character(32)CONSTRUCT ItemComponent  : ItemComponent, Address : 44201d80 // ReferenceCharacter : 4414eb00

BaseComponent Name : ItemComponent ,OwnerName : Default__SKEL_BP_Character_C, Owner Address : 7f259d00
BaseComponent Address : 44151a80 ,OwnerName : Default__SKEL_BP_Character_C, Reference_Character Address : 7f259d00
Character(31)CONSTRUCT OwnerName : Default__SKEL_BP_Character_C, Address : 7f259d00
Character(32)CONSTRUCT ItemComponent  : ItemComponent, Address : 44151a80 // ReferenceCharacter : 7f259d00

BaseComponent Name : ItemComponent ,OwnerName : Default__BP_Character_C, Owner Address : 321c3900
BaseComponent Address : 1752a080 ,OwnerName : Default__BP_Character_C, Reference_Character Address : 321c3900
Character(31)CONSTRUCT OwnerName : Default__BP_Character_C, Address : 321c3900
Character(32)CONSTRUCT ItemComponent  : ItemComponent, Address : 1752a080 // ReferenceCharacter : 321c3900
// 최초 실행 시 위의 세번의 Constructor 호출이 발생
1. 최초 실행 시 EditorGameInstance를 생성하면서 Package Load
2. Blueprint Compile 시 Skeleton Class Generate 시 호출(?)
3. PlayActor Spawn 시 호출

Default__SKEL_BP_Character_C는 무엇인가?
BP에서 Skeleton Class를 Generate 할 때 생성되는 Bp인데...?


// 이후 Play 로그
LogLoad: Game class is 'BP_GameMode_C'
BaseComponent Name : ItemComponent ,OwnerName : BP_Character_C_0, Owner Address : 32253900
BaseComponent Address : 54f8400 ,OwnerName : BP_Character_C_0, Reference_Character Address : 32253900
Character(31)CONSTRUCT OwnerName : BP_Character_C_0, Address : 32253900
Character(32)CONSTRUCT ItemComponent  : ItemComponent, Address : 54f8400 // ReferenceCharacter : 32253900

//BeginPlay에서 달라지는 Reference_Character 주소값 확인
//최초 실행 시 생성된 Default__BP_Character_C의 주소를 참조하도록 변경
BaseComponent::BeginPlay(23)BEGINPLAY BaseComponent Address : 54f8400 ,OwnerName : Default__BP_Character_C, Reference_Character Address : 321c3900

//현재 Component Owner의 정상적인 주소
Character::BeginPlay(46)BEGINPLAY OwnerName : BP_Character_C_0, Address : 32253900
Character::BeginPlay(47)BEGINPLAY ItemComponent    : ItemComponent, Address : 54f8400 // ReferenceCharacter : 321c3900

WRITTEN BY
KeithHong
개인 기록 공간입니다. 잘못된 정보에 대한 수정 및 조언은 항상 감사합니다 ( _ _ )

,