Wydaje mi się, że animacje blendshape'ów trzeba oskryptować, bo działają niezależnie od akcji szkieletu (chociaż chciałbym się mylić).
Możesz pobierać informację, która akcja jest akurat odgrywana i ustawiać wartości blendshapów w zależności od np. AnimationState.normalizedTime.
Poniżej napisałem prosty przykład. Dla akcji o nazwie "Armature|ArmatureAction" pierwszy blendShape będzie wzrastał wprost proporcjonalnie do postępu animacji tej akcji (to można łatwo rozwinąć). Każda akcja powinna mieć osobnego case'a. W przypadku odgrywania kilku akcji na raz, trzeba będzie interpolować wartości dla blendshape'ów (to jest wersja uproszczona).
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class testMonioBlend : MonoBehaviour {
// skrypt przypisany do nadrzędnego obiektu, który ma komponent "Animation"
private Animation anim;
private GameObject mesh;
private SkinnedMeshRenderer meshRenderer;
private Mesh skinnedMesh;
float[] blendShapeValues;
int blendShapeCount;
void Start () {
anim = gameObject.GetComponent();
// przypisanie mesza, który ma blendshape'y (można to zrobić ładniej)
mesh = GameObject.Find ("Cube");
meshRenderer = mesh.GetComponent ();
skinnedMesh = mesh.GetComponent ().sharedMesh;
blendShapeCount = skinnedMesh.blendShapeCount;
blendShapeValues = new float[blendShapeCount];
meshRenderer.SetBlendShapeWeight (0, 50);
}
void LateUpdate () {
foreach (AnimationState state in anim) {
switch (state.name){
case "Armature|ArmatureAction":
blendShapeValues[0] = state.normalizedTime*100; //bo blenshape'y przybierają 0-100
break;
}
}
for (int i = 0; i meshRenderer.SetBlendShapeWeight (i, blendShapeValues[i]);
}
}
}