編集部員が1日でヴァンサバ風ローグライクゲームを作ってみた。キャラクター変更からオリジナルの攻撃パターン作成までを解説!

2023.11.22
注目記事ゲームづくりの知識チュートリアルルールをつくるアセットレビューアンリアルエンジンゲームデザインマーケットプレイス
この記事をシェア!
Twitter Facebook LINE B!
Twitter Facebook LINE B!

Monster Tooth Studiosによる『Survivors Roguelike – Multiplayer Game Template』は、『Vampire Survivors』に代表されるゲームシステムを制作できるブループリントアセットです。

本稿では編集部員の体験をもとに、本アセットのUnreal Engine 5への導入方法とサンプルゲームの説明、キャラクターモデルの変更、そして新しい攻撃アビリティの追加例を解説します。

TEXT / 田端 秀輝

EDIT / 神谷 優斗、田端 秀輝

目次

この記事はUnreal Engine バージョン5.3.2を利用して書かれています。

アセットの導入方法とゲームの説明

Survivors Roguelike – Multiplayer Game Template』(以下、本アセット)を使用することで、大量の敵のスポーンやレベルアップに伴うスキルの強化、ゲームオーバー時に付与される通貨を消費して行う恒久的なアップグレードなどの要素もつローグライクゲームブループリントのみで制作できす。

本アセットの内容を紹介するデモ動画

最初に、アセットの導入方法を紹介します。

Epic Games Launcherからマーケットプレイスのストアページを開き、本アセットを購入します。

『Survivors Roguelike - Multiplayer Game Template』 ストアページ

その後、「プロジェクトを作成」ボタンからプロジェクトを作りましょう。なお、デフォルトのプロジェクト名ではアンリアルエンジンのルールを満たしていないため、20字以内かつ「-」を含まないプロジェクト名に変更しましょう。

作成が完了後、プロジェクトファイルを開くと以下のようなサンプルマップが表示されます。まずはプレイ イン エディタ(PIE)のボタンを押して、サンプルゲームで遊んでみましょう。

画面中央上側にある、黄緑色の三角形がPIEのボタンだ

WASDキー、または上下左右のカーソルキーでプレイヤーキャラクターの移動が可能です。

攻撃は自動で行われ、デフォルトでは一定間隔でハンマー(「Hammer」)を振り回します。ゲーム開始後10秒ほど経つとマップの上下左右から登場する敵を避けつつ「Hammer」を当てて攻撃しましょう。

敵を倒すと透明な玉を落とすことがあります。これを入手すると経験値が溜まり、一定値を超えるとレベルアップします。

レベルアップすると「Hammer」の強化のほか、「Fireball」「FrostBolt」「Lightning」といった攻撃手段(以下、ゲーム内用語にあわせて「アクティブアビリティ」と呼称)の獲得・強化や、「攻撃力アップ」「攻撃のクールダウンまでの時間の短縮」「HP上限値の上昇」「移動速度の上昇」などのパッシブアビリティによる強化を選択できます。

獲得するアップグレードは、レベルアップごとに4つの選択肢から選べる。各レベルの上限は5だ

マップ上にある箱を破壊してHP回復薬やお金を入手しつつ、敵の猛攻を10分間耐えればクリア。

ゲーム終了後に遷移するロビー画面では、集めたコインを消費して初期攻撃手段が異なる新キャラクターを解放できます。

ゲーム中にPキーを押し、表示されたメニューから「Quit to menu」を選択するとタイトル画面に遷移します。「Host Game」をクリックすると、ロビー画面に移動します。

本稿では取り上げないが、本アセットはオンライン協力プレイにも対応しているため「Host Game」「Join Game」のボタンが確認できる

ゲームの改造① キャラクターを変更する

一通りゲームを理解したところで、解説ドキュメントを参考に自分の好きなようにゲームを作り変えていきましょう。

まずは、プレイヤーキャラクターと敵キャラクターの見た目を変えてみます。

キャラクターの3Dモデルの登録

今回はゲームメーカーズのマスコットキャラクター、「ムラスケ」と「キーボー」に登場してもらいます。先に、キャラクターの3Dモデルをインポートしておきましょう。

こちらから3Dモデルをダウンロードし、SK_Murasuke.fbxSK_Keybo.fbxをコンテンツブラウザにドラッグアンドドロップしてインポートしましょう。

関連記事
ゲームメーカーズに登場するキャラクター「キーボー」「ムラスケ」の3Dモデルデータを配布します。キャラクター設定も明らかに!
2023.03.29

fbxファイルのインポート場所はどこでもよいが、今回はSurvivorsTemplateディレクトリにCharactersディレクトリを作り、その直下に作成したMurasuke、Keyboディレクトリにfbxファイルをインポートした。インポートの際は「全てインポート」を選択

プレイヤーキャラクターのモデル変更

プレイヤーキャラクターの情報を管理するデータテーブルに、ムラスケの情報を加えましょう。コンテンツブラウザからSurvivorsTemplate > Bluepirnts > DataTables > DT_AvailableCharactersを開きます。

キャラクターにしろ敵にしろアビリティにしろ、本アセットで要素を追加する際はDataTablesディレクトリにあるデータテーブルを編集することが多い

データテーブルを開いたら、画面上部の「追加」ボタンで行を追加します。新しい行の名前を「Char0」、CharacterNameを「Murasuke」、Starting Abilityを[Hammer]、Character SKを先程インポートした[SK_Murasuke]に設定します。

DT_AvailableCharactersの画面。キャラクターの説明文などを設定できる。なお、「Default Locked」はチェックしないでおこう。「UnlockCost」で設定した量のコインを使ってロビー画面で開放しない限り使用できなくなるためだ

一度プレイし、Pキーのメニューなどからロビー画面に移動しましょう。

下記画像のように表示されればOK…といいたいところですが、正しく手と足が表示されていません。

本アセットのデモでは、キャラクターにアニメーションブループリントが設定されていることを前提にしていますが、ムラスケには残念ながらアニメーションブループリントがありません。

対策として、SurvivorsTemplate > Bluepirnts > CharacterのBP_Base_CharacterBP_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の移動ロジックの仕組み

ここで、敵AIの移動ロジックについて少し説明します。

レベルのエディタ画面でPキーを押すと、下記画像のように薄緑色の地面が見えます。これは「ナビゲーションメッシュ」を示しており、AIはこの薄緑色の領域のみを移動できるようになっています。柱など障害物がある場所にはナビゲーションメッシュが生成されないため、プレイヤーに向かう際は障害物を避けて動くようになります。

詳しくは公式ドキュメントなどをご覧ください。

ゲームの改造② 攻撃するアクティブアビリティを複製する

続いて、攻撃を行うアクティブアビリティを増やしてみましょう。本稿では「プレイヤーの周りを回転する炎」の実装を目指します。

まずはアビリティ自体の追加方法を確認するため、既存のアクティブアビリティである「Hammer」と同じ挙動のアビリティを複製してみましょう。

アビリティ名の登録

最初に、列挙型のアセットであるSurvivorsTemplate > Bluepirnts > Enums > E_ActiveAbilitiesに追加したいアビリティの名前を追加します。本稿ではFlame」とします。

アビリティの動作のコピー

続いて、SurvivorsTemplate > Bluepirnts > components > BP_Abilities_Componentを編集していきましょう。

新しい変数として、攻撃間隔(秒)である「FlameTime」、当たった時のダメージである「FlameDamage」、攻撃半径である「FlameRadius」を作成します。Hammerアビリティに関わる変数「HammerTimer」「HammerDamage」「HammerRadius」を複製して作りましょう

アクティブアビリティ関連の変数はAbilities > Activeカテゴリにまとめられている。変数名の「Flame」の部分は、作成したいアビリティの名前に適宜置き換えよう

次に、アビリティを使うときに呼び出される関数「GrantFlame」と、レベルアップしたときに呼ばれる関数「LevelUpFlame」を作成します。こちらも関数「GrantHammer」「LevelUpHammer」を複製して作りましょう。その後、関数定義の「Hammer」という名前がついたキーや関数、変数を、新たに作成した「Flame」がついたものに置き換えます。

「GrantFlame」では、変数だけでなく、SetTimerByFunctionNameの中の記述も「Prepare_Flame」にしておこう。対応するカスタムイベント「Prepare_Flame」はこのあと作成する

「LevelUpHammer」関数をコピーして作成した「LevelUpFlame」。画像内のCONTAINS、FIND、ADDにある[Hammer]を[Flame]に切り替えよう

「LevelUpFlame」関数の続き。画像内の「GrantFrame」「FlameDamage」「FlameRadius」、ADD内の「Flame」は、「GrantHammer」「HammerDamage」「HammerRadius」から置き換えたものだ

次に、攻撃を行うときに実行されるカスタムイベント「Prepare_Flame」と、それに伴って実行されるカスタムイベント「S_Execute_Flame」「MC_Flame」を作りましょう。ここでも、「Prepare_Hammer」「S_Execute_Hammer」「MC_Hammer」などをコピーしてイベント名を変える方法をとります。同時にコピーされた変数「HammerRadius」「HammerTimer」も「FlameRadius」「FlameTimer」に差し替えましょう。

検索ボックスにPrepareと入力すれば、コピー元のPrepare_Hammerを検索できる。ひとくくりになったハンマー関連のノードを丸ごとコピーして別の場所に貼り付け、それを編集していこう

カスタムイベン「MC_Flame」ではエフェクトや音を発生させます。エフェクトを発生させる関数「Spawn Emitter Attached」の、発生させるエフェクトを指定するパラメータ「EmitterTemplate」をハンマーではないエフェクトに変更しておきましょう。

EmitterTemplateを[P_FireBombExplosion]に変更し、炎っぽいエフェクトがでるように設定

【補足】
本アセットはオンライン協力プレイに対応しています。協力プレイをする場合、攻撃がヒットした敵にダメージを与える「S_Excute_Flame」はサーバーで実行させるため、下記画像のようにイベントの「複製する」オプションを「サーバーで実行」に変更します。同様に「MC_Flame」はサーバーとクライアントの両方で実行するため、「複製する」を「マルチキャスト」を設定しましょう。

マルチプレイを想定していなければ、そのままでも構わない

「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」を繋げましょう。

「AbilityComponent」のGetterノードからピンを引っ張ると、BP_Abilities_Componentの関数を選択できる

続いて、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」の球体を発生させ、球体内にいる敵にダメージを与える挙動になっているようです。

当たり判定に使用している「Multi Sphare Trace For Objects」は、球体を動かしてヒットしたオブジェクトすべてを出力する関数。「Hammer」においても、当たり判定自体はハンマーの動きに関係なく球体で処理されている

この当たり判定の発生位置を、
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ピンに接続します。

「Get Owner」ノードはコンポーネントの所有者を取得する。ここではプレイヤーキャラクターのアクターだ

プレイを開始し、ムラスケの右側に球状の当たり判定が表示されれば成功です。

当たり判定を動かす

続いて、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」を変更します。

「FlameRadius」を75、「FlameTimer」を0.05(1.2秒で1周)、「FlameDamage」を15に設定した。ちゃんと敵に当たるとダメージを与えている

これらの数値は、このアビリティをどのような能力にしたいかによって最適解は変わるでしょう。テストプレイを重ね、自分の納得いく数値に調整しましょう。

当たり判定の場所にエフェクトを表示させる

攻撃のロジックはできましたが、炎のエフェクトはアビリティの当たり判定の位置ではなく、依然プレイヤーの近くにあるままです。そこで、エフェクトを当たり判定と同じ位置に発生させましょう。

下記画像のように、「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コンテンツ、体験型エンタメの開発をしています。モニター画面の中だけで完結しないゲーム体験が好きで、ここ十数年注目しているのはアイドルマスターです。

関連記事

エピック ゲームズ ジャパンによる講演も行われた「第2回 Unreal Engine KYUSHU LT会 in 鹿児島」、アーカイブ動画および一部のスライド資料が公開
2024.07.11
ゲーム開発者必見のカンファレンス10選【GDC・CEDEC・Unreal Fest・U/Dayなど】
2024.07.11
「Unreal Engine」2024年7月の無料マーケットプレイスコンテンツが公開!何千ものポーンを制御するプラグインや、スタイライズされた環境アセットのバンドルなど
2024.07.03
クロスシミュレーションツール「Marvelous Designer」が1年間無料で使用可能。Epic Games、UEFNクリエイターに向けてライセンスを期間限定で提供中
2024.06.25
mocopiのモーションデータをリアルタイムでMayaに送れる公式プラグインが公開。併せて、UE版プラグインがUE5.4に対応
2024.06.21
UEでローカルLLMを実装するプラグイン、「技術書典16」でUE技術書を販売した挑戦の記録など。技術勉強会「UE Tokyo .dev #3」の講演資料が公開
2024.06.19

注目記事ランキング

2024.07.08 - 2024.07.15
VIEW MORE

連載・特集ピックアップ

イベントカレンダー

VIEW MORE

今日の用語

レベル(Level)
レベル
  1. ゲーム開発において、位置情報を持つオブジェクトが配置されている地形。
  2. RPGなどのゲームにおいて、キャラクターの成長度合いを示す数値。レベルアップなど。
VIEW MORE

Twitterで最新情報を
チェック!