Reputation: 1806
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?
Upvotes: 0
Views: 1560
Reputation: 346
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);
}
}
}
}
}
Upvotes: 1