Code Less, Create More!

Simple but useful code snippets for 3D Graphic Developers

Unreal Engine

Unreal Engine(C++)에서 Actor와 Component 찾는 방법

데브엑스 2023. 3. 12. 10:17
반응형

객체 지향 프로그래밍에서는 모든 것이 객체이기 때문에 프로그래밍 작업 과정은 보통 대상 객체를 찾는 것에서 시작하는 경우가 많습입니다. 객체를 찾으려면 일반적으로 객체를 저장하고 있는 컬렉션 또는 데이터 구조를 검색해야 합니다. 예를 들어, 특정 기준을 충족하는 객체를 찾기 위해 배열이나 리스트를 검색하는 루프에서 이름이나 속성을 확인하는 작업이나 찾아낸 객체의 메서드를 호출하는 등의 작업들이 그러한 사례들입니다.

 

언리얼 엔진은 GetActorOfClass, GetAllActorsOfClass, FindComponentByClass 및 Iterator와 같이 클래스에 따라 객체를 검색하기 위한 다양한 메서드를 제공합니다. 이러한 메서드를 사용하면 게임 세계에서 특정 유형의 객체를 효율적으로 검색할 수 있습니다.

아래는 런타임에 구성되는 클래스 구성 요소의 계층 구조의 간단한 사례입니다.

Example Actor and Component hierarchy
Example Actor and Component hierarchy

1. World에서 Actor 찾기 

언리얼 엔진의 UGameplayStatics 클래스는 모든 액터를 컬렉션으로 저장하고 있으며, 어디서나 사용하기 편리하도록 정적 함수로 검색에 필요한 함수들을 제공합니다.

GetActorOfClass는 주어진 클래스의 첫 번째 찾은 액터를 반환하고, GetAllActorsOfClass는 주어진 클래스의 모든 액터를 수집합니다.

#include "kismet/GameplayStatics.h"

AActor* MyActor = UGameplayStatics::GetActorOfClass(GetWorld(), AMyActor::StaticClass());
 
// Find all actors of a certain class
TArray<AActor*> MyActors;
UGameplayStatics::GetAllActorsOfClass(GetWorld(), AMyActor::StaticClass(), MyActors);
 
UGameplayStatics::GetAllActorsWithTag(GetWorld(), FName("MyTag"), MyActors);
 
float NearsetActorDistance = 1000.0f;
AActor* NearsetActor = UGameplayStatics::FindNearestActor(GetActorLocation(), MyActors, NearsetActorDistance);

2. Actor에서 Component 찾기 

FindComponentByClass 함수는 UActorComponent 클래스의 멤버 함수입니다. 이 함수는 찾으려는 컴포넌트 유형을 지정하는 템플릿 매개변수를 사용합니다. 

GetComponentByClass는 FindComponentByClass와 동일합니다.

// Find a component in an actor
UActorComponent* MyComponent = MyActor->FindComponentByClass(UMySceneComponent::StaticClass());
 
UActorComponent* MyComponent = MyActor->GetComponentByClass(UMySceneComponent::StaticClass()); // == Same with FindComponentByClass()

3. Actor Iterator 사용 

상황에 따라 액터 및 객체를 반복하는 것이 컬렉션 배열만 가져오는 것보다 더 효과적일 수 있습니다. 예를 들어, 반복 루프에서 이름 비교 또는 가장 가까운 객체 찾기와 같은 각 항목에 대한 조건부 처리가 필요할 수 있습니다. 

이런 경우에는 각 반복 메서드가 Iterator 또는 pointer와 같이 다른 유형의 반복 변수를 사용하기 때문에 이를 알고 있는 것이 중요합니다.

#include "EngineUtils.h"

// Iterate by specific actor class
for (TActorIterator<AMyActor> MyActorIt(GetWorld()); MyActorIt; ++MyActorIt)
{
    UE_LOG(LogTemp, Log, TEXT("MyActor : %s"), *(MyActorIt->GetName()));
}
 
// Iterate all actors
for (FActorIterator ActorIt(GetWorld()); ActorIt; ++ActorIt)
{
    UE_LOG(LogTemp, Log, TEXT("Actor : %s"), *(ActorIt->GetName()));
}
 
// loop all actors
for (const AActor* ActorPtr : FActorRange(GetWorld()))
{
    UE_LOG(LogTemp, Log, TEXT("Actor : %s"), *(ActorPtr->GetName()));
}

4. Object Iterator 사용

UObject에서 파생된 클래스에 대해서도 유사한 반복자 패턴을 사용할 수 있습니다.

// Iterate all objects
for (FObjectIterator ObjectIt; ObjectIt; ++ObjectIt)
{
    UE_LOG(LogTemp, Log, TEXT("Object : %s"), *(ObjectIt->GetName()));
}
 
// Iterate by specific object class
for (TObjectIterator<UStaticMesh> MeshIt; MeshIt; ++MeshIt)
{
    UE_LOG(LogTemp, Log, TEXT("Mesh : %s"), *(MeshIt->GetName()));
}
 
// loop all objects
for (const UStaticMesh* MeshPtr : TObjectRange<UStaticMesh>())
{
    UE_LOG(LogTemp, Log, TEXT("Mesh : %s"), *(MeshPtr->GetName()));
}


결론

객체를 찾는 것은 프로그래밍에서 객체를 다루는 더 큰 프로세스 중 하나입니다. 그러나 이는 주어진 작업에 필요한 대상 객체를 식별하는 데 도움이 되는 필수적인 단계입니다. 따라서 객체 지향 프로그래밍 개발 개념과 기술을 잘 이해하여 객체를 효과적으로 사용하는 것도 중요합니다.

언리얼 엔진에서 객체를 검색하는 방법은 매우 다양합니다. 따라서 필요에 따라 적절한 방법을 선택하여 프로그래밍할 수 있도록 지속적으로 학습하고, 경험을 쌓아나가야 합니다.

반응형