언리얼 엔진에서 액터와 컴포넌트를 찾는 방법

객체 지향 프로그래밍에서는 모든 것이 객체이기 때문에 일반적으로 프로그래밍 작업 흐름은 관심 있는 객체를 찾는 것으로 시작됩니다.

개체를 찾으려면 일반적으로 해당 개체가 포함된 컬렉션이나 데이터 구조를 검색해야 합니다.

예를 들어 배열이나 목록에서 특정 기준을 충족하는 개체를 검색하는 루프에서 이름이나 속성을 자주 확인합니다.

언리얼 엔진은 GetActorOfClass, GetAllActorsOfClass, FindComponentByClass, Iterator 등 클래스별로 오브젝트를 검색하는 여러 메서드를 제공합니다.

이러한 메서드를 사용하면 게임 세계에서 특정 유형의 개체를 효율적으로 검색할 수 있습니다.

다음은 런타임에 빌드된 클래스 구성 요소의 계층 구조입니다.

단순한보지 않았다.


액터 및 컴포넌트 계층 구조 예(언리얼 엔진 문서에서)

1. 세계에서 배우 찾기

Unreal Engine의 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. 액터에서 컴포넌트 찾기

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. 액터 이터레이터 사용

경우에 따라 액터와 객체를 반복하는 것이 컬렉션을 가져오는 것보다 더 효율적일 수 있습니다.

예를 들어 이름을 비교하거나 반복 루프에서 가장 가까운 개체를 찾는 것과 같이 각 항목에 대해 조건부 처리를 수행할 수 있습니다.

각 반복 방법이 반복자 또는 포인터와 같은 다른 유형의 반복 변수를 사용하는지 여부를 아는 것이 중요합니다.

#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. 객체 이터레이터 사용

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()));
}

결론적으로

객체 찾기는 프로그래밍에서 객체로 작업하는 더 큰 프로세스 중 하나입니다.

그러나 이것은 주어진 작업에 대해 원하는 대상 개체를 식별하는 데 도움이 되는 중요한 단계입니다.

따라서 객체를 효과적으로 사용하기 위해서는 객체지향 프로그래밍 개발 개념과 기법을 충분히 이해하는 것도 중요하다.

언리얼 엔진에서 오브젝트를 검색하는 방법에는 여러 가지가 있습니다.

따라서 자신의 필요에 따라 적절한 프로그래밍 방법을 선택하기 위해서는 계속해서 배우고 경험을 쌓아야 합니다.