VRMで数秒後に表情を変化させる
音楽のアタックに合わせて表情を変えようとしてる途中の産物です。
笑顔の表情の数秒後に元の表情に戻したい場合の処理をメモしました。
表情をつくる
VRoidや購入したりダウンロードしたVRMファイルはあらかじめいくつかの表情がプリセットとして登録されています。
そのプリセットを呼び出す場合は、
proxy.SetValue("Neutral", 1.0f);
となります。この場合、「Neutral」がプリセット名(BlendShapeName)になります。
プリセットを作成する場合は、
1.「Hierarchy」のキャラクターをクリックして、Playボタンを押す
2.「Inpector」→「VRM Blend Shape Proxy」の「Blend Shape Avatar」→「Blend Shape(Blend Shape Avatar)」をダブルクリックする
3.「Add BlendShapeClip」を押して、作りたい表情の名前を入力する。その後Saveを押して保存する。
このときの名前がプリセット名となります
4.「▶︎ Face」の▶︎を押して展開し、スライダを動かして表情をつくる
5.表情を作成したら、「Apply」を押して登録する
6.スクリプトの中で呼び出すときは、
proxy.SetValue("Smile", 1.0f);
とする。この場合は「Smile」が3.で登録したプリセット名
VRMで表情を変化させる
ご本家の通り、下記の2つが必要になります。
BlendShapeを操作する - dwango on GitHub
・proxy = GetComponent
・proxy.SetValue("Smile", 1.0f) 表情ON
・proxy.SetValue("Smile", 0f) 表情OFF
例として、キーボードで表情を変える例が下記です。
using System.Collections; using System.Collections.Generic; using UnityEngine; using VRM; public class FaceChange : MonoBehaviour { private VRMBlendShapeProxy proxy; // Use this for initialization void Start () { } // Update is called once per frame void Update () { if (proxy == null) { proxy = GetComponent<VRMBlendShapeProxy>(); } else { //キーボード入力 if(Input.GetKey(KeyCode.UpArrow)) { //表情呼び出し proxy.SetValue("Neutral", 1.0f); } else { proxy.SetValue("Neutral", 0f); } if(Input.GetKey(KeyCode.DownArrow)) { proxy.SetValue("Smile", 1.0f); } else { proxy.SetValue("Smile", 0f); } if(Input.GetKey(KeyCode.RightArrow)) { proxy.SetValue("Setunai", 1.0f); } else { proxy.SetValue("Setunai", 0f); } if(Input.GetKey(KeyCode.LeftArrow)) { proxy.SetValue("SHINKEN", 1.0f); } else { proxy.SetValue("SHINKEN", 0f); } } } }
一定時間後に表情を変える
笑顔から一定時間後に元の表情に戻したい場合の処理がこちらです。
TimeCount -= Time.deltaTime;を使っています。
using System.Collections; using System.Collections.Generic; using UnityEngine; using VRM; public class FaceKeep : MonoBehaviour { private VRMBlendShapeProxy proxy; //3秒後に表情を戻す(別の表情にする) float TimeCount = 3; // Use this for initialization void Start () { } // Update is called once per frame void Update () { if (proxy == null) { proxy = GetComponent<VRMBlendShapeProxy>(); } else { proxy.SetValue("Smile", 1.0f); //表情処理終章後にカウント開始 TimeCount -= Time.deltaTime; //カウントが0になったら=この場合は3秒経ったら if(TimeCount <= 0) { proxy.SetValue("Smile", 0f); //表情変化 proxy.SetValue("Neutral", 1.0f); } } } }