Best way to Drive FaceControls

Hey developers. My question is centered around FaceControls and how to drive their values in the most efficient way.

It’s important to note that the client provides the FaceControls Weight Values, and the Server replicates them, using RemoteEvents.

My initial logic was to drive the FaceControl Properties directly, however, that was swiftly shutdown after realizing that all the Properties are Permission 1 (iirc), meaning they’re totally inaccessible by (Local)Scripts.

After this, I decided to attempt to use the only documented way of driving FaceControl properties, which was to animate the DynamicHead. So here we are, 49 animations later, and it still doesn’t work as intended. Most of the animations do properly drive the properties, however, some others will do nothing at all and idle animations will override my animations (even on Action priority and when stopping all other animations on the Humanoid). Using Action4 priority breaks my animations for some reason.

My only other possible option could be to clone the Character’s Head, use a RigidConstraint to the original head, hide the Original Head, and then drive the new head’s FaceControls with the animations. The two problems with this is that one, hiding the original head would also hide the player’s nametag, and two, there is still no guarantee that the animations would work any better on the new head, only that the old idle animations would no longer override my animations.

I’m open for any suggestions, just any proper way to drive a character’s DynamicHead’s FaceControl’s properties without issues would do, preferably without 49 animations… :sweat_smile:

3 Likes

Did you ever end up finding a solution?

I also tried creating an animation which does nothing but close an NPC’s eyes via FaceControls. Playing this animation on the character does work and closes the character’s eyes as expected, but for some mysterious reason does not work if another animation is playing at the same time, even if that other animation does nothing with the face.

Changing priority and setting weight to max didn’t help either ¯_(ツ)_/¯

1 Like

I know some animations clash with each other, so that might be a possibility. For example, EyesRight will fight against EyesLeft, some dynamic heads also have set it up so when two specific animations are activated, they’ll animate in a different way than expected so they become “compatible”, for example, preventing clipping when blinking or closing the mouth/lips and such.

So far the best way I found to animate face controls is to have pre-set moods instead of controlling each slider individually, I can’t think of anything else until Roblox gives us the ability to change face controls via script…

Some default animations do animate the dynamic head face controls. A great example of this are the animations from the bold animation set. The expressions change with those. The adidas animation packs also animate the face controls. Perhaps the “Mood” animation could be of help, (or maybe you could try removing it), but I don’t know if you can change the mood animation without having to edit the HumanoidDescription.

2 Likes