Download

Removing multiple instances which are referenced by their index

Hey, I have a problem which is almost funny because it’s not really a bug but to find a solution for this is like solving an impossible puzzle :wink:

I have one Instanced Static Mesh Component. And I have let’s say 3 instances I want to remove. So it’s an integer array with 3 integers, the indexes to the instances. Now I call “Remove Instance” in the loop and the index is the first, second or third number out of the array.

Now the problem is: The only way to reference an instance is with the index. But after I called “Remove Instance” once, all the instances which had a higher index than the instance I removed will reduce their index by one! So the index reference to the other 2 instances I want to remove in this array is completely worthless because they could reference any instance instead of the instance I originally meant.

I need this because I do a multi sphere trace and I want to remove all instances this trace hits. I do a For Each loop on the Hit Result Array of the Trace, and every hit result has the index of the instance which was hit, but after removing one of them the reference to all the others are just trash. I would have to do a new trace after removing an instance to get the new index. This is surely not the way it is supposed to work.

So, do you have a solution for this puzzle? :cool:

I don’t know if there is a way to sort the array from high to low because that would solve your problem. I’m using transform location as a unique value to find the instances i need, perhaps instead of storing the indexes you could find another unique value to reference your instances.

Maybe you should have them all have their own components, this way all of them are index 0, and you can keep track of components rather than instances. I’m working on a game like terraria, and all of my instances have their own components, so I don’t have problems like this.

If your instances are in each their own Instanced Static Mesh Component then there is not sense to use an Instanced Static Mesh Component at all, you could just use a Static Mesh Component.

Thommie, how do you reference an instance with the location? There is only one “Remove Instance” node and it only accept’s an index.

I myself put each different instance in their separate folders in the project.

:wink:

I have it working now, but it needs a lot of nodes to make this work. I am basically calculating which instances need to get removed based on which ones got removed before. So if I want to remove {4,2,9,3} in this order, I basically need to remove {4,2,7,2} to remove the correct ones.

This is how I do it:

0b2c23eaa2c7c4dd6e73c9abfd83c0cb965092ee.png

e531fd96398b4976d34fb0cac02ddc31018988f9.png

And since I need this to work for a trace which might hit different Instanced Static Mesh Components, I had to add a way to combine all the hits in arrays based on which component was hit, I have not yet cleaned up these nodes:

So it’s a lot of work just to remove some instances. I hope Epic will make this easier in the future.

I ran into the same problem and I am glad to get behind the problem by this post.
Thank you!

In C++ you can sort TArray something like this:



OutHits.Sort(&](FHitResult A, FHitResult B)
{
    return A.Item > B.Item;
});

and then remove:



for (int i = 0; i < OutHits.Num(); i++)
{
     InstancedStaticMeshComponent->RemoveInstance(OutHits*.Item);
}


that’s all! :smiley:

This is very impressive. Thank you, I was thinking I would have to invent this myself. You saved me like a day at least.

that’s kinda an over-complication if all your trying to do is delete multiple instances from a sphere trace at the same time.
All you need to do is assign the instance indexs to an array and for its length get the max value from the array, use it to delete an instance, then delete the max value you used from the index array. that will spawn them from highest index to lowest

but another simple way if you want to delete them one by one is doing an initial sphere trace and copying the location of each instance to an array, then looping through the array run another small sphere trace. with that method at the cost of extra sphere traces which isn’t so bad if your goal was staggering their deletion, you can reorganize the index list to your heart’s content