저는 개인 프로젝트를 진행하다가 TestAnimInstance라는 C++ AnimInstacne를 상속을 받는 ABP_Anim이라는 블루프린트 클래스를 C++코드로 관리를 하고 싶어졌습니다.
그래서 처음에는 쌩포인터로 Character라는 C++클래스안에서 TestAnimInstacne* MyAnim이런식으로 관리를 했었는데 크래쉬가 나는 현상을 자주 겪게 되다가 관리하는 방법 중에 TObjectPtr로 관리하거나 TSubclassOf로 관리하는 방법이 있었는데 언제 어디서 둘을 구분해야하는 지 햇갈렸던 부분을 정말 짧게 정리를 해보았습니다.
나중에 TSubclassOf<> TObjecPtr<> 의 코드를 보고 코드를 분석하여 글을 쓰면 좋겠네여..
먼저 UObject란?
언리얼에는 게임 오브젝트 처리용 시스템이 존재합니다. 언리얼에서 오브젝트의 베이스 클래스는 UObject 입니다.
UObject에서 파생되는 클래스에 UCLASS 매크로를 사용하여 태그를 해 주면 UObject처리 시스템에서 인식하게 됩니다.
UCLASS 매크로는 UObject에게 자신의 언리얼에서 기반으로 삼은 유형에 대해 설명해주는 UClass로의 레퍼런스를 넘겨줍니다. 각 UClass는 Class Default Object 죽 CDO 라 불리는 오브잭트를 하나 유지합니다. CDO는 본직적으로 "템플릿" 오브젝트로, 클래스 생성자에 의해 생성된 이후 변경되지 않습니다.
즉 UCLASS 매크로는 C++클래스를 언리얼의 객체 시스템에 등록하기 위해 필요한 매크로이며 UCLASS매크로를 사용하면 언리얼 객체 시스템으로 등록되며 UObject또는 UClass 인스턴스로 사용될 수 있습니다.
https://docs.unrealengine.com/5.1/ko/objects-in-unreal-engine/
위의 공식문서를 참고하시면 오브젝트에 대해 더 자세히 아실 수 있습니다.
UE4에서 UE5로 넘어오면서 Raw 포인터 대신에 TObjectPtr를 사용하는 것을 권장하고있습니다.
예를들엉 USkeletalMesh* SK_Mesh 대신에 UObjectPtr<USkeletalMesh> SK_Mesh 이런식으로요.
이또한 아래의 C++ 오브젝트 포인터 프로퍼티 부분을 보시면 자세히 보실 수 있습니다.
https://docs.unrealengine.com/5.0/ko/unreal-engine-5-migration-guide/
TObjectPtr을 정말 간단하게 말하면 UObject의 포인터를 관리하기 위한 템플릿 클래스 입니다.
TObjectPtr은 가르키는 UObject가 유요한지 검사하고, 객체를 자동으로 해제하고 참조 계수를 증가시키거나 감소시키는 등의 작업을 수행합니다.
그러면 TestAnimInstace를 상속을 받는 ABP_Anim도 TObjectPtr로 관리하면 안되나?? 이렇게 생각을 했었는데
ABP_Anim이 UObject의 하위 클래스인 UTestAnimInstacne의 모든 멤버변수와 함수를 상속하기에 UObjectPtr로 관리하하면 ABP_Anim의 메모리 주소만 가르키는 포인터만 있고 UTestAnimInstacne의 멤버 변수와 함수에 접근 할 수 없게될 수 있습니다.
따라서 TSubclassOf<UTestAnimInstacne>로 ABP_Anim을 관리하면 UTestAnimInstance를 상속받는 것을 보장하면서도 ABP_Anim의 메모리 주소를 가리키는 포인터를 가지고 있기 때문에 ABP_Anim 멤버변수와 함수에 접근할 수 있습니다.
https://docs.unrealengine.com/5.1/ko/typed-object-pointer-properties-in-unreal-engine/
참고한 블로그 글입니다.
TSubclassOf의 선언/정의 부분을 분석하셨는데 이부분이 좋았습니다.
http://egloos.zum.com/sweeper/v/3225016
언리얼 분석글들을 볼때마다 느끼는 거지만 분석할 때 템플릿 부분이 매우 중요한거같습니다....ㅠㅠ
(공부 더 하자...)
'UE5' 카테고리의 다른 글
[UE] ArcheType (0) | 2023.12.31 |
---|---|
[UE] GetOuter() (0) | 2023.12.24 |
[UE] StaticClass (0) | 2023.11.29 |
[UE] Unreal5 Live Coding쓰면 지양??해야 하는 이유 (+빌드) (0) | 2023.05.02 |
[UE] Unreal Engine 빌드과정과 BP에서 C++ 로의 변환 (2) | 2023.04.14 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!