What is the ideal way to set up your facial expression resets?

With the recent documentation change, the best practice for states has become having Write Defaults disabled, which means setting up animations to undo changes to your model. Has anyone found an ideal way to do this for facial expressions without having the blend shapes briefly snap to default? What solutions exist in the non-Write Defaults landscape?

I don’t know if it’s best practice, but I have it so when no expression is selected, it will default to an expression that puts all expression blendshapes to 0. Also resets the material to the default material incase I have one of the expressions change that.

It basically makes the default state a catch-all.

The problem I have with this method is that, while it does work, it produces a sort of stutter as it resets before moving to the correct state. I can’t seem to come up with a solution to this that isn’t exceedingly tedious to set up and/or problematic, but like here’s what I’ve got for ideas:

  1. Every gesture on each hand is its own layer. Tedious, inelegant.
  2. Have it all on a single layer, but enter animator hell building a giant plate of spaghetti and stateballs. Tedious, inelegant.
  3. My most successful attempt thus far has been a two-layer system. One layer is weighted sub-1 and contains ONLY the gesture animations set up similarly to the example (any state to each gesture) with a second layer weighted to 1 set up more explicitly, as below:

The results aren’t perfect, the blend shapes go absolutely wild transitioning to a different expression (because of the not-shown layer not resetting itself) and it doesn’t even include half of the expression-to-expression resets it should have, but it’s the closest I’ve gotten so far that isn’t sending me into a fit. It’s definitely introducing me to how layers actually work when write defaults isn’t enabled so I guess it isn’t all bad, but I still feel like I’m not any closer to a good solution.

Okay, I think I’ve got it. Take this with a grain of salt because every time I’ve said that so far it turned out I didn’t have it at all but I do legitimately believe I have it this time.

Anything you animate on that layer, animate it on every other animation on the layer. That’s it, it doesn’t have to do anything but reset other animations, so it’s not super tedious, but you do have to track everything you animate on each layer. Of course, this encourages layers to be as small as possible and I’m totally down for that because compartmentalization is a good philosophy for development.

Have a reset animation on your holding state of course, and you might want to have a hand be prioritized for gestures so they don’t combine in weird ways.

Non-Write Defaults is a bit tedious but I get it now, at least.

EDIT: Once again my understanding is proven flawed, though slightly less than usual. The higher priority layer (the lower the layer is on the stack) takes full control all the time unless it doesn’t animate something the lower priority layer does (Probably want to animate everything on both layers!). The solution is to send your full resets to holding states with an empty animation in it. However, this will still produce the janky “I’m resetting” transition when you go from your prioritized layer to your other layer. Nearly there! Here’s what each hand’s layer looks like now:

Not sure if it’s already been said, but I saw one post which has each object flowing from and back to default individually. It saves work to let Any State handle any changes in your expressions.