공부 목적으로 만든 블로그 입니다 ! 틀린 내용이 있다면 이야기해주시면 감사하겠습니다 !
주요 역할:
현재 이 컴포넌트의 충돌 영역과 겹치는 모든 액터들을 검색하여, 전달된 배열(함수 인자)에 추가합니다
함수 시그니처 :
void GetOverlappingActors(TArray<aactor*>& OutOverlappingActors, TSubclassOf<AActor> ClassFilter = nullptr) const;
함수 설명 :
UPrimitiveComponent가 현재 겹치고 있는(Overlap 중인) 액터들을 찾아서
아웃 파라미터 배열 (전달한 함수 인자)에 채워주는 역할을 합니다.
이 함수는 UPrimitiveComponent 클래스 이거나 상속받은 컴포넌트들
(ex : USphereComponent, UBoxComponent 등)에 정의되어 있습니다.
출력용 배열로, 함수가 호출된 시점에 컴포넌트와 겹치는 모든 액터의 포인터를 이 배열에 채워 넣습니다.
사용 방법: 함수 호출 전에 빈 배열(또는 기존에 있던 배열)을 전달하면, 함수 내부에서 그 배열에 겹치는 액터들을 추가합니다.
ClassFilter (TSubclassOf<AActor>, 기본값은 nullptr) :
역할: 옵션으로, 특정 클래스(또는 그 하위 클래스)에 해당하는 액터만을 결과로 얻고 싶을 때 사용합니다.
nullptr이 들어왔다면 , 모든 클래스를 결과로 저장합니다.
GetOverlappingActors 함수원형(출처 : 언리얼엔진) :
if (OverlappingComponents.Num() <= 12)
{
//수가 12보다 작거나 같다면 TArray가 효율이 좋다.
Array크기 초기화
for (const 오버랩된 목록중 하나 : 오버랩된 목록)
{
if (오버랩된 애가 존재할경우)
{
AActor* OtherActor = 오버랩된 컴포넌트 -> 너 누구클래스니?
if (OtherActor && ((*ClassFilter) == nullptr || OtherActor->IsA(ClassFilter)))
{
//중복허용하지 않고,
OutOverlappingActors 배열에 추가
}
}
}
}
else
{
... // Size가 커지면 Tset이 더 효율성이 좋으므로 TSet으로 저장하는 과정
}
여기에서 사실 if (OtherActor && ((*ClassFilter) == nullptr || OtherActor->IsA(ClassFilter))) 다음의 친구가 이해가 되지 않았습니다. 하.. 사실 기초문법이슈의 문제였는데, 덕분에 많이 배웠습니다.
제 원래의 생각은 OtherActor && (*ClassFilter) == nullptr 을 왜 묶어서 검사하는거지? 라는 생각이 들었는데..
하..과거의 나 꿀밤 개씨게마렵네요 ;;
OtherActor 이 존재하고 ((*ClassFilter) == nullptr || OtherActor->IsA(ClassFilter)) 해당 조건 중 하나라면
IF문 안의 내용을 실행하는 것이였습니다 ㅠ..
그래도 실수 덕분에 많이 배웠습니다ㅋㅋㅋ 기분은 좋네요
첫번째 조건은 만약에 nullptr이라면 모든 액터를 저장하는것이기 때문에 IF문 안으로 들어갑니다
두번째 조건은 IsA 이부분을 좀 찾아봐서 지금부터 작성해보겠습니다 !
IsA() :
- IsA()는 UObject에 정의되어 있는 함수로, 액터가 지정된 클래스나 그 파생 클래스에 속하는지를 검사하는 역할을 합니다.
- 내부적으로 객체의 Uclass계층 정보를 참조하여 이루어집니다.
- 런타임에 객체가 특정 클래스나 그 파생 클래스인지 여부를 확인합니다.
동작 예시 )
MyObject->IsA(AMyCharacter::StaticClass()); // 이렇게 선언을 했다면
MyObject의 실제 클래스가 AMyCharacter이거나 AMyCharacter에서 파생된 클래스라면 true를 반환합니다.
만일 지금 사용하는 함수처럼
Collision->GetOverlappingActors(OverlappingActors, AMyCharacter::StaticClass());
내부적으로 IsA( AMyCharacter::StaticClass) 체크를 하게 됩니다.
이 체크는 해당 액터가 AMyCharacter 클래스 또는 그 하위 클래스 인지를 확인하기 때문에, 하위 클래스도 결과에 포함됩니다.
- 이유 : UObject는 언리얼 엔진의 최상위 클래스(루트 클래스) 입니다.
즉, 엔진 내의 대부분의 객체들이 UObject를 기반으로 만들어졌으며, UObject가 제공하는 리플렉션, 가비지 컬렉션, 직렬화 등 기본 기능들을 상속받습니다.
- 이유 2 : AActor는 UObject의 서브클래스 입니다
잠시 함수원형을 다시 보면
void GetOverlappingActors(TArray<aactor*>& OutOverlappingActors, TSubclassOf<AActor> ClassFilter = nullptr) const;
라고 되어있습니다. 그렇기 때문에 우리가 두번째 인자로 넣어주는 AMyCharacter::StaticClass() 은 반환값이 UClass*의 형태인데 저는 여기서 의문이 들었습니다.
UClass*가 AActor의 하위클래스인가? 이 생각덕에 개념을 더욱 잡을 수 있었습니다.
결론부터 말씀드리면 이 생각은 잘못된 생각이였습니다.
이유는 TSubclassOf 의 함수는 UClass*형태의 클래스 메타 데이터를 다뤄
메타 데이서 속의 <클래스 타입> 을 다룹니다
위의 함수 원형을 다시 보면 TSubclassOf<AActor> 은 UClass*형태의 클래스 메타 데이터가 들어올 것인데,
그 메타 데이터가 AActor의 AActor 혹은 그 하위클래스인지를 판단하는 함수였습니다.
다시 말해 TSubclassOf 함수는 UClass* 의 클래스 메타 데이터를 다루는 함수였습니다.
그렇기 때문에 AMyCharacter::StaticClass()를 넣어줄 수 있습니다.
UClass에 관한 정보는 여기에서 확인해주세요
TSubClassOf , UClass* , StaticClass, 클래스,인스턴스,메타데이터 :: bongsgame 님의 블로그
정리하자면 GetOverlappingActors 는 조건으로 설정한 클래스(액터)의
하위클래스이거나 자기 자신의 클래스라면 원하는 조건으로 받아들여,
배열에 저장해주는 로직이였던 것입니다 !
활용 예시 :
USphereComponent* BoomCollision;
TArray<aactor*> OverlappingActors;
BoomCollision->GetOverlappingActors(OverlappingActors);
출처 : 언리얼엔진
'Unreal > Unreal 공부 내용' 카테고리의 다른 글
2025 / 02 / 14 TIL : Unreal Assert (2/3) 미완성 (0) | 2025.02.14 |
---|---|
TSubClassOf , UClass* , StaticClass, 클래스,인스턴스,메타데이터(미완성) (0) | 2025.02.05 |
Timer(SetTimer...) (0) | 2025.01.24 |
구면선형보간법(SLERP) (0) | 2025.01.22 |
선형 보간 (0) | 2025.01.22 |