In the case of a multi-pass shader, I wouldn't have to create and configure 30 different outline gameobjects and I also wouldn't have to keep their animations in sync with the actual character mesh, which would simplify the implementation significantly.
Please see my previous reply, you can use the
RenderExistingMesh component to re-render the same skeleton mesh, there is no need to keep anything in sync manually.
So I have to create 30 duplicate GameObjects with RenderExistingMesh component and I also have to create 30 different outline materials, since my understanding is that materials can't be shared between different skeletons/atlases.
Even with a multi-pass material, you would likely want to switch between a non-outlined material version and a version with the added outline. Otherwise a render pass is wasted drawing a completely transparent outline (if e.g. material parameter outline opacity is set to 0), which is usually not what you want. Unfortunately render passes cannot be disabled via Material parameters, these need to be different shaders. So the benefit of a multi-pass shader would not save you a lot of setup work from that point of view.
If you need to setup 30 materials in the same way, you could create a script for that (or add it to your own outline script), which checks e.g. upon
Awake if the GameObject with
RenderExistingMesh component and the Outline Material have been created already, and otherwise create them for you. This should do all the setup work for you.
It's simple to do for a single skeleton, but it's hard to scale.
It scales linearly, but I admit, if you would create 30 GameObjects and materials manually this would be unnecessary work.