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

野生エンカウントシステム

エンカウントシステムは、プレイヤーがワールドを探索する間に、いつ、どの野生モンスターが現れるかを決定します。MCE は、複数のエンカウントタイプ、ウェイト付きテーブル、レベル範囲、時間帯と天候によるエンカウント、そしてむしよけに対応しています。

1 番道路の草むら

プレイヤーが立っているタイルがトリガーのすべてです。EncounterTile がタイルとそのタイプを示し、 WildEncountersSet がそこに何がどのレベルで棲んでいるかを示し、マップの SceneInfo が その 2 つを結び付け、エンカウントタイルに踏み込む一歩ごとに確率で判定されます。

エンカウントの仕組み​

  1. プレイヤーが EncounterTile を持つタイル(ダンジョンのシーンでは任意のタイル)に一歩を踏み終えます。
  2. その一歩が、そのタイルの EncounterType のエンカウント確率で判定されます。
  3. 判定に成功すると、マップの SceneInfo がそのタイプの WildEncountersSet を提供します。現在の時間帯と天候に対応する出現可能なエンカウントのリストが作られ、ウェイトによって 1 つのエントリが選ばれます。
  4. エントリの MinLevel と MaxLevel の間でレベルが決まります。
  5. むしよけやパーティの先頭モンスターによって、エンカウントがキャンセルされることがあります(後述)。
  6. 選ばれたモンスターの種、レベル、フォームを持つ BattleParameters オブジェクトが作られ、BattleLauncher がバトルシーンへ遷移します。

エンカウントタイプ​

EncounterType enum がエンカウントの種類を定義します。

タイプ典型的な用途
Grass草むら
Water、Surfing水のタイル、およびその上でのなみのり
Cave洞窟の床。ダンジョンとして設定されたシーン(SceneInfo の IsDungeon)では、ペイントされたタイルがなくてもすべてのタイルで Cave が使われます
FishingOldRod、FishingGoodRod、FishingSuperRod各つりざおでのつり
Diving水中
RockSmash、HeadButt岩を砕く、木に頭突きをする
BugContestむしとりコンテスト
Otherゲームが独自に定義するもの

エンカウントゾーンの設定​

ステップ 1:エンカウントタイル​

エンカウントタイルは、プレハブに EncounterTile コンポーネントを持つタイルです。このコンポーネントには Encounter Type という設定が 1 つあります。自作するには、そのコンポーネントを持つプレハブを作成してタイプを選び、そのプレハブをタイルアセットの GameObject として使い、モンスターを出したいタイルマップのレイヤーにそのタイルをペイントします。エンジンには Assets/OpenMon/Game/Prefabs/World/Water/Water/WaterEncounterTile.prefab のような既製のものが含まれています。

ステップ 2:WildEncountersSet​

Assets > Create > MCE > Battle > Encounters > WildEncountersSet(または Hub の Database タブの New Wild Encounter Set)で作成します。セットには 3 つのリストがあります。

リスト意味
Base Encounters常に出現するモンスター
Encounters Per MomentNight、Dawn、Day、Dusk ごとの追加モンスター
Encounters Per Weatherバトル外の天候(Sunny、Rain、Fog、Sandstorm、Snowstorm)ごとの追加モンスター

ある時点での出現可能なエンカウントは、基本リストに、現在の時間帯のエントリと現在の天候のエントリを加えたものです。

各エントリは WildEncounter です。

フィールド説明
MonsterMonsterEntry への参照
Form Calculatorどのフォームが出現するかを決めるアセット(後述)
Min Level / Max Levelレベル範囲(1〜100。最大値は最小値を下回りません)
Weightこのエントリの相対的なウェイト(高いほど出やすい)

ステップ 3:マップの SceneInfo​

マップの SceneInfo アセットが、エンカウントタイプとセットを結び付けます。その Encounters グループで、タイプごとにエントリを 1 つ追加します:Grass → 草のセット、Surfing → 水のセット、など。エントリのないタイプには野生モンスターがいません。同じアセットは、タイプごとに次のものも保持できます。

  • バトルシナリオ(その種類のエンカウントのバトル背景/地形。未設定ならタイル自身のデータを使用)
  • マップ独自のエンカウント確率(後述)
  • ここでつりができるか、およびシーンがダンジョンかどうか

確率の計算​

ウェイトは相対値で、パーセンテージではありません。システムはすべてのウェイトを合計し、各エントリの確率は、そのウェイトを合計で割ったものになります。

Chance = Entry Weight / Sum of All Weights
モンスターウェイト実際の確率
Leafpup4040/100 = 40%
Windling3030/100 = 30%
Silkworm2020/100 = 20%
Sparkbit1010/100 = 10%

1 歩あたりのエンカウント確率​

一歩でそもそもエンカウントが発生するかどうかは、別の 2 つ目の判定です。

  • グローバルな確率は、MCESettings アセットの TileEncounterChance テーブルで、エンカウントタイプごとに 1 つの値(0〜1)があります。テーブルにないタイプは 0 として扱われ、一度だけ警告が記録されます。
  • マップは、SceneInfo の独自の確率(OwnEncounterChances)でタイプごとに上書きできます。そのタイプでは、走る(デフォルト 1)と自転車(デフォルト 0.8)にもマップの倍率が使われます。独自の確率がない場合、グローバルルールにより自転車では判定が同じ 0.8 倍に下がります。
  • EncountersWithModifiableChances(MCESettings)に挙げられたタイプでは、パーティの先頭モンスターの特性と持ち物が確率に倍率をかけます(たとえば、野生エンカウントを減らすアイテム)。
  • エンカウントフルートのアイテムは、次のマップ変更まで確率を変化させます。
  • つりは、使用したつりざおに対するマップ独自の確率を使い、それがなければ必ず魚がかかります。

野生の色違いの確率は、MCESettings の WildShinyChance(デフォルトは 1/512)です。

時間帯と天候のエンカウント​

時間帯は TimeManager.DayProgress(ゲーム内の 1 日にわたって 0〜1。1 日の長さは MCESettings の DayLengthInSeconds)に従います。

時間帯時刻
Dawn05:00 - 06:59
Day07:00 - 16:59
Dusk17:00 - 18:59
Night19:00 - 04:59

特定の時間帯(または天候)にのみ現れるモンスターは、同じセットの Encounters Per Moment(または Per Weather)リストに入れます。別のアセットは不要です。

フォームによるエンカウント​

WildEncounter は、Form Calculator を通じてフォームを選びます。これは 2 つのメソッドを持つ EncounterFormCalculator アセットです。GetEncounterForm(sceneInfo, encounterType) は出現させるフォームを返し、GetAllPossibleForms() は生成しうるすべてのフォームを列挙します(図鑑がこれを使います)。

MCE には、常に固定の 1 つのフォームを返す SingleFormEncounter(Create > MCE > Battle > Encounters > Calculators > SingleFormEncounter)が付属しています。地方やカレンダーに依存するフォームには、EncounterFormCalculator をサブクラス化します。

[CreateAssetMenu(menuName = "MyGame/Encounters/Form By Region")]
public class FormByRegion : EncounterFormCalculator
{
[SerializeField] private Region NorthRegion;
[SerializeField] private Form NorthForm;
[SerializeField] private Form SouthForm;

public override Form GetEncounterForm(SceneInfo sceneInfo, EncounterType encounterType) =>
sceneInfo.Asset.Region == NorthRegion ? NorthForm : SouthForm;

public override List<Form> GetAllPossibleForms() => new() { NorthForm, SouthForm };
}

特殊なエンカウントのパターン​

つり​

つりのエンカウントには、マップの SceneInfo の CanFishHere と、その Encounters グループにあるつりざおタイプ(FishingOldRod、FishingGoodRod、FishingSuperRod)ごとの WildEncountersSet が必要です。プレイヤーが使うつりざおによって、どのセットが対応するかが決まります。

伝説/一度きりのエンカウント​

一度だけ発生させたい特別なエンカウントの場合:

  1. ランダムエンカウントの代わりに、SingleWildFight ノードを持つ CommandGraph イベントを使います。
  2. ゲーム変数(たとえば LegendaryDefeated)に対する IfBool ノードで保護します。
  3. バトルの後、SetBoolVariable で変数を設定し、再遭遇を防ぎます。
  4. この方法なら、エンカウントの状況(カットシーン、会話、地形)を完全に制御できます。

ダブル野生バトル​

DoubleWildFight ノードは、CommandGraph から 2 体の野生モンスターとのダブルバトルを開始します。

むしよけとエンカウント防止​

プレイヤーはアイテムを使ってエンカウントを防げます。むしよけは、歩数の RepelAmount を持つ Repel アイテムで、UseRepel エフェクトを通じて使われます。

アイテム効果
むしよけ(任意の Repel アイテム)RepelAmount 歩の間、パーティの先頭モンスターのレベルより低いエンカウントをキャンセルする

むしよけは、プレイヤー上の歩数カウンター(repelCounter、1 歩ごとに進む)として実装されています。判定は、エンカウントが選ばれレベルが決まった後に行われます。カウンターが 0 より大きく、レベルが先頭より低ければ、エンカウントはキャンセルされます。パーティの先頭モンスターの特性もエンカウントをキャンセルできます(ShouldPreventEncounter)。各むしよけアイテムの歩数は、そのアセットで決めます。

オンラインプレイ​

MMORPG レイヤーでは、エンカウントはサーバーが決定します。クライアントがシーン名とエンカウントタイプを添えて問い合わせ(StartWildEncounter)、サーバーが種とレベルで応答します。サーバーが拒否した場合、エンカウントはキャンセルされ、ローカルで解決されることはありません。バトル権限 を参照してください。

ベストプラクティス​

  1. エンカウント確率のバランスを取る。高すぎる(>25%)と煩わしく、低すぎる(<5%)とワールドが空虚に感じられます。8〜15% が一般的です。
  2. 進行に合わせてレベルをスケールさせる。1 番道路はレベル 50 ではなく、レベル 2〜5 のモンスターにします。
  3. マップごとにエンカウントテーブルを変える。各ルートに個性を持たせます。
  4. レアなエンカウントを含める。テーブルごとに低ウェイトのエントリを 1 つ入れると、プレイヤーに探す楽しみができます。
  5. 時間帯のエンカウントをテストする。特定の時間にプレイしても、ペナルティを感じさせないようにします。
  6. むしよけは早めに配置する。ゲーム中盤の前にエンカウントを制御できると、プレイヤーに喜ばれます。