Fabで販売されているコマンドRPGを制作するためのプロジェクト『Turn-Based jRPG Template』の第2回。
#2 新規レベルに敵を配置
レベルに敵を配置すると、急にRPGっぽくなります。
環境
- エンジン: Unreal Engine 5.5.4
- プロジェクト: Turn-Based jRPG Template
- レベル: Modular Dungeon Collection
レベルを追加
私はFabで販売されているModular Dungeon Collectionを使いました。
丁度、2025年5月6日23時~5月20日23時まで無料配布されていました。
練習なのでレベルは何でも良いです。
ファイル > 新規レベル で新規レベルを作成しても良いです。
ゲームモードの設定
追加したレベルを開きます。
ワールドセッティングの Game Mode > ゲームモードオーバーライド にBP_JRPGGameModeを指定します。
プレイヤースタートを配置して、テストプレイ。
敵と戦うまで
シンボルエンカウントで敵と戦うまでの行程。
BP_BattleControllerの配置
BP_BattleControllerは、バトル用のコントローラーです。
レベルのどこでもいいので、BP_BattleControllerを配置します。
(場所: コンテンツ > TurnBasedJRPGTemplate > Blueprints > Battle > BP_BattleController)
デフォルトの編集
レベルに配置したBP_BattleControllerを選択して、 詳細 > デフォルト
- Battle Transitionは、バトルに切り替わった時の演出。最もオーソドックスな仕様のBP_FadeBattleTransitionを指定。
- Should Units Move to Targetは、近接攻撃時にターゲットまで近づいて攻撃するかどうか。
- Show Turn Order UIは、バトル時に攻撃順を画面右側に表示するかどうか。
- Turn Typeは、ActionTimeだとFFシリーズのATBゲージのようなゲージが表示され、Speedでは非表示でSpeed順に行動する。
- Main Menu Map Nameは、メインメニューの背景となるレベル。デフォルト設定のMainMenuで良いです。
- フィールド曲、戦闘曲、勝利曲、敗北曲もここで設定可能です。
BP_*****SpawnLocationの配置
BP_EnemySpawnLocationとBP_PlayerSpawnLocationは、バトル時にエネミーとプレイヤーが配置される場所です。
レベル内の広いスペースをバトルフィールドにして、そこに配置しましょう。
エネミー3体、プレイヤー3人が向かい合うように配置します。
BP_EnemySpawnLocationをレベル上に配置。
(場所: コンテンツ > TurnBasedJRPGTemplate > Blueprints > Battle > BP_EnemySpawnLocation)
BP_PlayerSpawnLocationをレベル上に配置。
(場所: コンテンツ > TurnBasedJRPGTemplate > Blueprints > Battle > BP_PlayerSpawnLocation)
BP_Cameraの配置
BP_Cameraは、バトル開始時、最初に使われるカメラです。
(場所: コンテンツ > TurnBasedJRPGTemplate > Blueprints > Battle > BP_Camera)
BP_Cameraをレベル上に配置する
BP_*****SpawnLocationを全体を見下ろすように配置しても良いですし、エネミーだけを移すようにBP_EnemySpawnLocationに向けて配置しても良いでしょう。
次に設定するBP_InteractionBattleのデフォルト > Dynamic Cameraのチェックを外した場合、BP_Cameraのみの固定視点になります。
Dynamic Cameraにチェックが入っている場合、プレイヤーのコマンド入力時に、そのプレイヤーの後方のカメラに切り替わる。
BP_InteractionBattleの配置
BP_InteractionBattleは、シンボルエンカウントバトルの基本設定となるブループリントです。
(場所: コンテンツ > TurnBasedJRPGTemplate > Blueprints > Battle > BP_InteractionBattle)
レベル上に配置します。
これを配置した時の水色の球体の範囲内で、エネミーがプレイヤーを見つけると追ってきます。
水色の球体の範囲外では追ってきませんが、接触するとバトルになります。
デフォルトの編集
レベル上に配置したBP_InteractionBattleを選択して、詳細 > デフォルト
- Battle ControllerにBP_BattleControllerを指定。
- Radiusでエネミーがプレイヤーを発見する範囲を設定。
- Dynamic Cameraのチェックを外すと、固定カメラのみのバトルとなります。
- Static CameraにBP_Cameraを指定。
- Enemy Spawn LocationsにBP_EnemySpawnLocationを3つ指定。
- Player Spawn LocationsにBP_PlayerSpawnLocationを3つ指定。
- Flee Chanceはプレイヤーが逃げられる確率です。100.0で100%です。
エネミーの配置
ナビメッシュ バウンズ ボリュームをレベル上に配置
エネミーはAIで動き回りますから、ナビメッシュ バウンズ ボリュームをレベル上配置する必要があります。これを配置しないとエネミーは動きません。
ナビメッシュ バウンズ ボリュームの範囲内でのみ、エネミーのAIが機能して動き回ります。
BP_AggressiveEnemyExplorePawnsをレベル上に配置
BP_AggressiveEnemyExplorePawnsは、レベル内を歩き回り、プレイヤーを見つけると追いかけてくるエネミーです。
(場所: コンテンツ > TurnBasedJRPGTemplate > Blueprints > EnemyExplorePawns > AggressiveEnemyExplorePawns > BP_AggressiveEnemyExplorePawns)
BP_AggressiveEnemyExplorePawnsをレベル上に配置します。
デフォルトの編集
レベル上に配置したBP_AggressiveEnemyExplorePawnsを選択して、詳細 > デフォルト
- BattleにBP_InteractionBattleを指定。
これで配置したエネミーとBP_InteractionBattleが連動します。 - Respawn After Loadは、Level遷移によるエリア切り替えや、セーブ→ロードでエネミーが復活するかどうかです。チェックが入っていると復活します。
1度しか戦えないボスなどはチェックを外す。
出現するエネミーの指定
レベル上に配置したBP_AggressiveEnemyExplorePawnsを選択して、詳細 > デフォルト
Enemy Listで+をクリック。
追加されたインデックス[0]の下のenemyListで+をクリックすると、エネミーを指定できます。
接触時にどんなエネミーが出現するかの設定は、3パターン紹介します。
【エネミー1体 WeakEnemyかAverageEnemyかのランダム】
現在: インデックス[0]のみ / enemyListは1枠のみ
enemyList(1枠目)のNoneのところをBP_WeakEnemyに指定。
enemyListで+をクリックして、enemyListの2枠目を追加。
enemyList(2枠目)のNoneのところをBP_AverageEnemyに指定。
それぞれのspawnChanceを0.5にする。
プレイヤーが接触した時、50%の確率でどちらかが出現します。
minLevelとmaxLevelはエネミーのレベル設定です。
minLevel1でmaxLevel5なら、出現したエネミーのレベルが1~5でランダムに決まります。
【エネミー2体 WeakEnemyとAverageEnemy】
現在: インデックス[0]のみ / enemyListは1枠のみ
インデックス[0]のenemyListにBP_WeakEnemyを指定。
Enemy Listで+をクリックして、インデックス[1]を作成。
インデックス[1]のenemyListを追加し、BP_BP_AverageEnemyを指定。
ちなみにspawnChanceを0.0にしても、今回のようにそれぞれのインデックスにエネミーが1体しか登録されていなければスポーンします。
【エネミー1体かエネミー2体かのランダム】
現在: インデックス[0]のみ / enemyListは1枠のみ
インデックス[0]のenemyListにBP_WeakEnemyを指定。
spawnChanceは1.0。
インデックス[0]のエネミーは必ず出現します。
Enemy Listで+をクリックして、インデックス[1]を作成。
インデックス[1]のenemyList(1枠目)にBP_WeakEnemyを指定。
spawnChanceは0.5。
インデックス[1]のenemyListを追加して2枠目はNoneのまま。
spawnChanceは0.5。
これでインデックス[1]はBP_WeakEnemyとNoneがそれぞれ50%になり、エネミーが出現したりしなかったりします。
BP_EnemySpawnLocationを3つ配置していますから、インデックス[2]まで使用可能です。
BP_EnemySpawnLocationを4つ配置したら、インデックス[3]まで使用可能という具合。
エネミーの作成
バトルエネミー
BP_WeakEnemyを複製して名前変更。
Skeletal Mesh AssetとAnimクラスの変更。
デフォルト、統計、アニメーションの設定。
フィールドエネミー
作成不要。
BP_AverageEnemyExplorePawnを配置して、Skeletal Mesh Assetを変更すれば良いです。
日本語化と効果音
バトルコマンドの日本語化
BP_ActionUIでバトルコマンドを日本語化できます。
(場所: コンテンツ > TurnBasedJRPGTemplate > Blueprints > UI > BP_ActionUI)
ItemButtonやSkillButtonを選択し、デフォルト > Actionの欄に「アイテム」や「スキル」と入力。その下のAction Imageでボタン画像を変更できます。
その他、戦闘に関するUI。
必要に応じて日本語化しましょう。
敗北時のUIは、BP_DefeatDialogue
(場所: コンテンツ > TurnBasedJRPGTemplate > Blueprints > UI > Dialogues > BP_DefeatDialogue)
勝利時のUIは、BP_VictoryDialogue
(場所: コンテンツ > TurnBasedJRPGTemplate > Blueprints > UI > Dialogues > BP_VictoryDialogue)
レベルアップ時のUIは、BP_LevelUpDialogue
(場所: コンテンツ > TurnBasedJRPGTemplate > Blueprints > UI > Dialogues > BP_LevelUpDialogue)
ボタンを押した時の効果音
ボタンを押した時の効果音は、BP_JRPGFunctionLibraryのPlayConfirmSoundで管理されています。
(場所: コンテンツ > TurnBasedJRPGTemplate > Blueprints > Controllers > BP_JRPGFunctionLibrary > PlayConfirmSound)
不具合?
BP_AggressiveEnemyExplorePawnsが自動バトルにならなくなった
BP_AggressiveEnemyExplorePawnsに接触してもバトルにならず「「INTERACT」が表示されるようになる不具合がありました。
状況は、まずこのテンプレートをインストールして、すぐにテストプレイ。
スタート位置から右側2つめの部屋にBP_AggressiveEnemyExplorePawnsが配置されていて、近づくと自動で戦闘になりました。この時、クリック音が入ってしまっていた。
インタラクトを管理しているBP_InteractionDetectorを開く。
(場所: コンテンツ > TurnBasedJRPGTemplate > Blueprints > Interactables > BP_InteractionDetector)
コンパイルしてから再びテストプレイすると、BP_AggressiveEnemyExplorePawnsに近づいても自動で戦闘にならず「INTERACT」が表示されるようになりました。
BP_AggressiveEnemyExplorePawnsのコンポーネントのInteractionActorを選択。
詳細の チャイルドアクタコンポーネント > Child Actor Template がリセットされたようです。
Child Actor Templateが指定できませんので、手動で入力。
これで接触しただけでエンカウントされます。
Child Actor Templateとデフォルトが表示されないようでしたら、子アクタクラスをNoneにしてから、BP_InteractionDetectorを選びなおしてください。
接触時のクリック音を消すには、BP_InteractionDetectorのイベントグラフのイベント BeginPlayを見ます。
カスタムイベント OnInteractedHandlerの後に変数forceinteractionをGetしてブランチを配置。
これでForce Interactionにチェックが入っている時は、クリック音がスルーされます。
ちなみに接触判定は、キャラクターの正面に球体があります。
ですから、正面同士で接触すると、ちょっと離れている距離で戦闘に入ります。
エネミー2体の同時接触の問題とエネミー情報の取得ミス
何度もテストプレイしていると、シンボルエンカウントで2つの不具合がありました。
- エネミー2体とまったく同時に接触した時、同時に読み込んでバトルが発生してしまう。プレイヤーキャラクターも2倍になってしまう。
- エネミーとの接触の仕方によっては、エネミー情報が取得されず、バトルが開始しても進行不能状態。
滅多に発生しない不具合ですが、対応しておく必要があります。
これらの状況になった時、バトルをキャンセルするようにしました。
BP_BattleControllerの編集
イベントInitBattleを改造します。

・エネミー情報の取得ミスの対応は、Enemy Unitsの中身が空だった時、Switch to Explore Modeに繋いでフィールド探索モードに戻る。
・エネミー2体の同時接触の対応は、バトル時に読み込まれたPlayer UnitsとJ RPG Controllerに記録されているPlayer Unitsの数が同じかを確認します。同時接触で2倍になっていればSwitch to Explore Modeに繋いでフィールド探索モードに戻る。
コメント