- 문제점
생성자에서 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
'프로그래밍 > 언리얼엔진' 카테고리의 다른 글
[UE4] AI - 1 (0) | 2020.11.23 |
---|---|
[UE4] 안드로이드 셋업 (0) | 2020.11.05 |
[UE4] 나만의 UAsset을 만들어보자 - 5(마지막) (0) | 2020.09.11 |
[UE4] 나만의 UAsset을 만들어보자 - 4 (0) | 2020.09.11 |
[UE4] 나만의 UAsset을 만들어보자 - 3 (0) | 2020.09.11 |
WRITTEN BY
- KeithHong
개인 기록 공간입니다. 잘못된 정보에 대한 수정 및 조언은 항상 감사합니다 ( _ _ )
,