Как получить список актеров от UActorComponent? - PullRequest
0 голосов
/ 28 мая 2020

Я хочу, чтобы все актеры сцены были отфильтрованы по списку компонентов актеров.

В библиотеке Kismet есть this .

static void GetActorListFromComponentList
(
    const TArray < class UPrimitiveComponent * > & ComponentList,
    UClass * ActorClassFilter,
    TArray < class AActor * > & OutActorList
) 

Но мне нужно кое-что вот так:

static void GetActorListFromActorComponentList
(
    const TArray < class UActorComponent * > & ComponentList, // Note the TArray<> element type
    UClass * ActorClassFilter,
    TArray < class AActor * > & OutActorList
) 

Есть ли в Kismet какие-либо функции с аналогичной функциональностью?

1 Ответ

1 голос
/ 28 мая 2020

Примитивный компонент на самом деле является компонентом-субъектом, поэтому вы можете просто скопировать реализацию этой функции в свой код и заменить записи UPrimitiveComponent на UActorComponent.

void GetActorListFromComponentList(const TArray<UActorComponent*>& ComponentList, UClass* ActorClassFilter, TArray<class AActor*>& OutActorList)
{
    OutActorList.Empty();
    for (int32 CompIdx=0; CompIdx<ComponentList.Num(); ++CompIdx)
    {
        UActorComponent* const C = ComponentList[CompIdx];
        if (C)
        {
            AActor* const Owner = C->GetOwner();
            if (Owner)
            {
                if ( !ActorClassFilter || Owner->IsA(ActorClassFilter) )
                {
                    OutActorList.AddUnique(Owner);
                }
            }
        }
    }
}

или создать шаблон события

template<typename TComponent, typename TAllocator>
void GetActorListFromComponentList(const TArray<TComponent*, Allocator>& ComponentList, UClass* ActorClassFilter, TArray<class AActor*>& OutActorList)
{
    OutActorList.Empty();
    for (int32 CompIdx=0; CompIdx<ComponentList.Num(); ++CompIdx)
    {
        TComponent* const C = ComponentList[CompIdx];
        if (C)
        {
            AActor* const Owner = C->GetOwner();
            if (Owner)
            {
                if ( !ActorClassFilter || Owner->IsA(ActorClassFilter) )
                {
                    OutActorList.AddUnique(Owner);
                }
            }
        }
    }
}
...