【cluster】射撃ワールド制作録 第1章 銃の実装
note記事は初めてです、ガルペノです。
今日はバーチャルSNS「cluster」に投稿した弊ワールド「SHOOT'EM ALL!! 101」の制作についての解説などをやっていきます。
ちょっと残念なお知らせですが、あまり変なテクニックはありません。
公式解説記事を片手に(というか片モニターに)、一から自分でやってみたというだけの要素の強いワールドです。
名称に「101」とあるのも、射撃演習のイロハとしての101と、自分自身があれこれやってみるという101、単にバージョンが低いというので101など、つまりはそういうサクッとしたワールドです。
ですから、何か面白い使い方をしているとか、これを読んだら新しい知識が得られた!とか、そういった“公式リファレンス以上”をお求めになる方には少しばかり物足りないかもしれません。
https://cluster.mu/w/55344c5c-dc08-4aec-8408-3e637e8fc5d4
このワールドですが、3回ほどアップグレードしています。
現在は野原のスカイボックスに8m四方くらいの床とヤグラ付きのステージになっています。
今後もアップグレードするかもしれません。
アップグレード後に特筆すべき点があれば、追加していくと思います。
記事は全3章で構成します。
まずプレイヤーがアイテムとして持つことのできる銃について。
次に弾が当たった際に倒れたりする的について。
最後に来訪者への親切を図るプレイアビリティについてです。
前章として、暴力表現に対するワールド制作者:ガルペノの立場見解を表明します。
第0章 暴力と悲劇の廃絶に向けて
私:ガルペノは、バーチャルSNS空間で銃を多数射撃する目的のワールドを制作しました。
しかし私はこのワールドで、銃乱射や実制圧力の濫用による暴力行為、及びそれによって引き起こされる悲劇を望むものではありません。
ミリタリー趣味として代表される銃器、兵器、武装といった軍事・軍備は、“大切な誰かから大切な何かを奪い去る力”であることを常に忘れてはなりません。
生命、財産、幸福、日常、生活、愉しみ、笑顔。
そういった尊いものを、照準越しに破壊する、それも非対称的に一方的に破壊する力が軍事であり、それに憧れる心がミリタリーです。
核兵器の廃絶や銃規制の取り組みが遅々として進まないのは、それらが最終的には人々の善性を信じることでしか終止符を打てないという脆弱性にあります。
だからこそ、ヒトの感情の暴走から、心の弱さから始まった武装を、敵対感情の制御、人間の心の強さで終わらせなければならないのです。
上記を以って、このワールド紹介記事の前文とし、弊ワールド「SHOOT'EM ALL!! 101」の通底理念と致します。
当ワールドで意図的に他のアバターに銃を向ける行為は禁止しております。
第1章 銃について
冒頭から辛気臭くなりましたが、ガルペノの平生は頭ハッピーセットです。
おちゃらけていきましょう。
まずは銃のメッシュやマテリアル設定から、次にインタラクトされたら弾を撃ち出す仕組みについて、順を追って解説していきます。
第1章 第1節 銃のメッシュ
当ワールドの銃は現在、2種類あります。アサルトライフルタイプと、スナイパーライフルタイプです。
以下、アサルトライフルはAR、スナイパーライフルはSRと略記します。
それらに加えて観測用の単眼鏡もアイテムとして設置してあります。
今後は早撃ち用のハンドガンを追加しようかと考えていますが、手元にデータがなくてフルスクラッチするのに時間かかるなあという感想です。
(アセットを使えばいいという思想は、ガルペノにあんまりありません。欲しい者は自分で創るという、効率の悪い人間です)
あ、スクリーンショットに写し損ねましたが、空薬莢もオブジェクトデータとしてあります。
元々は現在制作中の自主制作アニメのモデルデータだったものから改変したオブジェクトです。
STG44のパクリにちょっと失敗したAK47みたいな風貌です。
SRのほうを冷静に見てみたら、ライフルストックにピストルグリップがついているという、なんでやねんどっちかにせえよというツッコミが出てきますね。
アニメではモブキャラが持つ銃だったので、ポリゴン数を抑えてあります。
空薬莢は特に大量に描画される見込みが高く、なおかつ小さい物なので円柱のところを六角形に抑えています。
ただし、スコープについては接眼のために一人称視点でカメラにかなり近づくことが想定されたので、円をそれなりに割っています。十六角形でした。
しかし実際の画面では接眼部以外がめっきり隠れてしまうことが判ったので、接眼部以外はもうちょっと角数を減らしてもいいかなと今おもいました。
今回のゲームワールド投稿にあたって、いくつかのメッシュをパーツ分けしました。
特にこだわりとして外せなかった、ボルトスライドの後退を実現するためにも、これをやっておいてよかったと思います。
UV展開は、後述するスコープ投影のレンズ部分以外、まともに開かれていません。
これは、マテリアルカラーだけで質感表現するという元のアニメの仕様だったことと、今回unityでインポートする際もテクスチャでリッチに仕上げる予定がなかったためです。
第1章 第2節 第1項 弾の発射機構
こちらがunityにインポート後、諸々の設定を済ませ、晴れてプレハブ化された銃たちになります。
ちょっとサウンドとカメラのコンポーネント表示がえらい邪魔してくれてますので、個々の銃にフォーカスして解説していきます。
スコープに関しては毛色が少し異なるので最後に解説します。
アサルトライフルのプレハブです。
階層構造としては、
エンプティ↓
銃本体↓
レーザーサイト,ボルトスライド,持ち手のエンプティ,銃口のエンプティ,排莢のエンプティ
となります。
レーザーサイトはクロスヘアの代わりとして取って付けた感満載で、今のワールドでもまだくっついてます。
本当は銃本体とボルトスライドはリグのボーンで簡素に制御したかったのですが……
なんでか知らんけどやったらめったら輪郭線がでかくなる、でっかくなるというかワールドを覆い尽くしてしまう不具合が発生。
結局これに一時間くらい格闘。
こういう時のためにcluster Discordに入ったはずなのに、質問が細か過ぎて伝わらない選手権で登りつめるのが怖くて、自己解決させました。
結論としては、メッシュごとにパーツ分けしてアニメーションを付けました。
他のリグ付きアイテムでは起きないので多分、インポート前のモデルデータの不備かなと思います。
発射機構ですが、ぶっちゃけこれはほとんど公式リファレンスと変わりません。
せいぜい、弾と一緒に空薬莢を発生させてて、同時に射撃音も鳴らす追加くらいです。
じっと見てると、[Up Triggers]が何もなくて勿体無いですね。
せっかくなのでここにも「fire」信号を出して、トリガーを押した時・離した時それぞれで発射させると面白いかもしれません。
押してすぐ離したらダブルタップトリガーになります、2点バーストです。
(・追記 2点バースト銃、アップデートで実装しました)
アサルトライフルの方は、押している間に連続で弾が発射されるようなフルオート機能を追加したいと考えていますが、まだ手探りでよく解っていません。
次に行きます。
上記の「Bullet_Emitter」から生成されて、飛んでいく弾です。
コライダーは弾丸と同じくらいの大きさにしていますが、可視強調としてメッシュがその何倍も大きいです。
最初はよくある銃の軌跡としてZ軸上に伸びたSphereでしたが、弾道を観測するためにかなりおデブになりました。
・追記
発射された弾は、現実では遠近法に従って見た目では小さくなります。
しかしこの度、遠近法に逆らう錯覚を実装しました。
仕組みはシンプルに、弾の発生と同時に拡大されてゆくキーフレームアニメーションです。
比較gifじゃないので違いが判りにくいですが、遠ざかるにつれて小さくなる遠近法に対し、次第に拡大されてゆくアニメーションで対抗しています。
これによって、弾道の観測をより見易いものにします。
ただし、ここでは見た目上拡大するメッシュと、拡大されないままのコライダーを分離しています。
そうでないとコライダーも遠近法に反して拡大されるためです。
プレイアビリティの考慮で、さくさく弾を当ててストレスフリーを目指したい場合はコライダーと共に拡大しても良さそうですが、このワールドでは判定をかなりシビアに設定しているため、コライダーの大きさは変動しません。
・追記終わり
弾丸の仕組みも公式とほぼ同じです。
Rigidbody項目の重量や空気抵抗、[Add instant Force Item Gimmick]項目のForce値(ぶっとばされる速度)で弾道と初速を制御します。
Force値は1秒あたりの移動距離なのか、その辺りまだよく解っていません。
スナイパーライフルから発射される弾丸については、長銃身のため集弾率が高い一方、大口径のために空気抵抗の影響を強く受けるとか、そういうのにしてみたかったのですが、風に関してはまだうまく実装できてないです。
続いて銃の反動アニメーションと、弾道のブレです。
第1章 第2節 第2項 反動と弾のばらけ
(こうして見るとSRのピストルグリップますます変だな……)
(・追記 ピストルグリップを廃して、ちゃんとしたライフルスコープに置き換えました)
銃の反動、とりわけボルトスライドについては、このワールドで一番推したい部分でもあります。
前述した通り、ボルトスライドのアニメーションは、リグ付きアイテムの輪郭表示が変になるというのをメッシュパーツに分解することで強引に解決させました。
ここではこれらを個別にアニメーションさせてます。
第2章のフライングになりますが、ここでは自身の「fire」key(Down Trigger)を受け取ることで、[Animation Parameter Name]「firing_anm」を設定。
遷移は、通常時はEmpty(Wait)、「firing_anm」のTrigger値を受け取ったら反動のアニメーション(Anm_Handou)に移るという形です。
よくよく見たらこれ、反動アニメーションの終了後に「Wait」へ遷移してないからアカンやつなんやろうけど、「Anm_Handou」の最後のキーフレームでトランスフォームのデフォルトに戻ってるからぎりセーフというところか。
もし射撃していない時に何かしらアニメーションを付けている場合は、ちゃんと設定しておかないと駄目なやつですね。
弾の発射用エンプティ「Bellet_Emitter」を銃本体にペアレント化しているので、反動とともに「Bellet_Emitter」の位置や向きも動きます。
これによって、反動が収まる前に次弾を発射すると反動でぶれ上がった方向に弾が発射されます。
これはスナイパーライフルで特に顕著であり、SRの反動が収まる挙動は、ARの反動が収まる挙動よりも時間がかかるようになっています。
この反動アニメーション遷移、ぶれ上がった状態で再度呼び出されると、アニメションを置換でなく追加する(さらに角度がぶれ上がる)仕様にしようかと考えましたが、どこかで限界の角度を設けないとX軸でぐるんと回ってしまう、手がありえない方向に曲がっちゃうので、このままでいいかと納得しています。
続いて、集弾率の悪いAR用に、弾をばらけさせるアニメーションです。
仕組みとしてはシンプルに、弾の発射用エンプティ「Bellet_Emitter」を常時こんな感じでごそごそ動かしています(Creator Kitのバージョンアップで、コンポーネントに関連づけられたEmpty類が可視化されて助かりました)。
これによって、射撃のたびに方向がばらけるようになります。
単純な集弾率は、このごそごそ回転の角度の大きさで決められます。
初めは射撃の度にランダムで角度を与えたりとかするべきかなーと本格的に考えていましたが、こんな感じで割と滑稽な仕組みでもある程度は形になりました。
しかし、これはいつどのタイミングで撃っても同じ集弾率になります。
したがって、連射ではない初弾から、こんなてんでばらばらに飛んでしまいます。
これは銃の精度というより、銃の手入れが悪い、銃口に何か詰まっているような挙動です。
理想としては、初弾でごくわずかなばらけがあり、反動の抑制を待つより先に撃つ、そして連射するにしたがいもっとばらけていく、という感じです。
ここまで拘ろうとすると、弾の発射用エンプティをごそごそさせるのではなくて、銃の持ち手エンプティからきちんと反動を管理させないと難しそうです(というか現実の銃の反動はそういうもの)
この辺りはアニメーション遷移のレイヤーとかブレンドを使えばなんとかなるでしょうか。
ノードを繋いでいくビジュアルプログラミングぐらいしか経験のないunityよわよわ(というかUnrealEngineを触った時間の方が長い)なので、もっと勉強が必要です。
第1章 第2節 第3項 排莢
ほぼ全ての銃砲は、弾薬から弾丸を撃ち出すと、薬室に残った空薬莢を排出します。
排莢です。
射撃と同時に発生する、空薬莢です(本当は射撃後にボルトスライドが後退して薬室開放されたタイミング)。
こちらは弾丸の仕組みをアレンジしただけです。
発生後、[Add Instant Force Item Gimmick]によって-X方向に飛び出します。
これと同時に、イジェクターによって空薬莢が薬室から押し出された際に発生する回転を、[Add Instant Torque Item Gimmick]で設定します。
この[Add Instant Torque Item Gimmick]の値次第で、排莢時にどの方向にどれだけ空薬莢がくるぃーんと回るかを決められます。
・追記
排莢の発生元エンプティに、銃口ごそごそと同じアニメーションを設定すれば、排莢の飛び出す方向もランダムにできます。
割と万能ですね。
・追記終わり
ここからは悲しいお知らせです。
本来は、この空薬莢が何かコリジョンに衝突した際、カラカラッと音が鳴るはずでした。
このおかげで、いかにも銃!という印象を与えさせられます。
しかし、この機能は泣く泣くオミットされました。
空薬莢や弾丸は、生成したまま放っておくとどんどんワールドに滞留します。
デスポーン高度まで落下すれば問題はありませんが、そうでない場合はあちこちに転がって処理を重くします。
それを防ぐために[On Collide Item Trigger]と[Destroy Item Gimmick]で、何かにぶつかった瞬間消失するよう設定しました。
これによって、空薬莢が何かにぶつかった際、音を発生させる間もなく消えてしまうことになりました。
音の発生(Play Audio Source Gimmick)とデストロイどちらが優先されるとかではなく、デストロイ=音源の消失なので、衝突と同時に消失させてサーバーフレンドリーを取るか、サーバーに迷惑をかけてカラカラ音を鳴らすか、二つに一つなのです。
結局は音をオミットする方向で決めました。
発生からn秒後に消失する、とかできればどっちも取れますが、まだそのあたりは手探りで検討していきます。
・追記
転がる音を、空薬莢自身ではなく床などの衝突したオブジェクトを音源として発生させるのもありだとは思いますが、音の乗算ができない点と、3D Soundの実現が難しい点があります。
特に、人の聴覚は音の方向には敏感なのです。
またn秒後に消失させるというギミック、発生と同時にプレイヤーからは見えない位置にカウントダウン用のオブジェクトを生成し、その自由落下のタイミングで信号を発信、それを受信した空薬莢の実体が消失する、というややこしい手法ができるかもしれないですね。
もはや量子論。
実体を持っていると思い込んでいる我々も、実はどこかの宇宙を稼働させるための、虚像なのかもしれませんね。ひえ。
第1章 第3節 カメラスコープ
ずっと放ったらかしてきたスナイパーライフルのお話になります。
このワールドのスコープ類にはズームレンズ効果が適用されています。
仕組みはシンプルで、カメラから取得した映像をテクスチャに投影しています。
カメラから取得した映像をテクスチャに貼るテクニックは、サンフラワーふじ さんが紹介されているこちらの記事をいたく参考にさせてもらいました。
ただし、この方法はリアルタイムでカメラからテクスチャへレンダリングしているので、処理に負荷をかけてしまいます。
また、同じアイテムを複数設置する場合は、その数だけのレンダーテクスチャとマテリアルを必要とする上に、プレハブ化されている場合は個別に設定をいじらなければなりません。
つまり、厄介者たちです。
ですので、当ワールドではあまりスコープの数は増やさないようにしています。
実際のFPSなどでも、やはりプレーヤーとは別の視点の映像を同時に処理するのは面倒くさいものらしく、スナイパーのスコープ=ただのズーム視点であるとか、倍率x4のACOGサイトを覗いたら、サイトじゃなくて画面そのものがズームしているとか、昔から今に至るまでそういう処理をしています(尤も、倍率視点でエイムする=周りに注意が払えなくなる、というゲーム演出でもあると思います)。
このスコープ、VR視点だと自由に覗き込めるのですが、デスクトップモードだと画面に占めるスコープ範囲が小さすぎて、最初のバージョンではほとんど見れませんでした。
そのため、全てのスコープ類をデスクトップモードで覗きやすいよう、位置とサイズを修正してあります。
ガルペノは貧しいことにVR機器を持っていない・Windowsを持っていないのでVRでの視点を確認できません。
この点、VRでワールドを来訪された方から「スコープを覗きにくい」という声が既に出ていることを確認しております。
早急に、VRで遊ばれる方のための、トラッキングで覗き込むタイプのスコープを設置予定です。よろしくお願いします。
(・追記 VR用のライフルとスコープ、追加実装しました)
デスクトップモードにおける、手にしたアイテムと一人称視点の位置関係は、アバターの身長にや体格に関係なく、共通のようです。
一方では困る仕様ですが、このワールドにおいては利便に活用できました。
第2章 的の実装
予想以上に長くなってしまったので、第2章は別の記事に分けることにしました。
初めは愚直に全部同じ記事にまとめるつもりでしたが、ゲームワールドコンテストの解説キャンペーン的に分けたほうが得だなというのと、分けたほうが普通にリファレンスとして読み易くなるので、分けます。
以下のリンクから。
↓第2章 的の実装↓
https://note.com/galapa/n/n6f546e628e6e
この記事が気に入ったらサポートをしてみませんか?