Search code examples
c++unreal-engine4

How to get Actor list by UActorComponent?


I want to get all scene actors filtered by a list of actor components.

Kismet library has this.

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

But what I need is something like this:

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

Are there any functions in the Kismet which has similar functionality?


Solution

  • Primitive component is actually an actor component so you can just copy implementation of this function into your code and replace UPrimitiveComponent entries with 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);
                    }
                }
            }
        }
    }
    

    or event make a template

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