Can't change shapekey values on a linked mesh? So, I need to show the same human body in a few different states (like "smile" and "frown"). Yay shapekeys!

Unfortunately, when I link this object from the asset file to the rendering file, I have to make the mesh a local copy in order to change the "weights" of each shape key for each instance of the body that I want. I.e. one body using "frown" and another using "smile" would have to use different settings, and each have to be local (can't remain linked to the original mesh).

Furthermore, each body in my scene that needs to use one of the shapekeys has to be its own copy, it can't be an instance of the other bodies in the scene without them all sharing the same shapekey settings. I.e. "frown" and "smile" can't even share a mesh in the same file, without also sharing the amount of "frown" and "smile" that they use.

This is a problem, because anytime I update the original mesh, none of the changes propagate to the other models (because they aren't linked anymore, they're local). So, I have to go relink, make them local, and set the shapekey values for each one.

What I'd like to happen is to link the same object multiple times, and set each one to use different shapkeys, that way I only have to update the single, original mesh, and all the rest get the updates. For example, if I want to change the shape of the arm, I want that change to be the same regardless of the shapekey, so I'd like to just make that change once. Right now, my options are to use separate objects instead of shapekeys (and hope that I can perfectly copy any changes between the separate objects), or to continue like I have been and reset all of the bodies anytime they need to get a change that I made to the original.

Anyone know a way to make this simpler? Is this what proxies are for? Or is this just not doable in Blender?

It makes sense that shapekeys belong to the mesh, but it doesn't make sense (to me) that multiple instances of a mesh can't be using different shapekeys at the same time.
You could use a combination of an armature and drivers. After you link in your object you make a proxy of the armature which allows you to pose the armature in the new file and still get updates from the source file.

Once you have the shapekeys setup, create an armature and add a bone to be used as the controller. Go back to the object and in the shapekey list right click on the shapekey value you want to drive (or select the key and right click on the value underneath) and select Add Driver.



To define the driver you switch the graph editor to display drivers and show the properties sidebar by pressing N. You may need to click the value name in the list for the driver details to show.



Then you can choose the armature and the bone and have one of it's transform values used as the value for the shapekey value. In this example I am using the x location of a bone called DriveKey1 to control Key 1. Now as I move the bone along the x axis the shapekey is turned on/off.

I also chose Sum Values for the driver type. Scripted expression can give you more control but also can be disabled through blender's auto execution setting. Using Sum Values gets around this.

With the option to set custom bone shapes and use constraints to limit movement, it is rather easy to create a clear visual controller that you may have seen with some rigged characters.

Tutorials on rigging a face often show this technique when setting up mouth and eye controls.