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