メインコンテンツまでスキップ

最初のバトルを設定する

このガイドでは、エンカウントゾーンを設定し、野生バトルを発生させ、バトルの流れを理解する方法を説明します。最後まで進めると、エディターでテストできる動作するバトルが完成します。

完成した結果

これが目指す姿です。草のタイルから発生する野生エンカウントで、 4 つのアクションのメニューと、エンカウントテーブルが選んだ相手が登場します。

前提条件​

  • MCE がインストールされ、セットアップウィザードが完了している。
  • データベースに少なくとも 1 体のモンスターがいる(デモプロジェクトのもの、または自作のもの)。
  • プレイヤーキャラクターとグリッドベースのタイルマップがあるシーンと、そのマップ用の SceneInfo アセットがある。

ステップ 1:エンカウントゾーンを作る​

野生バトルは、タイルマップ上のエンカウントタイルで発生します。エンカウントタイルは、プレハブに EncounterTile コンポーネントを持つ通常のタイルです。このコンポーネントには Encounter Type という設定が 1 つだけあり、タイルが開始するエンカウントの種類を指定します:Grass、Water、Surfing、Cave、FishingOldRod、FishingGoodRod、FishingSuperRod、Diving、RockSmash、HeadButt、BugContest、Other。

  1. エンカウントタイルのプレハブを使います -- エンジンには既製のものが付属しています。たとえば Assets/OpenMon/Game/Prefabs/World/Water/Water/WaterEncounterTile.prefab です -- または自作します:プレハブを作成し、EncounterTile コンポーネントを追加して Encounter Type を選びます。
  2. そのプレハブをタイルアセットの GameObject にし、野生のモンスターを出したいタイルマップのレイヤー(通常は「Grass」レイヤー)にタイルをペイントします。

プレイヤーがそのようなタイルの上に一歩踏み出すたびに、エンカウント確率で判定されます。SceneInfo がダンジョンに設定されているシーンでは、ペイントされたタイルがなくても、歩いたすべてのタイルが Cave エンカウントとして扱われます。

ステップ 2:エンカウントテーブルを設定する​

草むらにいるのは WildEncountersSet ScriptableObject で、どのセットがどのエンカウントタイプに対応するかは、マップの SceneInfo が決めます。セットを作成します。

  1. Assets > Create > MCE > Battle > Encounters > WildEncountersSet(または Hub の Database タブにある New Wild Encounter Set ボタン)。
  2. Route1_GrassEncounters のような、わかりやすい名前を付けます。
  3. 3 つのリストを埋めます。
リスト意味
Base Encounters常に出現するモンスター
Encounters Per Moment時間帯ごとの追加モンスター:Night、Dawn、Day、Dusk
Encounters Per Weatherバトル外の天候ごとの追加モンスター

各エントリは WildEncounter です。

フィールド説明
Monster出現できる MonsterEntry
Form Calculatorフォームを選ぶアセット(SingleFormEncounter は常に 1 つのフォームを返します)
Min Level / Max Level野生モンスターのレベル範囲(1〜100。最大値は最小値を下回れません)
Weightこのエントリの相対的な確率(高いほど出やすい)

例:

モンスターレベル範囲ウェイト
Flameleon3-540
Leaflet3-540
Sparkit4-620
  1. マップの SceneInfo アセットを開き、その Encounters グループで、エンカウントタイプ(たとえば Grass)のエントリを追加し、WildEncountersSet を割り当てます。このエントリがないと、そのタイプの野生モンスターはマップに存在しません。

ステップ 3:バトルシーンを設定する​

MCE は、バトル開始時にオーバーワールドの上に加算的にロードされる専用のバトルシーンを使います。必要なもの:

  1. BattleLauncher アセット。これは ScriptableObject(Create > MCE > Battle > Launcher)で、シーンのコンポーネントではなく BattleLauncherInstaller を通じてバインドされます。Battle Scene フィールドがバトルシーンを指し、バトル音楽のリストを保持します。プロジェクトのセットアップにはすでに 1 つ含まれています。
  2. ビルド設定に含まれたバトルシーン。デフォルトのもの(Assets/OpenMon/Core/Game/Scenes/ の Battle.unity)は MCE に同梱されています。

BattleLauncher は遷移を担当します:

  • BattleParameters オブジェクト(バトルタイプ、敵タイプ、ロースター、キャラクター、シナリオ、天候)を構築する。
  • バトルシーンを加算的にロードする。
  • そのシーンの BattleManager にパラメーターを渡す。
  • バトルが終わるとシーンをアンロードし、オーバーワールドに戻る。

BattleManager のコンポーネント​

BattleManager はバトルシステムの心臓部です。バトルシーンには、BattleManager コンポーネントを持つ GameObject があります。その隣に、15 個のモジュール(それぞれ同じ GameObject 上の MonoBehaviour)と BattleStateMachine が必要です:

モジュール目的
BattleManagerBattlersModule両陣営のバトラー検索、スプライト、フォーム、逃走
BattleManagerHealthModuleHP の変化、ひんしの検出と処理
BattleManagerMovesModule技の実行、命中
BattleManagerItemsModuleバトル中のアイテム使用
BattleManagerCaptureModule野生モンスターの捕獲の仕組み
BattleManagerAIModule敵の意思決定
BattleManagerAnimationModuleバトルのイントロと流れのアニメーション
BattleManagerAudioModuleバトルの音楽と効果音
BattleManagerStatusesModule状態異常(やけど、どく、ねむりなど)
BattleManagerBattlerStatsModule能力ランクと変化
BattleManagerBattlerSwitchModuleバトラーの入れ替え
BattleManagerRostersModuleバトル中のパーティ管理
BattleManagerScenariosModule天候、地形、シナリオの設定
BattleManagerMegaModuleメガシンカ
BattleManagerCharactersModuleトレーナーキャラクター

これらを個別に設定する必要はありません。各モジュールは BattleManager を通じて同じ階層のモジュールにアクセスし、残りの配線は Zenject の依存性注入から来ます。

ステップ 4:バトルループを知る​

BattleStateMachine は、バトルが終わるまで毎ターン繰り返される 1 つのループとしてバトルを進行させます:

Update fought battlers → Request actions (player menu / AI) →
→ Determine action order → Perform actions →
→ End-of-turn callbacks and status countdown →
→ Check and process fainted battlers → [next turn]
... until IsBattleOver → end animation, prize/defeat money, end callbacks

ループはバトルプレハブの一部で、設定は不要です。理解したり変更したりするには、バトルの内部 を参照してください。

ステップ 5:バトルをテストする​

  1. オーバーワールドのシーンに次のものがあることを確認します:

    • 少なくとも 1 体のモンスターを含むロースターを持つ PlayerCharacter。
    • タイルマップにペイントされたエンカウントタイル。
    • そのタイプの Encounters エントリが、設定済みの WildEncountersSet を指している SceneInfo。
  2. エディターで Play を押します。

  3. キャラクターをエンカウントタイルの上に歩かせます。

  4. 数歩進むと(エンカウント確率によって決まります)、バトルが発生します。

クイックテスト

1 歩あたりの確率は、MCESettings アセットの TileEncounterChance テーブル(エンカウントタイプごとに 1 つの値)から取得されます。ただし、マップの SceneInfo がそのタイプ独自の確率を定義している場合を除きます。歩き回らずにすぐバトルをテストするには、テストするタイプの確率を 1(100%)に設定します。

バトルの流れを理解する​

バトルが始まると、内部では次のことが起こります。

  1. プレイヤーが EncounterTile に踏み込む。その一歩が、その Encounter Type の確率に対して判定される。
  2. マップの対応する WildEncountersSet が、現在の時間帯と天候に応じた出現可能なエンカウントを返し、ウェイトで 1 つが選ばれ、その範囲からレベルが決まる。
  3. 野生モンスターのデータを持つ BattleParameters オブジェクトが作られ、BattleLauncher がバトルシーンを加算的にロードする。
  4. BattleManager がすべてのモジュールを初期化する。
  5. バトルのイントロが再生される。
  6. プレイヤーに行動の選択肢が提示される:Fight、Bag、Monster、Run。
  7. 行動は優先度と素早さの順に実行される。
  8. 片方がひんしになるか、プレイヤーが逃げる/捕獲するまでループが続く。
  9. BattleResultParameters(勝者、捕獲したモンスター、リスポーンフラグ)がオーバーワールドに返される。
  10. バトルシーンがアンロードされ、オーバーワールドが再開する。

バトルタイプ​

2 つの enum がバトルの種類を表します。

Enum値意味
BattleTypeSingleBattle、DoubleBattle片側に 1 体、または 2 体
EnemyTypeWild、Trainer野生モンスター(捕獲可能)、または NPC トレーナー(捕獲不可、賞金が出る)

どちらも BattleParameters に含まれ、BattleManager から参照できます。

バトルイベントを購読する​

ゲームプレイのコードを内部に結合させずに、バトルイベントに反応できます。バトルランチャーは依存性注入にバインドされているため、任意のスクリプトから購読できます。

using OpenMon.MCE.Battle;

public class MyBattleTracker : MonoBehaviour
{
[Inject] private IBattleLauncher battleLauncher;

private void OnEnable()
{
battleLauncher.SubscribeToBattleLaunched(HandleBattleLaunched);
battleLauncher.SubscribeToBattleEnded(HandleBattleEnded);
}

private void OnDisable()
{
battleLauncher.UnsubscribeFromBattleLaunched(HandleBattleLaunched);
battleLauncher.UnsubscribeFromBattleEnded(HandleBattleEnded);
}

private void HandleBattleLaunched()
{
Debug.Log("A battle has been launched!");
}

private void HandleBattleEnded(BattleResultParameters result)
{
Debug.Log($"Battle ended. Player won: {result.PlayerWon}");
}
}

battleLauncher.BattleInProgress で、バトルが進行中かどうかがわかります。SDK には OnBattleStarted と OnBattleEnded を持つ IBattleSystem(engine.Battle)もありますが、そのエンジンフックはまだ接続されていません。パブリック API ガイド と IBattleSystem を参照してください。

トラブルシューティング​

問題解決方法
バトルが発生しないタイルに正しい Encounter Type の EncounterTile があること、マップの SceneInfo にそのタイプの WildEncountersSet があること、TileEncounterChance にその値があることを確認してください(存在しないタイプは 0 として扱われ、一度だけ警告が出ます)
エンカウント後に画面が真っ黒になるバトルシーンが Build Settings のシーンリストにあり、BattleLauncher に設定されていることを確認してください
モンスターがレベル 0 で出現するエンカウントエントリに Min Level と Max Level が設定されていることを確認してください
バトル音楽が鳴らないBattleLauncher の野生/トレーナーバトルのリストに音楽があり、BattleManagerAudioModule にオーディオが割り当てられていることを確認してください
バトル開始時にクラッシュするOpenMon Hub → Database タブ → Validate Database を開き、データベースの参照の欠落を確認してください

次のステップ​