VRMの動作確認によく使われるツールとしてVRMLiveViewがあるのですが、ここで使用している「UNITE IN THE SKY」はユニティちゃんプロジェクトで使われている有名なダンスプロジェクトを流用していました。
ですがこのダンス、「すごいのにVRで見れないな~」「どうせなら自分のアバターが踊ってるのを見てみたい」そんな事を思い、Twitterで呟いてみたところ、意外と見てみたいという人がいたため作成する事となりました。
ビートセイバーにもっていく関係上、ただ単にAssetBundleに詰め込んで持っていけば使えるというわけではなく、以下のような課題がありました。
[課題]
- スクリプトに関しては専用実装のものばかりなので、AssetBundleで持ち込めない。
- シェーダーをすべてビートセイバー用に改造しなければいけない。
- ダンスのアバターを自分のアバターに変更するため、元のダンスモーションをVRMへの流し込みのほか、リップシンクの変換や表情の変換が必要。
- 使えるVR用の鏡スクリプトがない。
[対応1:スクリプトの持ち込み]
こちらはすべてビートセイバー上で動くようにコンパイルし、MOD側で必要オブジェクトに追加することで対応することにしました。
オブジェクト数が多いため、どのスクリプトが必要かの判断はオブジェクト名に仕込む事で解決し、オプションで初期パラメータ以外が必要な場合はそこからとってくることにしました。
※命名規約を以下のように決めスクリプトの割付をしています。
- 【_Sc_】+スクリプト名:自身のオブジェクトに対象のスクリプトを追加する
- 【PSc_】+スクリプト名:親オブジェクトに対象のスクリプトを追加する
- スクリプト名【[パラメータ名△パラメータ]】:対象のパラメータに値をセットする
- 【スクリプト名/スクリプト名】:複数のスクリプトを追加できる
こうすることで、作成上で設定階層の変更や、追加・削除が容易になり、同じスクリプトの使いまわしを楽に行うことができるようになりました。
[対応2:シェーダーのビートセイバー用への改造]
こちらについては、MaterialChangで数多く実装していたため、技術の転用ですぐに解決することができました。しかし、演出上Emissionは必要不可欠であったため、微調整は必要でした。
[対応3:モーションの変換]
ダンスモーションについては、ヒューマノイド型共通のため苦労することはなかったが、リップシンクや表情については、VRM標準のBlendShapeに変換する必要でした。
そのため、リップシンクの変換用のスクリプト「LipSyncController」と表情の変換用スクリプト「FaceSyncController」を用意することで、解決しました。
[対応4:VR用の鏡スクリプト]
ネットに落ちていたVR用の鏡スクリプトではうまく表現することができなかったため、バーチャルモーションキャプチャーの作者のsh_akiraさんに相談したところ「DMM VR Connect SDK」を紹介してもらい、こちらの鏡スクリプトを改造することで対応することができました。ただし、特殊シェーダーとの組み合わせなのでシェーダーの改変は別途行うことで対応しました。
最終的に出来上がったものは以下の動画となり、自身のアバターに踊ってもらうMODとして完成させることができました。