[UE5] Unreal - 궁금증 정리, 네비게이션 문제

김영웅·2025년 2월 21일

강참조, 약참조에 대해서 공부할 때 생긴 의문인데 맴버 변수를 선언할 때 아래와 같이 UPROPERTY()를 쓰는 이상 TObjectPtr을 쓰든 그냥 Raw 포인터로 하든 GC가 해당 UObject를 가져가기 전까지 이 맴버 변수는 사라지지 않을텐데 무슨 의미가 있나 라는 생각이 들었다.

UPROPERTY(EditAnywhere, BlueprintReadWrite)
TObjectPtr<UFloatingPawnMovement> PawnMovement;

UPROPERTY(EditAnywhere, BlueprintReadWrite)
UFloatingPawnMovement* PawnMovement;

그래서 질문 강사님에게 질문했더니 이 TObjectPtr은 언리얼 5와서 생긴 것이며 Release 모드로 빌드 할 때 컴파일러가 해당 struct 관련을 지우고 Raw 포인터로 컴파일 한다고 한다.
그래서 어차피 똑같아서 상관없긴 한데 언리얼에서 권장하는 건 TObjectPtr이라고 한다.
인자 같은 걸로 전달할 땐 그냥 Raw 포인터 쓰고, 멤버 변수 같은 거 할 때 TObjectPtr을 쓰도록 하자.


약참조(소프트 레퍼런스)는 예를 들어 상황에 따른 Mesh 변경을 하고 싶을 때, 강참조로 되있는 포인터를 쓰면 해당 클래스를 로드할 때 모든 Mesh를 로드하게 된다.
이렇게 되면 등록되어 있는 모든 Mesh를 로드하기 때문에 당연히 게임이 정지하고 로드될 것이다.
이런 상황을 피하고 싶으면 TSoftObjectPtr, TWeakObjectPtr, FSoftObjectPath 같은 약참조 타입을 사용해 로드하면 LoadSynchronous를 호출하기 전까지 Mesh를 로드하지 않기 때문에 훨씬 더 빠르게 결과가 나올 것이다.


AIPerception은 Pawn과 AIController 둘 다 컴포넌트를 추가해 사용할 수 있는데, 원래 원칙적으로는 AIController에 다는게 맞다고 한다.
근데 뭐 스폰되는 Pawn마다 인지하는게 다르다던가 그러면 Pawn에 달아서 쓰기도 하는 것 같다.


네비게이션에서 CollisionProfile을 Pawn으로 했는데 APawn을 상속받은 적은 움직이지 않는 문제가 있었다.
차이는 네비게이션에 영향 주기 가능(CanAffectNavigationGeneration) 이었다.

이게 켜져있으면 Collision의 트랜스폼 모빌리티가 무버블이어도 네비게이션 시스템에서 장애물 처리로 되어 움직이지 않았던 것 같다.

profile
게임 프로그래머

0개의 댓글