このテキストは、わたしが上の動画(mod)を作成するに際して、考えていたことや、制作の苦労などについて、まとまりもなく書き連ねたものです。説明もなしに専門用語が次々と出てきますが、なんとなく雰囲気だけとらえていただけるとありがたいです。なお、長いので前編後編の2回に分けてお届けします。
よく、わたしの動画は「謎技術」と言われるので、この記事は、手品師が種を明かすようなもの(大げさ)でちょっと勇気がいるのですが、ご支援してくださったみなさんになら明かしてもいいかなと思いました。チュートリアルではないので、読んでもほとんど動画やmod制作の役には立ちません。ごめんなさい!
- modでビートセイバーにダンスアニメーション付きのアバターを持ち込む
- ダンスにぴったり合う譜面を作成する
- この譜面を、セイバーを持ってダンスするアバターが自動で切る
- 曲に合わせて表情をころころ変える
このmodは アドベントカレンダー わたしの担当日の18日目、ちょうどわたしの誕生日にみなさんに提供する予定で制作開始しました。みなさんの目の前で踊るわけですから、ただのダンスではなく、もっとグイグイくるような、目の前にいて楽しいものにしたい、という気持ちから、曲とダンスは最初からこの「お願いダーリン」に決めていました。
この「お願いダーリン」にはすばらしいダンスモーションがあり、hinoさんの下記のモーションを使わせていただきました。
https://www.nicovideo.jp/watch/sm29131518
曲は、オリジナルはナナホシ管弦楽団さんの下記になりますが
https://www.nicovideo.jp/watch/sm26099756
今回は人の歌声にしたかったので、柊優花さんの下記を使わせていただきました。
https://youtu.be/1n5FL9eOefg
すばらしい作品を作られたhinoさん、ナナホシ管弦楽団さん、柊優花さんに感謝します。
上記のモーションファイルはMMDで使うためのものなので、そのままでは使用できませんが、Unityのアニメーションに変換することが可能です。変換方法や使用方法については、検索すれば出てくるので割愛させていただきます。
ビートセイバーでは独自のシェーダーが使われており、Bloom設定をオンにすると、ビートセイバー用に書かれたシェーダー以外が使われたモデルは、真っ白に発光してしまう問題があります。
簡単な対処法としては、使われているシェーダーを、ビートセイバー対応のものに置き換えます。CustomSabersなどを作るためのUnityプロジェクトに入っている、BeatSaberで始まる名前のシェーダーがそれにあたります。
ただ、わたしは無駄にこだわるほうで、元の見た目に忠実に表示されるようにしたかったので、アバターに使われているMToonシェーダーを、ビートセイバーで正常に映るように改変して対応しました。と書くと簡単にできたように見えますが、シェーダーはよくわかっていないので、納得のいくものができるまでに試行錯誤でだいぶ苦労しました。
twitter post: 1339956195541491712
ちなみに、VMCAvatarMaterialChange modで使われているのも同じ技術です。今回はVMCAvatarで動かすアバターではないですし、VMCAvatarMaterialChangeが入っていない環境でも動作させるため、自力でなんとかする必要がありました。
ビートセイバー内にアバターを持ち込む方法は二つあって、ひとつはVRM形式、もう一つはAssetBundle形式(Unityのオブジェクトをまとめた形式)を使う方法です。VMCAvatar modは前者、CustomAvatars modは後者ですね。今回は一般配布することもあって、VRMで取り出せる形にはしたくなかったので、AssetBundle(のCustomAvatarsとは別の独自形式)を使います。
ですが一つ問題があって、AssetBundleにはスクリプトが入りません。どういうことかというと、VRMのアバターをAssetBundleに入れると、SpringBone(揺れ物)とBlendShape(表情)が一切動かなくなります。下の動画みたいに。
twitter post: 1338594583194681344
この問題は、必要なスクリプトを全部modに持たせて、そちらで処理して対応することになります。CustomAvatars modもたぶん似たようなことをしていると思いますが、あちらはVRMのアバターがベースではないので、実装自体はだいぶ異なるはずです。
VRM関連スクリプトをmodに入れる仕組みは、揺れ物に関しては、比較的思った通りに動きました。
twitter post: 1338799283034677248
が、表情のほうはかなり苦労しました。エラーメッセージも何も出てこず、ただ動かない、という状態が続いて、原因を探るにも総当たりで対処するしかなくなりました。
twitter post: 1339149246197420032
結局原因は2つあって、1つ目は、UnityのバグなのかUniVRM(VRMのUnityアセット)のバグなのかはわかりませんが、AssetBundleにするとBlendShape(表情)が全部初期化されていたことです。初期化されて重みが0の表情を適用させても、表情は何も変わらずエラーも出ないんですね。
2つ目の原因は、UniVRMがいつの間にか互換性のない仕様変更をしていたことでした。わたしは表情を変えるのに、自分で作った表情制御のライブラリを使っているのですが、これが仕様変更のせいで動かなくなっていました。(でもエラーは何も吐かない)
原因が2つもあったので、原因を見つけて直したつもりなのにやっぱり動かない、という状態で、本当に途方に暮れました。このダンスは表情がキモなので、最悪、全部ボツにすることも考えましたよ!
twitter post: 1339253867733651456
ごめんなさい!とりあえず前編はここまでです。
次回、後編ではダンスモーションに合わせた譜面の生成について書きます。
また後日!