Monster Tooth Studiosによる『Survivors Roguelike – Multiplayer Game Template』は、『Vampire Survivors』に代表されるゲームシステムを制作できるブループリントアセットです。
本稿では編集部員の体験をもとに、本アセットのUnreal Engine 5への導入方法とサンプルゲームの説明、キャラクターモデルの変更、そして新しい攻撃アビリティの追加例を解説します。
Monster Tooth Studiosによる『Survivors Roguelike – Multiplayer Game Template』は、『Vampire Survivors』に代表されるゲームシステムを制作できるブループリントアセットです。
本稿では編集部員の体験をもとに、本アセットのUnreal Engine 5への導入方法とサンプルゲームの説明、キャラクターモデルの変更、そして新しい攻撃アビリティの追加例を解説します。
TEXT / 田端 秀輝
EDIT / 神谷 優斗、田端 秀輝
『Survivors Roguelike – Multiplayer Game Template』(以下、本アセット)を使用することで、大量の敵のスポーンやレベルアップに伴うスキルの強化、ゲームオーバー時に付与される通貨を消費して行う恒久的なアップグレードなどの要素もつローグライクゲームをブループリントのみで制作できす。
最初に、アセットの導入方法を紹介します。
Epic Games Launcherからマーケットプレイスのストアページを開き、本アセットを購入します。
『Survivors Roguelike - Multiplayer Game Template』 ストアページその後、「プロジェクトを作成」ボタンからプロジェクトを作りましょう。なお、デフォルトのプロジェクト名ではアンリアルエンジンのルールを満たしていないため、20字以内かつ「-」を含まないプロジェクト名に変更しましょう。
作成が完了後、プロジェクトファイルを開くと以下のようなサンプルマップが表示されます。まずはプレイ イン エディタ(PIE)のボタンを押して、サンプルゲームで遊んでみましょう。
WASDキー、または上下左右のカーソルキーでプレイヤーキャラクターの移動が可能です。
攻撃は自動で行われ、デフォルトでは一定間隔でハンマー(「Hammer」)を振り回します。ゲーム開始後10秒ほど経つとマップの上下左右から登場する敵を避けつつ「Hammer」を当てて攻撃しましょう。
敵を倒すと透明な玉を落とすことがあります。これを入手すると経験値が溜まり、一定値を超えるとレベルアップします。
レベルアップすると「Hammer」の強化のほか、「Fireball」「FrostBolt」「Lightning」といった攻撃手段(以下、ゲーム内用語にあわせて「アクティブアビリティ」と呼称)の獲得・強化や、「攻撃力アップ」「攻撃のクールダウンまでの時間の短縮」「HP上限値の上昇」「移動速度の上昇」などのパッシブアビリティによる強化を選択できます。
マップ上にある箱を破壊してHP回復薬やお金を入手しつつ、敵の猛攻を10分間耐えればクリア。
ゲーム終了後に遷移するロビー画面では、集めたコインを消費して初期攻撃手段が異なる新キャラクターを解放できます。
ゲーム中にPキーを押し、表示されたメニューから「Quit to menu」を選択するとタイトル画面に遷移します。「Host Game」をクリックすると、ロビー画面に移動します。
一通りゲームを理解したところで、解説ドキュメントを参考に自分の好きなようにゲームを作り変えていきましょう。
まずは、プレイヤーキャラクターと敵キャラクターの見た目を変えてみます。
今回はゲームメーカーズのマスコットキャラクター、「ムラスケ」と「キーボー」に登場してもらいます。先に、キャラクターの3Dモデルをインポートしておきましょう。
こちらから3Dモデルをダウンロードし、SK_Murasuke.fbxとSK_Keybo.fbxをコンテンツブラウザにドラッグアンドドロップしてインポートしましょう。
プレイヤーキャラクターの情報を管理するデータテーブルに、ムラスケの情報を加えましょう。コンテンツブラウザからSurvivorsTemplate > Bluepirnts > DataTables > DT_AvailableCharactersを開きます。
データテーブルを開いたら、画面上部の「追加」ボタンで行を追加します。新しい行の名前を「Char0」、CharacterNameを「Murasuke」、Starting Abilityを[Hammer]、Character SKを先程インポートした[SK_Murasuke]に設定します。
一度プレイし、Pキーのメニューなどからロビー画面に移動しましょう。
下記画像のように表示されればOK…といいたいところですが、正しく手と足が表示されていません。
本アセットのデモでは、キャラクターにアニメーションブループリントが設定されていることを前提にしていますが、ムラスケには残念ながらアニメーションブループリントがありません。
対策として、SurvivorsTemplate > Bluepirnts > CharacterのBP_Base_CharacterとBP_Lobby_Characterにある「Animation Mode」を[Use Animation Blueprint]から[Use Animation Asset]に変更しましょう。
また、SurvivorsTemplate > Bluepirnts > BFL_Helper > Load Player Dataで使用されているノード「Get Data Table Row DT_AvailableCharacters」の「Row Name」を、データテーブルに追加した行の名前「Char0」に変えることで、初期キャラクターをムラスケに設定できます。
続いて、敵キャラクターの姿をキーボーに変えてみましょう。
敵はブループリントで制御されています。SurvivorsTemplate > Bluepirnts > Enemiesに敵のブループリントが格納されています。ベースになっているのはBP_Base_Enemyというブループリントであるため、これを右クリックして新たに子ブループリントを作成しましょう。
今回は、作成した子ブループリントの名称を「BP_Enemy_Keybo」に設定します。ダブルクリックしてブループリントの編集画面にを開き、「Skeltal Mesh Asset」を[SK_Keybo]に、「Animation Mode」を[Use Animation Asset]に変更しましょう。
敵ブループリントを作成したあとは、敵出現データテーブルを変更しましょう。
SurvivorsTemplate > Bluepirnts > DataTables > DT_ExampleSpawn を開き、一番上の行(Runner)の「Enemy」を[BP_Base_Enemy]から[BP_Enemy_Keybo]に変更し、保存します。
プレイし、敵の見た目が変更されているか確認してみましょう。
ここで、敵AIの移動ロジックについて少し説明します。
レベルのエディタ画面でPキーを押すと、下記画像のように薄緑色の地面が見えます。これは「ナビゲーションメッシュ」を示しており、AIはこの薄緑色の領域のみを移動できるようになっています。柱など障害物がある場所にはナビゲーションメッシュが生成されないため、プレイヤーに向かう際は障害物を避けて動くようになります。
詳しくは公式ドキュメントなどをご覧ください。
続いて、攻撃を行うアクティブアビリティを増やしてみましょう。本稿では「プレイヤーの周りを回転する炎」の実装を目指します。
まずはアビリティ自体の追加方法を確認するため、既存のアクティブアビリティである「Hammer」と同じ挙動のアビリティを複製してみましょう。
最初に、列挙型のアセットであるSurvivorsTemplate > Bluepirnts > Enums > E_ActiveAbilitiesに追加したいアビリティの名前を追加します。本稿では「Flame」とします。
続いて、SurvivorsTemplate > Bluepirnts > components > BP_Abilities_Componentを編集していきましょう。
新しい変数として、攻撃間隔(秒)である「FlameTime」、当たった時のダメージである「FlameDamage」、攻撃半径である「FlameRadius」を作成します。Hammerアビリティに関わる変数「HammerTimer」「HammerDamage」「HammerRadius」を複製して作りましょう。
次に、アビリティを使うときに呼び出される関数「GrantFlame」と、レベルアップしたときに呼ばれる関数「LevelUpFlame」を作成します。こちらも関数「GrantHammer」「LevelUpHammer」を複製して作りましょう。その後、関数定義の「Hammer」という名前がついたキーや関数、変数を、新たに作成した「Flame」がついたものに置き換えます。
次に、攻撃を行うときに実行されるカスタムイベント「Prepare_Flame」と、それに伴って実行されるカスタムイベント「S_Execute_Flame」「MC_Flame」を作りましょう。ここでも、「Prepare_Hammer」「S_Execute_Hammer」「MC_Hammer」などをコピーしてイベント名を変える方法をとります。同時にコピーされた変数「HammerRadius」「HammerTimer」も「FlameRadius」「FlameTimer」に差し替えましょう。
カスタムイベン「MC_Flame」ではエフェクトや音を発生させます。エフェクトを発生させる関数「Spawn Emitter Attached」の、発生させるエフェクトを指定するパラメータ「EmitterTemplate」をハンマーではないエフェクトに変更しておきましょう。
「Prepare_Flame」が設定できたため、先程保留にしておいた関数「GrantFlame」の終わりに実行するカスタムイベントを「Prepare_Flame」に変更します。
レベルアップの時にアビリティの挙動を初期化する関数「Refresh Abilities」の定義を開きましょう。アビリティの種類に応じて処理を分岐させるノード「switch on E_ActiveAbilities」に、新しい「Flrame」ピンが追加されているため、「GrantFlame」を接続します。
ゲーム開始時にキャラクターの初期アビリティを設定する関数「Set Starting Ability」にも「switch on E_ActiveAbilities」が使われているため、「Flrame」ピンに「LevelUpFlame」を繋ぎましょう。
以上でBP_Abilities_Componentの設定は完了です。
続いて、レベルアップ時に新しいアビリティが選択できるように設定を行いましょう。
SurvivorsTemplate > Bluepirnts > system > BP_Gameplay_PlayerControllerを開きます。関数「Assign Ability」に「switch on E_ActiveAbilities」が使われているため、先ほどと同様「Flrame」ピンと先程作成したBP_Abilities_Componentの関数「LevelUpFlame」を繋げましょう。
続いて、SurvivorsTemplate > Bluepirnts > BFL_Helperを開きましょう。ここでは、新しいスキルのアイコン画像を設定します。
「Find Active Icon」関数で、「Flrame」に対応したアイコン画像を設定しましょう。今回は、ファイヤーボールと同じアイコン画像を設定しました。
SurvivorsTemplate > Bluepirnts > DataTables > DT_ActiveAbilitiesは、レベルアップ時に表示される説明文のデータテーブルです。後で変更もできるため、いったん「Hammer1」~「Hammer5」と同じように「Flame1」~「Flame5」の行を作りましょう。
以上で、新しいアビリティを追加するための作業は一通り完了しました。
実際に発動するか試すため、ムラスケの初期アビリティを先ほど作成したアビリティに設定してみましょう。SurvivorsTemplate > Bluepirnts > DataTables > DT_AvailableCharactersを開き、「Murasuke」行を選択。「Staring Ability」をFlameに変更します。
プレイを開始し、ロビー画面でムラスケを選択してゲームをスタートしましょう。ハンマーとは異なるエフェクトが出たら成功です!
次に、「Hammer」をコピーして作成したアビリティ「Flame」の性能を、下記動画のような「プレイヤーの周りを回転する炎」で攻撃するアビリティに変えていきましょう。
まずは、「Hammer」をベースにした現時点での「Flame」の挙動を見てみましょう。
SurvivorsTemplate > Bluepirnts > components > BP_Abilities_Componentの変数「Debug」の値を[For Duration]に変更すると、攻撃の当たり判定が表示されるようになります。
当たり判定を見ると、アビリティの発動と同時にプレイヤー中心を中心とした半径「FlameRadius」の球体を発生させ、球体内にいる敵にダメージを与える挙動になっているようです。
この当たり判定の発生位置を、
1)プレイヤーから一定距離離れた場所 で
2)時間によってプレイヤー位置を中心として回転するように
配置すれば、「プレイヤーの周りを回転する炎」を実現することができそうです。
まずは、1)プレイヤーから一定距離離れた場所 を実現します。BP_Abilities_Componentに「FlameVector」というVector型の変数を作成し、初期値を設定します(本稿ではX=0、Y=400.0、Z=0に設定)。
そして「FlameVector」と、「Get Owner」ノードから伸ばした「Get Actor Location」で取得できるプレイヤーの座標を加算します。加算の結果は、「Multi Sphare Trace For Objects」のStartとEndピンに接続します。
プレイを開始し、ムラスケの右側に球状の当たり判定が表示されれば成功です。
続いて、2)時間によってプレイヤー位置を中心として回転するように 当たり判定を動かします。
本稿では24コマかけて1周させる、つまり「Prepare_Flame」が呼び出されるたびに「FlameVector」が15°(360°/24コマ)ずつ回転するようにします。
Integer型の変数「FlameCount」を作り、初期値を23に設定します。そして下記画像のようにノードを繋げることで、「Prepare_Flame」が呼び出されるたびに1ずつ加算する(24以上になったら0に戻る)カウンターができあがります。
「FlameCount」の後は、当たり判定の座標を格納するVector型の変数「FlameLoc」を作成します。
下記画像では、「FlameVector」をZ軸を基準に「FlameCount」× -15°回転(RotateVector)させています。回転させたベクトルをプレイヤー座標に加算すると、「プレイヤーを中心に反時計回りに15°ずつ回転する座標」が作れます。これを「FlameLoc」に格納し、Multi Sphere Trace For ObjectsのStart、Endピンに送っています。
プレイしてみましょう。当たり判定が反時計回りに動けばOKです。
これで、攻撃のロジックが完成しました!
攻撃のロジックはできたため、性能を微調整していきましょう。
当たり判定を調整するには「FlameRadius」を、当たり判定の回転速度を変えるには「FlameTimer」を(小さくすれば速くなる)、一度に与えるダメージを変えるには「FlameDamage」を変更します。
これらの数値は、このアビリティをどのような能力にしたいかによって最適解は変わるでしょう。テストプレイを重ね、自分の納得いく数値に調整しましょう。
攻撃のロジックはできましたが、炎のエフェクトはアビリティの当たり判定の位置ではなく、依然プレイヤーの近くにあるままです。そこで、エフェクトを当たり判定と同じ位置に発生させましょう。
下記画像のように、「MC_Flame」に接続されているエフェクトをスポーンさせるノード「Spawn Emitter Attached」を、指定したLocationにエフェクトをスポーンさせる「Spawn Emitter at Location」ノードに変更します。ノードの「Emitter Template」には、[P_FireBombExplosion]を設定します。
続いて、エフェクトをスポーンさせる位置を指定する「Location」を設定します。Locationの値は、イベント「MC_Flame」の引数から引き継ぐ形にしましょう。
「S_Excute_Flame」と「MC_Flame」の2つのイベントに、新たな引数としてVector型の「Location」を追加します。そして、「S_Excute_Flame」を呼び出す処理で「Location」に変数「FlameLoc」を渡すようロジックを組みましょう。
下記画像のように、「S_Excute_Flame」から「MC_Flame」を介して、Spawn Emitter at Locaitonの「Locaition」ピンに「FlameLoc」が送られるように接続します。
これで、炎のエフェクトを当たり判定の座標に表示させる仕組みが完成しました。
最後に、「Debug」オプションを[None]に戻し、プレイを開始しましょう。回転する炎で攻撃するムラスケができあがりました!
発展として、FlameLocを配列にしてFlameLocの数だけ処理を行えば、複数の炎を回転させることもできそうです。敵の挙動なども、ブループリントを編集すれば変えられます。
無限に現れる敵を気持ちよく倒せるような強いアビリティを作るか、それともゲームバランスを重視した作りにするか。調整とテストプレイを重ね、自分だけの「ヴァンサバ」風ゲームを作り上げてみましょう!
『Survivors Roguelike - Multiplayer Game Template』ストアページSurvivors Roguelike Template Documentation「ゲームと社会をごちゃまぜにして楽しんじゃえ」がモットーの、フリーのコンテンツ開発者。節電ゲーム「#denkimeter」やVRコンテンツ、体験型エンタメの開発をしています。モニター画面の中だけで完結しないゲーム体験が好きで、ここ十数年注目しているのはアイドルマスターです。
西川善司が語る“ゲームの仕組み”の記事をまとめました。
Blenderを初めて使う人に向けたチュートリアル記事。モデル制作からUE5へのインポートまで幅広く解説。
アークライトの野澤 邦仁(のざわ くにひと)氏が、ボードゲームの企画から制作・出展方法まで解説。
ゲーム制作の定番ツールやイベント情報をまとめました。
東京ゲームショウ2024で展示された作品のプレイレポートやインタビューをまとめました。
CEDEC2024で行われた講演レポートをまとめました。
BitSummitで展示された作品のプレイレポートをまとめました。
ゲームメーカーズ スクランブル2024で行われた講演のアーカイブ動画・スライドをまとめました。
CEDEC2023で行われた講演レポートをまとめました。
東京ゲームショウ2023で展示された作品のプレイレポートやインタビューをまとめました。
UNREAL FEST 2023で行われた講演レポートをまとめました。
BitSummitで展示された作品のプレイレポートをまとめました。
ゲームメーカーズ スクランブルで行われた講演のアーカイブ動画・スライドをまとめました。
UNREAL FEST 2022で行われた講演レポートやインタビューをまとめました。
CEDEC2022で行われた講演レポートをまとめました。