【Unity】3Dキャラクターの表情を変更して操る

投資の記事を更新して、全然ブログ更新できていないなぁと思ったので、久しぶりに更新します。

 

本日は3Dキャラクターの表情を変化させるような仕事を行ったので、備忘録的に書いておこうと思います。

 

で、これは設定されているとめちゃくちゃ簡単に操ることが出来ます。

で、最初にざっくりと説明すると、3Dキャラクターには基本的にはSkinnedMeshRendererというコンポーネントが入っています。そのSkinnedMeshRendererのBlendShapesの設定値をいじることで表情を変化させることが出来ます。

 

SkinnedMeshRendererについてざっくり

SkinnedMeshRendererは3Dキャラクターをアニメーションさせたときなどに3Dのメッシュ崩れなどがおきないように、いい感じに変形させるために必要なコンポーネントです。

たとえば、腕をひねったときにメッシュをいい感じにねじってくれます。腕のある地点から急にメッシュが変形するとかを防いでより人っぽく肌っぽく変形してくれます。

 

で、このSkinnedMeshRendererは体のパーツごとにコンポーネントがアタッチされています(多くの場合)。今回の表情を動かすためにはおそらく顔などにアタッチされているSkinnedMeshRendererを使います。

 

BlendShapeについてざっくり

今回の表情変更はこれがないと始まらないんですが、BlendShapesっていうのはSkinnedMeshRendererの中の1項目になります。BlendShapeは3Dモデルを作る際に設定されていないと使えないので、これが設定されていないモデルは今回表情を動かせません。

で、BlendShapeはたとえば口の形の「あ」・「い」・「う」・「え」・「お」などをプリセットで設定されていて、その値たちをうまくいじることで口の形をいろいろ変えていきます。たとえば

「あ」の成分の口の形50%

「い」の成分の口の形20%

「お」の成分の口の形80%

みたないな感じで

 

この画像はユニティちゃんの口のSkinnedMeshRendererです。

これはSMILE1・SMILE2みたいな感じで設定できます。

f:id:graphicalpoxy:20200603225148p:plain


これの顔のSkinnedMeshRendererを見つけて、BlendShapesが設定されていることが確認できれば以下のサンプルのように動かすことが可能です。

 

 サンプル

using UnityEngine;

public class BlendShapeTest : MonoBehaviour
{
    // BlendShapeが設定されているSkinnedMeshRenderer
    [SerializeField]
    private SkinnedMeshRenderer _skinnedMeshRenderer;

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            setFace();
        }
    }

    private void setFace()
    {
        // (インデックス,値)
        _skinnedMeshRenderer.SetBlendShapeWeight(0, 100.0f);
    }
}

 

これはSetBlendShapeWeight(0, 100.0f)で即時反映されますが、この値をじょじょに変化させると自然に表情を変化させることが可能になります。

 

今回は我ながら言葉足らずな記事だと思うけど一旦これで終わります。