この記事は 新歓ブログリレー2022 27日目の記事です。
まず実装した結果どんな感じになったかを挙げときます。(音声後付け)
はじめに
この記事をご覧いただいている方は、つい最近受験戦争を終えた方が多いと思うので、肩の荷を下ろして楽しんでいただけると幸いです。ひとまず合格おめでとうございます!
さて、自作ゲームについてですが、現在弾幕ゲームとRPGを合わせたようなゲームを個人的に制作しております。そしてあるとき、ジョジョ5部の動画を見ていて、キングクリムゾン/エピタフの能力はこのゲームに埋め込めるのではないかと思いつきました。その実装の紹介をするのが今回のブログとなっております。
以下はキングクリムゾンの説明になっているため、知っている人は飛ばして下さい。
キングクリムゾン/エピタフとは
ジョジョという漫画/アニメに出てくる能力の名称。
ジョジョの説明は割愛。
能力説明↓↓↓(このサイトより引用。)・キングクリムゾンのスタンド能力は基本的に「 時を消しとばす 」ことに由来する。
・すこし先の未来を見るエピタフ / 墓碑銘。
・また、エピタフ / 墓碑銘で見た都合の悪い未来を消しとばし、別の選択することでなかったことにできる。
・能力範囲内にいる人間たちの時間を飛ばすことにより、××をした記憶なしにいきなり××をした状態になっている。
能力説明を要約すれば、
・少し先の未来が見える
・時を飛ばせる
となりますが、時を飛ばすというのがわかりずらいと思うので公式説明を載せます。
簡単に言うと「時間」を飛び越えることができる。
正確に言うとこの世の「時間」を十数秒消し去り、
その中を自分だけが動くことができ、
他人の動きを予知するように見ることができる。
時間を消された、この世のすべての人間や生き物は、
その時間を体験しておらず、記憶はもちろんない。
時計の針や飛ぶ鳥は瞬間移動したように見え、
読んでいた本もどこまで読んだのか覚えていない。
(コミックス56巻扉ページより)
目次
開発環境
OS: Windows 10
ゲームエンジン: Unreal Engine 4.26.2
Unreal Engine 4とは
個人から企業まで広く使われている無料[1]のゲームエンジン。主に3Dゲーム制作に用いられ、Unityとの差別化は、画質の差やプログラミング言語(UE4はC++)などでなされる。(略称はUE4)
現在UE5に早期アクセス可能ですが、英語コミュニティばかりなので英語できない人(私)はとりあえずUE4を使っておけばいいと思います。
UE4を使う上で必要不可欠なサイト↓
質問サイト: https://forums.unrealengine.com/c/international/japanese/64
UE4のC++のチュートリアルに役立つサイト: https://unrealengine.hatenablog.com/entry/2014/09/13/162126
あとはggr。
オススメの本↓
Unreal Engine 4 で極めるゲーム開発: https://www.borndigital.co.jp/book/6359.html
ゲームの進捗紹介
まず、今回キングクリムゾン/エピタフを実装するゲームの制作状況を紹介をします。
RPG要素
・RPGエリアで敵にエンカウントすると、敵との戦闘エリアへ飛ばされる
・RPGエリア(2つの立方体は手前からそれぞれプレイヤー, 敵。3Dモデルはまだ用意できていない。)↓
・敵を倒し、経験値を得て、レベルアップすればステータスが向上するシステムを作った。
・戦闘エリア↓
・アイテムを実装した。
・スキルを実装した。
・一定時間ごとに"行動"できるようにした。行動選択中は時間の流れが1/100ぐらいになるようにした。
現状では、アイテムの使用, スキルの使用だけだが、後に防御や逃亡などの行動も実装しようと思っている。また、敵も一定時間ごとに行動してくる。
STG要素
・戦闘エリアの画像のように、様々な弾幕を実装中。
キングクリムゾン/エピタフの実装
以下本題です。
発動演出の実装
原作では、キングクリムゾンが発動した直後、床や壁が粉々になって宇宙のような場所へ飛ばされる演出が入ります。これを再現します。
Destruction Meshの使用
UE4には、スタティックメッシュ(変形しない3Dモデル)を粉々にしたモデル(Destruction Mesh)を生成する機能があります。これを利用して、発動演出を作りました。
レベル構成
基本的には、RPGエリアにいるとき、戦闘エリアのモデルを描画する必要はありませんし、その逆も然りです。そこで、UE4では、レベルを用いて、演算するものを決定しています。具体的には、このゲームでは、"RPGMap", "FightMap"という名前のレベルを用意しており、"RPGMap"でエンカウントすれば"FightMap"に飛び、それ以降は"RPGMap"についての演算はせず、"FightMap"についての演算をするという具合です。さらに、UE4では子レベルを作ることも可能です(孫以下のレベルは無理)。ここで、キングクリムゾンが実際に使われる"FightMap"のレベル構成について説明します。
パーシスタントレベルというのが親レベルで、他2つが子レベルです。パーシスタントレベルは常時描画し、キングクリムゾンが発動していないときは"FightMap_NotKingCrimzon"も描画(もう一方は描画しない), "FightMap_WhenKingCrimzon"も描画(もう一方は描画しない)するようにしました。ここで、キングクリムゾンの発動/終了の度に子レベルをload/unloadしていては、その度にカクついてしまう(∵レベルのload処理はとても重い)ため、"FightMap"に遷移した時点で子レベル2つともメモリにloadしておき、発動/終了の度に可視性を切り替えるようにしました。ただし、デメリットとして、メモリ容量を多く使うということが挙げられます。
パーシスタントレベル+FightMap_WhenKingCrimzon↓↓
緑色の床がDestruction Meshで、キングクリムゾンの発動後粉々になります。
時飛ばしの実装
今のところプレイヤーが時を飛ばす側なので、プレイヤー視点では時は飛んでおらず、敵視点では時が飛んでいることになります。そのため、キングクリムゾン終了後に敵に混乱などの状態異常を付与すれば再現できたといえるでしょう。
ただし、敵側がキングクリムゾンをする場合については、まだ実装できていません。
少し先の未来が見えるようにする
これの再現が一番大変だと思われます。原作では、発動者以外の未来の位置が以下のように見えるようになります。また、アニメでは発動中スローになっているため、ゲームでは時の流れる速さをにしました。
©荒木飛呂彦&LUCKY LAND COMMUNICATIONS/集英社・ジョジョの奇妙な冒険THE ANIMATION PROJECT
この再現として、kフレーム後, 2kフレーム後, ... , nkフレーム後の位置に、赤色の線画を描画します(それぞれの描画にSetActorTransform系関数[2]を使う)。ただし、毎フレーム未来の位置を計算していると、弾幕がm個あるとき、1フレーム当たりmn回SetActorTransform系関数が使われることになり、ボトルネックとなります。この対策として、時刻tから見てkフレーム後の位置に到達したら、その赤色の線画を時刻tから見て(n+1)kフレーム後の位置に移動するように実装すれば、1フレーム当たりm/k回で済みます。
先ほど、~フレーム後の未来の位置を計算すると言った通り、未来の位置が予測可能なActor(3D空間上に存在するモノ)は、"Nフレーム後の位置を返せる"という性質を持つ必要があります。ここで、どのようなActorの未来の位置が予測可能かについて考えます。
- 等速運動
- 等加速度運動
- 時刻tにおける位置座標が、で表される運動
- その後のプレイヤーの動きによって変化する運動
1は2の加速度が0の場合ですし、2は、3のが
・・・① (は定数)
の場合なので、表現力は1.<2.<3.となります。また、1と2のは、①より、で計算可能(とにかく計算速度が速い)のため、実装可能といえます。
3については、の計算にとても時間がかかるようなもの(例えばなど)はボトルネックとなり得るため実装できませんが、のだけでも十分な表現力があります。そのため、のに限って実装することにしました。
4は、例えばフリーザの気円斬(?)のような、プレイヤーに追従する攻撃が考えられますが、プレイヤーの動きは予測不能なため実装は不可能です。
1↓↓↓
弾が多い場面で未来が見えすぎる(赤色の予測が多すぎる)と、かえって訳がわからなくなるため、そのような場合は少しだけ先の未来が見えるようにしました。
2↓↓↓
3↓↓↓
弾の速さが大きい場合、少しだけ先の未来が見えてもあまり意味がないため、そのような場合はかなり先の未来が見えるようにしました。
今後
現在予測できているのは「位置」についてだけですが、今後球形でない3Dモデルの攻撃を実装するとき、未来における「姿勢」も予測しないといけないです。また、変形する(≒アニメーションデータをもつ)キャラクターの未来を予測するためには、位置, 姿勢に加え、Nフレーム後のアニメーションを取得できる必要があるため、実装を見直す必要がありそうです。
また、キングクリムゾンなどの特殊能力のように、他の多くの実装に影響を与えるものは、先に作っておいた方が開発効率が良さそうだと感じました。そのため、ザ・ワールドなども今のうちに作っておこうと思います。
さいごに
1つの作品を完成させることが最も大変なので、大学生のゲーム制作において一番大切なのはモチベ維持だと思います。そして、モチベ維持に最も直結するものは、誰かにプレイしてもらうことだと思うので、今度ジョジョ好きの友人にプレイしてもらおうと思っています。
自分で作ったものを自分で遊んでみたり、誰かに遊んでもらうのはとても面白いことですので、是非やってみてください。
明日はdan_danさんです。よろしくお願いします。