【Unity】RPGを作るチュートリアルその61 エンカウントの定義データを作成
- 2025.04.04
- RPGチュートリアル
- RPG, Unity, ゲーム開発, チュートリアル

シンプルなRPGをUnityで作るチュートリアルシリーズの61回目です。
第60回では戦闘終了の処理を作成しました。
今回はエンカウントの機能を実装していくにあたって、エンカウントに関する定義データを作成していきます。
制作環境
MacBook Pro 2023 Apple M2 Max
Unity6 (6000.0.30f1) Silicon
作業内容と順序
シンプルなRPGを作る上でどんな作業が必要か、どんな順番で作っていくと良さそうか、別ページで検討しました。基本的にこの流れに沿って進めていきます。
チュートリアルの一覧
このシリーズ全体の一覧は以下のページにまとめています。
前回の内容
前回は戦闘終了の処理を作成しました。
エンカウントの仕組み
今回のチュートリアルでは、初期のドラクエのようにランダムエンカウントで実装したいと思います。
ランダムエンカウントでは、移動のたびにエンカウント判定を行い、敵と遭遇した判定になったら、出現する敵キャラを抽選していきます。ゲームによっては敵パーティを事前に定義しておくこともあります。今回は1vs1の戦いのため、抽選テーブル内の敵キャラ1体を選択します。
抽選テーブルでは、敵キャラクターのIDと、出現のしやすさの数値を対応させて、出現のしやすさを元に抽選していきます。出現しやすさの値はint型で定義して、数が多ければ出現しやすく、少なければ出現しにくい形にします。
エンカウントするかどうかを管理するクラスを使ってこれらの計算を行い、戦闘が発生する場合は「BattleManager」に通知を行なって戦闘を開始します。戦闘後は「BattleManager」から通知を返してもらうようにしましょう。ゲーム内では、ランダムエンカウントによる戦闘、イベントによる戦闘があるので、戻す先を保持できるようにインタフェースも用意したいと思います。
エンカウントはマップ単位で設定を行います。そのため、マップの動作を制御するクラス、マップ全体を制御するクラスについてもエンカウントの実装と並行して行なっていきたいと思います。

エンカウントの定義クラスを作成
今回はまずエンカウントの定義クラスを作成していきます。基本的にはマップと対応させる形で定義クラスを持たせることを考えています。必要なデータとしては、
- エンカウントするかどうかのフラグ
- エンカウント率
- 敵キャラクターのIDと出現しやすさの対応リスト
です。このうち、敵キャラクターのIDと出現しやすさの対応リストについては別でクラスを作成して、それをリストとして保持するようにします。
そのため、敵キャラクターのIDと出現しやすさの対応クラス、エンカウントの定義クラスの順番で作成していきます。
敵キャラクターのIDと出現しやすさの対応クラス
IDと出現しやすさを対応させて保持するクラスを作成していきます。Projectウィンドウから「Assets/Scripts/Data」のフォルダを開き、空のスクリプトを作成します。名前は [EnemyRate] にしました。

作成した「EnemyRate」の中身は以下のように記載しました。
中身はシンプルで、敵キャラクターのIDと、出現しやすさのフィールドを用意しています。リストとして保持するため、[Serializable]もつけてあります。
エンカウントの定義クラス
エンカウントの定義クラスを作成していきます。Projectウィンドウから同じく「Assets/Scripts/Data」のフォルダにて、空のスクリプトを作成します。名前は [EncounterData] にしました。

作成した「EncounterData」の中身は以下のように記載しました。
コンテキストメニューから作成するため、CreateAssetMenuのAttributeをつけています。フィールドとしては上で触れたものがベースになっていて、出現率のfloatに関してはRangeのAttributeをつけて0から100の間で設定できるようにしています。
「enemyRates」は上で作成した「EnemyRate」をリストとして保持しています。
定義データの作成
スクリプトを保存したら定義データを作成していきましょう。今のところ想定しているマップとしては、
- 村
- フィールド
- ダンジョン
なので、試しに3つ作成していきましょう。
Projectウィンドウから「Assets/Data」のフォルダを開き、新しくフォルダを作成します。名前は [Encounter] にしました。

村用のデータ
作成した「Encounter」のフォルダに移動し、コンテキストメニューから [Create] -> [ScriptableObjects] -> [SimpleRpg] -> [EncounterData] を選択してScriptableObjectを作成します。

作成したファイルの名前は [EncounterData_Village] にしました。これは村用マップで使いましょう。

村ては敵とエンカウントしないようにするため、「Has Encounter」のフラグをfalseのままにしておきます。エンカウントしないので他の設定はデフォルトのままでOKです。

フィールド用のデータ
続いて村用のデータを複製してフィールド用のデータを作成します。名前は [EncounterData_Field] にしました。

フィールド上ではエンカウントさせたいので「Has Encounter」のフラグをTrueにします。エンカウント率の「Rate」については、だいたい10歩前後を目安に [10] にしておきます。ここは実際にマップを作成して歩いた時の感覚で調整していきましょう。フィールド上ではスライムが出現するように、[+] ボタンで要素を追加した後、「Enemy Id」を [1] に、「Rate」も [1] に設定します。

ダンジョン用のデータ
次にフィールド用のデータを複製してダンジョン用のデータを作成します。名前は [EncounterData_Dungeon] にしました。

ダンジョンでもエンカウントさせたいので「Has Encounter」のフラグをTrueにします。エンカウント率の「Rate」については、フィールドより少し多めに [15] にしておきます。ここも後で調整していきましょう。[+] ボタンで要素を追加した後、追加した要素の「Enemy Id」を [2] に、「Rate」も [2] に設定します。ダンジョン内ではゴブリンの方が多めに出るようにしたいと思います。

今回はまだ動作確認ができないので、ここまでの設定ができたら完了です。
今回のブランチ
まとめ
今回はエンカウントの機能を実装していくにあたって、エンカウントに関する定義データを作成しました。エンカウントはマップの動作とも関連するので、そちらと並行して作成していきます。
次回はエンカウントの動作を管理するクラスを作成していきます。
ゲーム開発の攻略チャートを作りました!
-
前の記事
【Unity】RPGを作るチュートリアルその60 戦闘結果を処理する機能を実装 2025.04.03
-
次の記事
【Unity】RPGを作るチュートリアルその62 エンカウントの動作を管理するクラスを作成 2025.04.07
コメントを書く