Blenderでシェイプキーを設定したモデルをUnityに持っていって、表情などを動かしてみます。
まずBlenderでデフォルトのCubeを消して、Shift +A -> Mesh -> Monkeyで猿を配置します。
オブジェクトモードでTキーでツールシェルフを表示しSmoothをクリックします。
プロパティの逆三角形のマークをクリックして、オブジェクトモードのまま、Shape Keysの+ボタンを3回押します。
すると、Basisの後に2つのシェイプキーが追加されます。
Key1を選択します。
この状態でTabキーで編集モードに切り替え、猿を変形させます。
Proportional Editingで回りの点も一緒に動くようにすると変形しやすいです。
Blenderの編集モードの基本操作
表情ができたら、再度Tabキーでオブジェクトモードに戻します。
このままShape KeysのValueの値を変えると、デフォルトから変形させた状態へシームレスに表情が変化します。
同じ操作でKey2にも表情をつけて、FBXファイルでエクスポートしてUnityにもっていきます。
UnityでAssets -> Import New Asset…からインポートしたら、インポートしたものを選択して、インスペクタでImport BlendShapesにチェックが入っているか確認します。
チェックが入っていなければチェックを入れてApplyをクリックします。
これをシーンに配置します。
猿のオブジェクトを選択してインスペクタを見ると、Skinned Mesh RendererコンポーネントにBlendShapesという項目があり、Blenderで設定したシェイプキーが表示されています。
シェイプキーの横のスライダーでValueを変えると表情が動きます。
複数のシェイプキーのValueの値を上げると表情が合成されます。
このValueの値をプレイ中に変えてみます。
スクリプトで制御する
SkinnedMeshRendererコンポーネントのSetBlendShapeWeight()メソッドを使うとシェイプキーの値を変更できます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ShapeKeyScript : MonoBehaviour
{
SkinnedMeshRenderer skinnedMeshRenderer;
// Start is called before the first frame update
void Start()
{
skinnedMeshRenderer = GetComponent<SkinnedMeshRenderer>();
}
// Update is called once per frame
void Update()
{
if (Input.GetKey(KeyCode.Alpha1))
{
skinnedMeshRenderer.SetBlendShapeWeight(0, 100f);
}
else
{
skinnedMeshRenderer.SetBlendShapeWeight(0, 0f);
}
if (Input.GetKey(KeyCode.Alpha2))
{
skinnedMeshRenderer.SetBlendShapeWeight(1, 100f);
}
else
{
skinnedMeshRenderer.SetBlendShapeWeight(1, 0f);
}
}
}
第一引数にはシェイプキーのインデックスを入れます。1つ目のシェイプキーの値を変更するときは0を入れます。第2引数にValueのfloat値を入れます。
アニメーションで制御する
アニメーションのファイルを作ってAdd Propertyを見ると、シェイプキーが選択できます。
これでシェイプキーを使ったアニメーションを作ることができます。
Unityでアニメーションを作成
デフォルトではアニメーションの動きが早かったので、アニメーターコントローラーでこのアニメーションが設定されたステートをクリックし、Speedを変えています。