【Unity】RPGを作るチュートリアルその61 エンカウントの定義データを作成

【Unity】RPGを作るチュートリアルその61 エンカウントの定義データを作成

シンプルな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を作成します。

ScriptableObjectの作成
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] に設定します。ダンジョン内ではゴブリンの方が多めに出るようにしたいと思います。

ダンジョン用の設定
ダンジョン用の設定

 

今回はまだ動作確認ができないので、ここまでの設定ができたら完了です。

 

今回のブランチ

 

まとめ

今回はエンカウントの機能を実装していくにあたって、エンカウントに関する定義データを作成しました。エンカウントはマップの動作とも関連するので、そちらと並行して作成していきます。

次回はエンカウントの動作を管理するクラスを作成していきます。

     

ゲーム開発の攻略チャートを作りました!

CTA-IMAGE

「ゲームを作ってみたいけど、何から手を付けていいか分からない!」


そんなお悩みをお持ちの方向けに、todoがアプリをリリースした経験を中心に、ゲーム作りの手順や考慮すべき点をまとめたe-bookを作成しました。ゲーム作りはそれ自体がゲームのように楽しいプロセスなので、「攻略チャート」と名付けています。


ゲームを作り始めた時にぶつかる壁である「何をしたら良いのか分からない」という悩みを吹き飛ばしましょう!