😺

カズサVR作ってみた

2025/01/29に公開

作ったもの

制作記録

備忘録兼ねて、制作記録を残します。

2025年1月17日~19日に、ブルアカふぇすが開催され、そこでVRコンテンツの施策がありました。

VRコンテンツは去年もあって、去年もVRコンテンツを作りたいなと思っていましたが、結局作れませんでした。
今年こそは作りたいなと思っていたので、今回は2回体験し、体験後はできるだけ内容をメモしていました。

ふぇすが終わった20日から26日まで制作に取り掛かりました。
主に夜の2~3時間の作業時間でした。

内容は、できるだけ本家を再現したかったのですが、それは難しいので、もっとも印象的だった、頬に手を当てるスキンシップの部分の再現にしました。

アセットの選定

まずはアセットの選定。

カズサのモデル

まずカズサのモデルを探すところから。

カズサのモデルは、月琴かりん様のこちらのモデルを使わせていただきました。
キャラクター3Dモデル「カズサ(ブルーアーカイブ)」(AloMarron)の通販・購入はメロンブックス | メロンブックス

21日に取り寄せの手続きをして、26日に届くまでの間は、仮のモデルを使っていました。

シャーレオフィスのモデル

続いてシャーレオフィスのモデル。
tihi shop様のこちらのモデルの有料版を使わせていただきました。
【無料】シャーレオフィス 【漫画用3D】 - tihi shop - BOOTH

シェーダー

シェーダーは、UnityURPToonLitShaderExampleを使わせていただきました。
GitHub - ColinLeung-NiloCat/UnityURPToonLitShaderExample: A very simple toon lit shader example, for you to learn writing custom lit shader in Unity URP

URPでトゥーンシェーダーを使いたいときは、毎回使わせてもらっています。

モーション

モーションは、最初はMixamoを使う予定でした。
実際、いくつかモーションを使いました。


ですが、あまり求めていたモーションがなかったことと、頬に手を当てるモーションはさすがになかったので、他のアプローチもとることにしました。

ボイス

ボイスは当初はなくてもいいかなと思ったのですが、やはりほしくなったので、追加しました。
やはり本家のボイスがほしかったので、「先生、今週もお疲れさま、です」のショート動画を検討していましたが、最終的にはゲーム内ボイスの「戦略勝利2」の「先生」の部分を使用しました。

制作風景


今回はUnity 6000.0.34f1のVRテンプレートを元に制作しました。
今回はビルドはせず、Quest2をQuestLinkで接続し、エディタで再生していました。

苦労したところ

モーション

やはりモーションが一番苦労しました。
元から複数のアニメーションをブレンドしようとは思っていましたが、Mixamoのモーションが元々顔が横方向に向いていて、うまくブレンドさせるのが難しかったです。
今回でAvatarMaskの使い方がなんとなく分かった気がします。

ここ、緑か赤かいつも分からなくなる…

それと、頬に手を当てるモーションはmocopiで収録することにしました。
mocopiは最近PCアプリがリリースされたので、これを使うことにしました。
ですが思ったより精度が出ず、これまた苦労しました…
そもそも、両手を合わせること自体が難しい…(手がクロスしてしまう)
最初は全身モーションの録画にしようと思いましたが、いい感じの座りにならなかったので、途中から上半身集中モードで収録していました。
ですが、上半身集中モードで改善されたのは肘の曲がり具合ぐらいで、精度自体はあまり変化がなかったです。

近々mocopi Proなるものがリリースされるようなので、試してみたいですね。

結局、mocopiでもいい感じのモーション収録は難しかったので、IKを使うことにしました。

今回、カズサがずっとこちらを向いてほしかったので、FinalIKのLookAtIKを使っていました。

そこで、後半はFullBodyBipedIKも使って、頬のあたりに手が固定されるようなIKを試しました。

仮のモデルではうまくいっていたのですが、本番のモデルではちょっとうまくいかず…
仮のモデルは身体と服が一つのメッシュだったのでうまくいっていたのですが、身体と服が別メッシュになっている場合、腕はIKで動くのですが、服の袖がついてこず…
結局、Unity標準のIKを使うことにしました。

public Animator animator;    // キャラクターのAnimator
public Transform Target;
public Transform LeftHandTarget;     // 手を追従させるターゲット
public Transform RightHandTarget;     // 手を追従させるターゲット
public Transform ChestBone;
public Transform LeftFootTarget;

private void OnAnimatorIK(int layerIndex)
{
    if (animator == null || LeftHandTarget == null) return;

    // IKを有効にする
    var weight = animator.GetLayerWeight(4);
    animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, weight);
    animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, weight);
    animator.SetIKPositionWeight(AvatarIKGoal.RightHand, weight);
    animator.SetIKRotationWeight(AvatarIKGoal.RightHand, weight);

    // 手の位置と回転をターゲットに追従
    animator.SetIKPosition(AvatarIKGoal.LeftHand, LeftHandTarget.position);
    animator.SetIKRotation(AvatarIKGoal.LeftHand, LeftHandTarget.rotation);
    animator.SetIKPosition(AvatarIKGoal.RightHand, RightHandTarget.position);
    animator.SetIKRotation(AvatarIKGoal.RightHand, RightHandTarget.rotation);

    if (ChestBone != null)
    {
        var direction = Target.position - ChestBone.position;
        var targetRotation = Quaternion.LookRotation(direction);
        
        ChestBone.rotation = Quaternion.Slerp(ChestBone.rotation, targetRotation, weight);
    }
}

Unity標準のIKは悪くないですが、腕に合わせて胴もある程度動いてほしい…

mocopiで収録したモーションはまったく無駄になったわけではなく、
ほんの少しブレンドさせることによって、モデルが完全に静止せず自然な動きに近くなることに気づきました。

フェード

最初と最後に黒フェードを入れたいなと思っていました。
まぁフェードくらいすぐできるだろうと思っていましたが、意外と苦労してしまいました…
ポストプロセスで実装してみたものの、エディタ上ではフェードされるがHMDではフェードされない事態に…
結局間に合わず、フェードは後の動画編集で入れることにしました…

後日改めて調査したところ、Unityのドキュメントを発見し、このコードを使うことで、フェードが使えるようになりました。

最後に

最初は、なんとなく作りたいなー程度でしたが、本家カズサVRのインパクトがすさまじく、現実に帰ってこれない先生が多発反響がすごかったので、だんだん作りたい気持ちが増していきました。
なるべく話題がホットなうちに作りたいと思っていましたが、
私は大抵は完成させられない性格なので、今回は絶対に1週間でリリースするぞという気概で作りました。

未だに前回のセミナーVRが作れなかったことに未練があるので、今回を糧にして作るのもアリかなと思っています。

Discussion