Good morning! Let's work hard today!

【Unity】Blenderで作成したモデルのシェイプキーを動かす

本記事はUnityでBlenderで設定したShapeキーの操作、およびC#スクリプトで制御する方法について記載しています。下の2つ記事を延長の内容になります。
例としてパックンを利用しています。


Unity上のシェイプキーの場所

①fbxファイルをUnity上にインポートします。
②HierarchyウィンドウにモデルをD&Dさせます。
③D&Dさせたモデルオブジェクトを選択した状態で、Inspectorウィンドウの「▼BlendShapes」を開く。下図の黄色の枠で覆われた部分にBlenderで作成したシェイプキーの一覧が表示されます。

この状態で黄色の枠のシークバーを動かすとSceneウィンドウのモデルも変形します。

シェイプキーのスクリプト制御

シェイプキーをスクリプト制御する方法を幾つか例を挙げて紹介します。

ボタン入力でシェイプキーを動かす方法

void Update()
{
    if (Input.GetKeyDown(KeyCode.RightArrow))//[1]
    {
        this.transform.GetComponent<SkinnedMeshRenderer().
           SetBlendShapeWeight(0, 100);//[2]
    }
    if (Input.GetKeyDown(KeyCode.LeftArrow))//[3]
    {
        this.transform.GetComponent<SkinnedMeshRenderer().
           SetBlendShapeWeight(1, 100);//[4]
    }
}
[1]. [右矢印]キーを押した場合にTRUEになる。
[2]. BlendShapes[Index:0]の値を100(MAX)とする。
[3]. [左矢印]キーを押した場合にTRUEになる。
[4]. BlendShapes[Index:1]の値を100(MAX)とする。

動作は以下の動画になります。

BlendShapeの値を徐々に変える

    private bool flag;
    private int count;

    private void Start()
    {
        flag = false;
        count = 0;
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            flag = true;
        }

        if (flag)
        {
            if (this.transform.GetComponent<SkinnedMeshRenderer>().
                   GetBlendShapeWeight(0) < 100)//[1]
            {
                count = count + 10;
            }
            else
            {
                flag = false;
            }
        }
        else
        {
            if (this.transform.GetComponent<SkinnedMeshRenderer>().
                    GetBlendShapeWeight(0) > 0)//[2]
            {
                count = count - 10;
            }
        }
        this.transform.GetComponent<SkinnedMeshRenderer>().
            SetBlendShapeWeight(0, count);//[3]
    }
[1]. BlendShapes[Index:0]の値が100より小さいか
[2]. BlendShapes[Index:0]の値が0より大きいか
[3]. BlendShapes[Index:0]の値をcountと同じにする

大まかな流れはSpaceキーを押下するとパックンの口が閉じ、完全に閉じた後、自動で元の状態に徐々に戻していきます。

ブレンドシェイプの値の切り替えはの利用内容によって違いによって変更する必要があります。