From a language standpoint you can glom a bunch of arrays together by using a list:
// starting empty to make a point
List<GameObject> mates = new List<GameObject>();
// add the mateTag ones
mates.AddRange( GameObject.FindGameObjectsWithTag( mateTag));
// add the susTag ones
mates.AddRange( GameObject.FindGameObjectsWithTag( susTag));
// and one more for my special buddy
mates.Add( SpecialFinalMateWhomYouAlreadyHaveAReferenceTo);
// and finally when you want it, either use it as the list, OR..
// use .ToArray() on the list to get an array
I don’t know of a way to find by layer directly. Of course you could just find all objects of type GameObject and then filter for the layer. Something like:
var objectsOnLayer = Object.FindObjectsOfType<GameObject>().Where(o => o.layer == someLayer).ToArray();
As for having some filter that does all of these, you can join these collections in some manner. But this starts getting into a bigger issue… that being performance.
Find by tag, or Find by name, or Find by type are all notoriously slow methods as they traverse the entire state of the game. Joining them is just going to be even slower. Your best bet as the most performant is doing like my above example searching for layer, and doing all your comparisons in the linq.
But even then… it’s slow and isn’t really preferred.
Instead… what are you trying to accomplish? Because these “find” methods are generally not the way you want to go about it. They mainly exist as last ditch options and/or because they’ve existed since early versions of unity back when unity made some design choices that aren’t really intended to be used these days.
Unfortunately combining the arrays isn’t an option, since this would combine all objects that fit one requirement or the other, and not necessarily ones that meet both.