Our pipeline generates usd layers (not really department layers either) on the fly from a recipe list (of sorts). We do not have an asset resolver and I am looking into ways we can enable duplication workflows in Maya. One way we can do this is by creating class prims in the asset layer where all the references/payloads, variant sets etc are stored.
I am unsure what (if any) downsides there are to this kind of workflow? One of the asset layers looks like this:
When an artist duplicates the prim /set/benchA/scTrashCanA01 in maya it will copy the prim spec (is that the right term?) and created /set/benchA/scTrashCanA02. What is the difference between this method and marking something as instanceable? Is there a huge downside to this workflow. Stronger layers in our system are reliant on the asset layer being generated which comes with its own precariousness.
Iāve done some presentations about how to define a usd-structure and how the intent (of what you really want to do with the usd-structure at the end) is the most important thing.
There are various ways to work out how to do implicit-instancing (not explicit PointInstancers, but work out what to do with two copies of the same āelementā in the scene basically) and there are different approaches that address different aspects of it.
When I was at Weta, we approached it in the way you are describing it, and it has a lot of pros, especially with how we wanted the Lighters to interact with it, how they could apply edits, etc.
There are possibly cons, which we found a couple while I was still there, but I do feel that it is a good starting point.
This is the video of the presentation:
And you can also see that in a similar way, the usd-assets-wg guidelines point to the class but as an āemptyā prim, mostly to apply edits globally.
But I do feel that references/variants/etc on the classes has benefits.
To add to what @paoloemilioselva said with regard to your question about instancing, it can work really well with the setup you have - just add instanceable = true to each of your class definitions, and then every inherits of the class will be instanced by default.