Unityで美少女JKを召喚し、赤スパを投げて優勝した話【ICONサマーブログリレー2020 6日目】
この記事はICONサマーブログリレー2020 6日目の記事です。
はじめに
おはようございます。今年度プロ班班長のCrepeです。サマーブログは初参加でございます。見苦しい点もあるかと思いますが、ご容赦ください。
さて、今回は供養も兼ねて、私の趣味に捧げた数か月間(まぁ大学の授業もあったので実際はそんなに長くないですが)の有様を垂れ流そうという趣旨でお送りいたします。ふわっと概要を紹介するだけなので、内容はないです。(書きたいことしか書いてない)気楽に見ていって下さい。
なお、今回の記事では細部をすっ飛ばしているので、もし真似して再現したいとなると、ある程度はUnityの基本的知識が必要になります。予めご了承ください。
では、参りましょう。
美少女JKを召喚する。
本記事は健全なコンテンツです
ということで、美少女JKを召喚して優勝していくことにするわね。字面だけ見ると隠語感がすごくて、犯罪の臭いがしてきますが、ICONは健全な組織です。万が一、私が人道を外れたときは、会長に私の息の根を止めて貰うよう約束を(一方的に)しています。安心ですね。
まあ、こんな感じの物を目指します。※画像はイメージです。*1
(ステージはユニティちゃんライブステージ! -Candy Rock Star-を使用しています。)
今回、使用する3Dモデルは、カバー株式会社が運営するVtuber事務所『ホロライブ』所属、夏色まつりさんのMMDモデル(© 2019 cover corp.)となります。著作権表記はここでよいのか、戦々恐々としております。
このモデルは公式が提供しているモデルです。公式が二次創作に寛大で助かります…。
そしてまぁ、本人が美少女JKといっているのできっと美少女です。というか普通にかわいいと思います。ホロライブのヤベー奴。ひとまず、本記事の趣旨の一つ、赤スパで殴るならこの方でしょう。
ちなみに、この記事はホロライブ二次創作ガイドライン、および、ファイルに添付されているReadmeにしたがって執筆されています。(万が一ヤバそうな点があればこっそり教えてください。美少女JKが初音ミクさんにすり替わることでしょう。)
御託はここまで、いざ実装です。
UnityにMMDモデルをインポートする
同じ手順でやればできます、読んで。(丸投げ)
ひとつ付け加えますと、上述の方法では踊るモデルが大きく動く場合、つまりフォーメーションの変化があるモーションなどは後述するCollider(当たり判定)がうまくモデルに追従しませんでした。
Blenderを用いてインポートする方法なら問題ないと思われますが、上述の手順に従うなら、位置の変化の少ないモーションデータ(上の記事で用いているものなど)を使うことをお勧めします。
赤スパを投げる
赤スパとは
YouTubeで活動なさっているVtuberさんの方々が主に提供するコンテンツにYouTube Liveによる生配信があります。生配信では、我々視聴者もチャット機能を用いてライバーとほぼリアルタイムで対話をすることができます。
そして、そのチャットの文章と一緒にお金を投げられるシステムがあり、これが「スーパーチャット」と呼ばれるものです。チャット欄で自分のメッセージを目立たせる権利を購入できる機能なのですが、要は投げ銭というやつです。
このスーパーチャット、通称「スパチャ」は投げた金額に応じて色が変わり、1万円以上で赤色となります。これが赤スパと呼ばれます。
最近、この赤スパを大量に投げつけることで、ライバーの反応を楽しむという石油王たちの遊びがたまに見られます。今回モデルに使用する夏色まつりさんも、この被害者(?)であり、この記事で作るゲームの元ネタになります。
赤スパを投げる(物理(演算))
ということで、まずは下準備から始めていきましょう。とりあえず、ない袖は振れぬと申しますし、お金のモデルを用意するところから始めましょうか。Asset Storeを漁るなり,自分で作るなりご自由に。RigidbodyとColliderは必ずくっつけておいてください。
今回は札束をなげます。紙をなげたときの軌道計算とか無理です。「スパチャの上限5万円だぞw」「ドル札じゃんw」「剛体に逃げるな」など様々な声があると思いますが聞こえません。
次に、仕様を考えていきます。今回理想とする挙動は
1.画面をタッチしたら「赤スパ」が出現する。
2.そのまま、ゆっくり指を動かすとそれに「赤スパ」が追従する。
3.素早くフリックすると、「赤スパ」がその方向に飛んでいく。
とします。言い忘れていましたが、今回はAndroidデバイス向けに作るので実機としてスマホを想定しています。
実装のポイントとなるのは、画面上の指の動きという二次元の動きをどう三次元の動作(今回は前方に赤スパを投射すること)に結び付けるか、スワイプとフリック入力をどう区別するか、の2点です。何はともあれ、コードを書きます。
コードを見る
(ど素人なのでいろいろと見苦しい点があります。予めご了承ください。)
はい。細かい部分はコードのコメントを読んでもらうとして、要点だけ。
まず、画面をタップすると、「赤スパ」が出現し、その画面上の位置と時間をそれぞれstartPosとstartTimeに記録します。そして、画面から指を話すとその位置と時間がendPosとendTimeに記録され、startPosとendPosはともに2次元ベクトルなので、差をとることでフリックした方向が得られます。今回はフリックした長さも飛距離に考慮したいので、単位ベクトルへの変換はしないでおきます。また、startTimeとendTimeからフリックにかかった時間も得られます。長さ(正確には変位)と時間が得られればフリックの速度がわかりますね。
あとはこれをどの程度挙動に反映させるかをthrowForceInXandYとかsensitivityとかの変数で決めて、モデルに力を加えて前方に飛ばします。
一応放物線を描いているように見えますが、厳密には下図のような軌道を描いています。まぁ、違和感はほとんどないのでよしとします。
次に、スワイプとフリックの区別ですが、意外とこれが曲者です。例えば、指をスワイプし続けそのままフリックした場合、どこまでがスワイプで、どこからがフリックなのでしょうか。フリックの速さや距離を「赤スパ」の飛距離に影響させたいので、できるだけ正確な、あるいは違和感の少ない判別方法をとりたいところです。
今回は、flickTimeという変数を設け、タップから指を離すまでの時間がこの値より小さい場合のみフリックとみなすことにし、flickTime(秒)経過するごとにstartPosとstartTimeを更新します。この方法だと、必ずしも正確なフリック入力の情報が得られるとは限りません*2が、まぁ、違和感はほt(ry
このコードを適当に空のGameObjectに貼り付けて、InspectorのmoneyModelに赤スパのPrefabをドラッグ&ドロップしましょう。あとは適宜Inspector上で値を変えて微調整してください。「赤スパ」のRigidbodyの値を変更するのも有効です。
優勝する
というわけで、目の前に美少女JKがいて踊っています。そして、我々は札束を投げられるようになりました。まぁ、カメラの位置とかは各々で何とかしてください。あとは、MMDモデルにColliderをつけて、衝突時の処理をスクリプトに書いて、ParticleSystemとかつければそれっぽくなります。
下のgifでは、joystickを付けたり、スマホのジャイロセンサーで視点が動かせるようになっています。流石にこっちは参考記事を後述します。ステージなんかなかった。いいね?*3
あとがき
いかがだったでしょうか。これ作ってる方は楽しいんですけど、果たして読者に伝わっているのか…?
Unityは慣れると色んな機能が実装できて楽しいですね。情報量も多いので、やりたいことがすぐ実現できます。気力と時間があれば…ですが。
みんな!Unity!やろうね!
次に何か書くときまでにもっと文章力を磨きたい…。また、ご縁があればお会いしましょう~。
参考記事