たくあんポリポリ

勉強したことを載せていきます。最近、技術系の記事はZennに書いています。(https://zenn.dev/chittai)

ゲーム内でVRMモデルに攻撃に当たった時にBlendshapeを操作して表情を変える

OculusGoでゲームを作成しました。ゲームではVRMモデルを配置して、攻撃が当たったらそれをトリガーにして表情を変えるようにしました。そんなに難しいことはしてなくて、攻撃で使用されるオブジェクトがモデルに当たったらBlendshapeの値を変更しているだけです。それでも状況に合わせて表情が変わるとリアリティが出るな~と思いました。

VRMのBlendshapeについては下記URLを参考にしてください。

ブレンドシェイプの設定 - dwango on GitHub

使用したツール / 環境

やりたかったこと

今回のゲームは敵から飛んでくる攻撃を剣で叩き落として後ろにいるお姫様を守ろう!というゲームです。お姫様は左右にうろちょろしていて、攻撃が当たると悲しい顔をしてしまいます。というのも、表情を変更するだけで今何を感じたんだろうというのが読み取れるので急にリアリティが上がったなと感じます。(最初にも書いたけど)

f:id:c_taquna:20181201002616j:plain
通常時の顔

f:id:c_taquna:20181201002708j:plain
攻撃が当たった時の顔

これは、当たり判定がされたタイミングでVRMのBlendshapeの"Sorrow"を1にしています。

当たり判定 & Blendshapeの変更

public class CollisionDetermination : MonoBehaviour {

    private void OnCollisionEnter(Collision collision)
    {
        string layername = LayerMask.LayerToName(collision.gameObject.layer);
        if (layername == "EnemyAttack")
        {
            transform.LookAt(new Vector3(transform.position.x, transform.position.y, transform.position.z - 1 ));
            var proxy = GetComponent<VRMBlendShapeProxy>();
            proxy.SetValue("Sorrow", 1);
            GetComponent<PlaySoundEffect>().Sound();
        }
    }
}

ちなみに、他にも以下のパターンによって表情を変更しています。

  • 前を向いているとき
  • 走っているとき
  • 攻撃を受けたとき
  • ゲームオーバーになったとき
  • ゲームをクリアしたとき

ただ、やることは基本同じで各処理にてBlendshapeで変えたい表情の値を変えれば問題ありません。
自分でも表情を作成できるのですが、その場合は""BLENDSHAPECLIP.VERYSORROW"のように、自分で作成したCLIP名を指定しましょう。

            proxy = GetComponent<VRMBlendShapeProxy>();
            proxy.SetValue("BLENDSHAPECLIP.VERYSORROW", 1.0f);

感想

いろんな表情作れるし、調整もできるので非常に使いやすい。Lerpで表情をいじればまた違った表現にもなる

c-taquna.hatenablog.com