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

Pokemon Essentials プロジェクトのインポート

数か月、あるいは数年かけて作ってきた Pokemon Essentials プロジェクトがありますか?OpenMon の Essentials Importer は、PE v20、v21、v21.1 のプロジェクトデータを OpenMon 形式に変換します。あなたの作業を保ちながら、Unity のフルプラットフォーム対応と商用ライセンスを利用できるようになります。

OpenMon Hub の Importer タブ

インポート後の Database Browser

2 枚目のスクリーンショットが、このパイプライン全体の到達点です。667 / 667 Monsters が、種、技、特性、アイテム、タイプ、性格で閲覧できます。1 時間前までは Ruby スクリプトと PBS テキストファイルだったプロジェクトからです。

Indie、Pro、Source、Studio エディションで利用できます(Indie と Pro ではコンパイル済み)。

実際の v21.1 プロジェクトで検証済み​

インポーターは、完全な Pokemon Essentials v21.1 プロジェクト(2023-07-30 リリース)に対してヘッドレスで実行され、すべてのリストをエンドツーエンドでエラーゼロで変換しました。

データ結果
種898 / 898 変換、エラー 0 — フォームオーバーライド 335 件を適用、進化 422 件をリンク
技Move アセットを新規に 150 件作成、既存の技ライブラリと 590 件が一致
特性72 件作成、195 件が一致
アイテムItem アセットを 315 件作成、378 件が一致
トレーナー手持ちが設定された 20 人のトレーナー(72 種のトレーナータイプを処理)

898 種すべてが、フォームと進化チェーンをリンクした本物の MCE ScriptableObject に変換され、致命的なエラーはありませんでした。これがインポーターの最大の主張です。合成フィクスチャではなく、完全な本物の v21.1 プロジェクトに対して検証済みです。実行時に出た 227 件の警告は、すべて正直な劣化の通知(MCE に厳密に一致するテンプレートがない技の効果。後述の技を参照)であり、データが黙って失われたことは一度もありません。

インポートされるもの​

Essentials Importer は次のデータ型を扱います。

PE のデータOpenMon での対応物状態
PBS/pokemon.txtMonsterEntry ScriptableObject対応(実際の v21.1 で 898/898)
PBS/pokemon_forms.txtForm アセット + DataByFormEntry オーバーライド対応(335 件のオーバーライドを適用)
PBS/moves.txtMove ScriptableObject対応、正直な効果マッピング
PBS/types.txtMonsterType アセット + 相性表対応
PBS/abilities.txtAbility ScriptableObject対応(アセットレベル)
PBS/items.txtItem ScriptableObject対応(具体的な SO を生成)
PBS/trainers.txtTrainerDefinition + CharacterData + Roster + Bag対応
PBS/encounters.txtWildEncountersSet ScriptableObject対応
モンスターのスプライトバトル用 Material + アイコン Sprite対応(フォームごと + 性別バリアント)
マップファイル (.rxdata)GridController 付きの Unity シーン対応(プロジェクトレベルの検証が必要)
タイルセット画像Unity スプライトアトラス対応
マップイベントコマンドCommandGraph ノード対応(トレーナーバトルを接続済み)
オーディオファイルAudioManager 設定付きの AudioClip直接コピー

手作業が必要なもの​

PE の一部の機能には、直接の自動変換がありません。曖昧なままにせず、正直で意図的な限界として文書化しています。

  • CommonEvents.rxdata — コモンイベントは設計上、対象外です。インポートされません。共有イベントのロジックは、CommandGraph または C# に手動で移植してください。
  • 特性の挙動 — 特性のアセットは作成または複製されますが、インポートされた特性は、それが対応づけられた MCE 実装と同じ豊かさでしか動作しません。カスタム特性やプラグインの特性には、対応する MCE の Ability 実装が必要です。
  • 複雑な Ruby スクリプト — 標準のイベントコマンドを超える PE のカスタムスクリプトは、C# または CommandGraph への手動移植が必要です。
  • プラグイン固有のデータ — サードパーティの PE プラグインは、非標準の形式でデータを保存します。
  • カスタム UI レイアウト — PE のウィンドウシステムは Unity UI とは根本的に異なります。
  • アニメーションするバトルスプライト — PE は異なるアニメーション形式を使います。スプライトは静止フレームとしてインポートされ、再構成できます。

前提条件​

インポートする前に、次のものを用意してください。

  1. OpenMon がインストール済み(Indie エディション以上) — インストールガイド を参照
  2. ディスク上でアクセスできるPE プロジェクトフォルダー(PBS/ と Data/ を含むもの)
  3. Unity プロジェクトのバックアップ。 ウィザード自身も述べています。インポーターは実験的で、現状有姿で提供され、一部の機能は部分的(Items)または未実装(Common Events)です。

Essentials のバージョン(v20、v21、v21.1)は選択しません。プロジェクトをスキャンしたときにインポーターが検出します。

ステップバイステップのインポート​

ステップ 1:インポーターを開く​

Unity で OpenMon Hub(Tools > MCE > OpenMon Hub)を開き、Importer タブ → Import Wizard を選びます。

Import Wizard、Full Reimport、Project Combiner、Starting Map Picker、Display Mode per Map、HD dex のインポートを備えた OpenMon Hub の Importer タブ

同じタブのさらに下にある Starting Map Picker は、見落とされがちなステップです。メインメニューの後にプレイヤーがどのマップでスポーンするかを決めます。これがないと、ほかは成功したインポートでも開始する場所がありません。

ウィザードのウィンドウには次が表示されます。

  • PE Project Folder — プロジェクトのルートフォルダー(PBS/、Data/、Graphics/ を含むもの)。Browse ボタン付き
  • Project Name — このインポートの名前(たとえば FRLG や Emerald)。出力フォルダー名になるため、複数のインポートを並べて置けます
  • Imported Projects — この Unity プロジェクトにすでにあるインポート
  • Import Categories — データ型ごとのトグル
  • Map Display Mode — インポートしたマップを 2D(上から見た平面)または 2.5D(傾けたカメラの下)で描画します。各マップは後から Display Mode per Map で変更できます
  • Output Folder と Overwrite Existing Assets

ステップ 2:PE プロジェクトを選択してスキャンする​

Browse をクリックして Pokemon Essentials プロジェクトのフォルダーを選び、Scan Project を押します。インポーターはフォルダー構造を検証し、検出された Version を表示し、見つかったものを報告します。

PBS/pokemon.txt        -- 898 species detected
PBS/moves.txt -- 740 moves detected
PBS/types.txt -- 19 types detected
PBS/abilities.txt -- 267 abilities detected
PBS/items.txt -- 693 items detected
PBS/pokemon_forms.txt -- 339 form overrides detected
PBS/trainers.txt -- 20 trainers detected

(表示されている数は、インポーターの検証に使った実際の v21.1 2023-07-30 プロジェクトのものです。)

スキャンでは、プロジェクトのオートタイルのディープスキャンも実行されます。タイルセットが指定する画像がすべてプロジェクトにある場合、スキャンは [OK] Missing: 0 - All autotile images found! で終わります。画像が欠けていても、この時点ではまだ判定されません。判定はマップの解析が済んでから行われます(コマンドライン節の終了コードの注記と、ステップ 5 のログの凡例を参照)。

ステップ 3:インポートするものを選ぶ​

Import Categories には、Species、Moves、Items、Abilities、Types、Trainers、Encounters、Maps、Sprites、Follower Sprites、Audio、Connections それぞれのトグルがあります。

最初のインポートでは、段階に分けて行うことをおすすめします。

  1. 1 回目: Types、Abilities、Moves、Species(データのみ、マップなし)
  2. 2 回目: Items、Trainers、Encounters
  3. 3 回目: Maps と Audio
  4. 4 回目: イベントとシーン統合を確認する(後述)

この段階的な方法により、各データ層を検証してから、その上に積み上げられます。

ステップ 4:インポートを実行する​

ウィザードはフェーズごとに動作し、それぞれに専用のボタンがあります。

ボタン動作
PARSE DATAフェーズ 1〜2:検出された Essentials のバージョンに従い、PBS テキストファイルと .rxdata のマップ・タイルセットを読み取ります。プロジェクトにはまだ何も作成されません。
CONVERT TO MCEフェーズ 3:解析したデータを、出力フォルダー配下の MCE ScriptableObject とシーンに変換します。解析が成功した後に有効になります。
FULL IMPORT (Parse + Convert)解析、変換、統合を一度に行います。
INTEGRATE SCENES (Phase 6)インポートしたシーンを MCE ランタイムに接続します。シーンマネージャーへの登録、各 SceneInfo の接続、ワープトリガーの配置、エンカウントセットのリンク、シーンの Build Settings への追加を行います。インポートの後に実行してください(フルインポートはすでに実行します)。

すべては Assets/ImportedGames/<Project Name>/ に書き込まれ、成功、警告、要確認の項目を示す詳細なインポートログが出力されます。

ステップ 5:インポートログを確認する​

ログは結果を次のように分類します。

  • [OK] — データが正常に変換された
  • [WARN] — 仮定を伴って変換された(例:MCE に厳密に一致するテンプレートがなく、カテゴリで複製された技の効果)。または、何も失われない残りもの(タイルセットがプロジェクトに含まれていないオートタイル画像を指定しているが、そのタイルセットをどのマップも使っていない)
  • [ERR] — 自動的には変換できなかったデータ(少なくとも1つのマップが使うタイルセットが指定していて、プロジェクトに含まれていないオートタイル画像を含む)

ステップ 6:ゲームをプレイ可能にする​

統合の後、別の開始マップにしたい場合は Starting Map Picker を使います。ウィザードの Restore MCE Original Demo と Restore Imported Demo ボタンは、Build Settings をデモシーンとインポートしたシーンの間で切り替えます。

破壊的なボタン

DELETE ALL IMPORTED PROJECTS は、インポートしたすべてのプロジェクトフォルダーとプロファイルを削除します。押す前にバックアップを取ってください。

ステップ 7:商用利用のために名前を変更する​

このステップは商用リリースに不可欠です。

PE プロジェクトでは、モンスター、キャラクター、アイテムにポケモン固有の名前を使っている可能性が高いです。ゲームを販売する前に、これらをオリジナルの名前に置き換える必要があります。Database Browser を使って、インポートしたデータを確認し、名前を変更します。

  1. OpenMon Hub(Tools > MCE > OpenMon Hub)を開き、Database タブ → Database Browser を選びます
  2. インポートした種データベースを検索します
  3. 各エントリの表示名をオリジナルの名前に変更します
  4. アセットはオブジェクト参照で参照されているため、エンカウントテーブル、トレーナーの手持ち、進化チェーンは名前を変更した後も機能し続けます

技名と特性名は、一般にそのままで安全です(知的財産ではなく仕組みを表すため)が、ポケモン固有のブランドを含むモンスター名、キャラクター名、アイテム名は変更しなければなりません。

パイプラインがインポートするもの(ステップごと)​

Parse(フェーズ 1〜2) は、次の順序で読み取ります:タイプ、特性、技、アイテム、種、トレーナー、エンカウント、マップ接続、マップメタデータ、タイルセット、マップ。

Convert(フェーズ 3) は、次のステップを実行します(各ステップは、そのカテゴリがオフのときはスキップされます)。

  1. すでに存在する MCE アセットをスキャンし、一致するものを重複させずに再利用する。
  2. 不足している技と特性を、複製と設定によって作成する。
  3. 種をフォームと進化とともに変換する(この時点ですべての技と特性が存在している)。
  4. 一致しなかった参照を報告する。
  5. PE の Graphics/ フォルダーからスプライトをリンクし、プロジェクトにあればフォロワースプライトもリンクする。
  6. 中央のモンスターデータベースを再構築し、タイプを変換し、25 種の性格が存在することを確認し、アイテムとトレーナーをエクスポートする。
  7. タイルセットを Unity のタイルアセットにスライスし、オートタイルをベイクする。
  8. マップを Unity シーンに変換し、その接続を結ぶ。
  9. エンカウントを WildEncountersSet アセットに変換する。
  10. オーディオ(BGM、BGS、ME、SE)、オーバーワールドキャラクターのスプライト、バトルバック画像、トレーナースプライトをインポートする。
  11. ワープとイベントデータを抽出し、イベントコマンドを CommandGraph に変換する。

Integrate(フェーズ 6) は、上の表で説明したとおりにシーンを登録・接続・追加します。

各データ型の変換方法​

スプライトとバトル用マテリアル​

実際の Essentials パックは、モンスターのスプライトを図鑑番号ではなく INTERNALNAME で命名しています。SpriteLinker は内部名でスプライトファイルを照合し、アートをフォームごとにリンクし、性別バリアントを尊重します。デフォルトのアートフィールドにはメス/性別なしのスプライト({name}_female.png)が入り、別のオスのオーバーライドフィールドにはベーススプライトが入ります。

重要なのは、リンカーが 4 つの面(Front、Back、Front-Shiny、Back-Shiny)それぞれのバトル用 Material とアイコンスプライトを生成することです。MCE のバトルモデルはスプライトを Material(フリップブックシェーダー)経由で参照するため、このステップがなければ、インポートしたモンスターはバトルで見えません。スプライトのリンクは、スプライトを有効にしてインポートしたときに実行されます。

技(正直な効果マッピング)​

技の効果は、Essentials の FunctionCode に由来します。インポーターは 307 種類の FunctionCode を具体的な MCE の技テンプレートに対応づけています(MoveConverter.FunctionCodeTemplates で検証済み)。このマッピングは複数のバッチにわたって拡張され、2 ターン技/溜め技や威力補正技を扱う残余パスも含みます。

テーブルにない FunctionCode は正直に劣化します。技は引き続き作成され、ダメージカテゴリで複製され、目に見える警告が記録されます(unmapped FunctionCode '…'. Cloned by category only.)。これは意図的です — 劣化は決して黙って行われません。忠実な MCE テンプレートが存在しない場合には、誤った複製よりも正直なフォールバックのほうがよいため、一部のコードは意図的に未対応のままにしています。

アイテム​

ItemConverter は、解析したすべてのアイテムに対して具体的な MCE Item ScriptableObject を生成し(冪等性のため、名前が一致する既存の MCE Item は再利用)、参照用に PE の生データを JSON としてエクスポートします。MCE がモデル化できないアイテム効果は警告としてログに記録され、アイテムは効果のないバッグアイテムとして引き続き作成されます。

トレーナー​

trainers.txt 内で繰り返される Pokemon = SPECIES,level ブロックは正しく解析されます(よくある落とし穴:重複するキーは折りたたまれずに保持されます)。TrainerConverter は、各トレーナーに対して TrainerDefinition、CharacterType、CharacterData、Roster、Bag を作成します。pbTrainerBattle(:TYPE, "Name") を呼び出すマップイベントは、対応するインポート済みの TrainerDefinition に接続されるため、インポートしたトレーナーは実際のランタイムバトルに到達します。

エンカウント​

EncounterConverter は WildEncountersSet アセットを構築し、生の名前、大文字の名前、正規化された名前で種を解決します。句読点や性別記号を含む名前の種も含まれるため、扱いにくい内部名でもエンカウントテーブルは正しいモンスターにリンクされます。

フォームと進化​

フォームのオーバーライドは Form アセットと DataByFormEntry データを作成または再利用します。ベース種が見つからない場合は、成功として数えずに警告します。進化の接続は 2 回目のパス(すべての種アセットが存在した後)として実行され、進化先が解決できるようになり、再インポート時には進化リストを冪等に再構築します。コンバーターは、v21.1 の進化方式ヘッダーの全セット(レベル、時間帯、性別、アイテム、持ち物、交換、技習得、手持ち、急所のバリアント)を MCE の進化コマンドに対応づけます。

コマンドラインからのインポート​

ウィザードを開かずにインポーターを実行する入口が 2 つあります。行う範囲が異なります。

フルインポート:ImportarCompletoDesdeCli​

ウィザードのパイプライン全体(データ、マップ、エンカウント、オーディオ、スプライト、ワープ、イベント、シーン統合)を、FULL IMPORT ボタンとまったく同じように実行します。

Unity.exe -batchmode -projectPath . \
-executeMethod OpenMon.MCE.EssentialsImporter.Editor.EssentialsImporterWizard.ImportarCompletoDesdeCli \
-essentialsProyecto "D:/Games/MyEssentialsProject" \
-essentialsNombre "MyGame" \
-essentialsModo 2.5D
引数意味
-essentialsProyecto <フォルダー>Essentials プロジェクト(PBS/ と Data/ を含む必要があります)
-essentialsNombre <名前>インポートの名前。出力は Assets/ImportedGames/<名前>/ に入ります
-essentialsModo <2D または 2.5D>任意。マップの描画方法。省略時は 2D

既存の出力フォルダーへの上書きを拒否します。パイプラインはそこに書き込みと書き直しを行い、もとの内容が失われてしまうためです。別の -essentialsNombre を選ぶか、古いフォルダーをプロジェクトの外へ移動してください。また、プロジェクトフォルダーが存在しない場合や PBS/ または Data/ がない場合も拒否します。

エディターは、シーンが生成され [ERR] 行が一つもログに記録されなかった場合は終了コード 0、それ以外は 1、開始できなかった場合(引数の欠落、不明なモード、プロジェクトが見つからない、出力フォルダーがすでに存在する)は 2 で自らを終了します。ログ行は [EssentialsCompleto] で始まります。

プロジェクトに含まれていないオートタイル画像を指定するタイルセットは、マップの解析が済んでから判定されます。少なくとも1つのマップがそのタイルセットを使っている場合にだけ [ERR] になります。どのマップも使っていなければ [WARN]("no map uses that tileset, so nothing is lost")となり、インポートは失敗しません。

データのみのインポート:EssentialsHeadlessImport​

CI の場合や、マップは不要でデータベース(種、技、アイテムなど)だけが必要な場合、EssentialsHeadlessImport はウィンドウなしでデータパイプラインを実行します。

Unity.exe -batchmode -quit -projectPath . \
-executeMethod OpenMon.MCE.EssentialsImporter.Editor.EssentialsHeadlessImport.RunCli

RunCli は環境変数から入力を読み取ります。

変数意味デフォルト
MCE_IMPORT_PROJECTEssentials プロジェクトのルート./Pokemon Essentials v21.1 2023-07-30
MCE_IMPORT_OUTPUTUnity からの相対出力フォルダーAssets/ImportedGames/_v21batch
MCE_IMPORT_SPRITESスプライトとフォロワーをリンクする(false、0、no、off でスキップ)オン
MCE_IMPORT_REBUILD_DBプロジェクトの MonsterDatabaseInstance を再構築する(false で手を付けない)オン

まず以前の出力フォルダーをクリアして実行を決定的にし、その後、セクションごとに 1 行のコンパクトなレポートを Logs/v21-batchmode-summary.txt に書き出し、成功なら 0、失敗なら 1 で終了します。

C# からは、代わりに EssentialsHeadlessImport.Run(projectPath, outputPath, importSprites, rebuildDatabase) を呼び出せます。これは実際の数(作成、一致、スキップされた種、技、アイテム、特性、トレーナー)を持つ ImportSummary を返します。

タイプ、特性、技、アイテム、フォームとメトリクスを含む種、スプライト、フォロワー、性格、トレーナーをインポートし、データベースを再構築します。マップ、シーン、タイルセット、オートタイル、エンカウントシーン、オーディオ、オーバーワールド/バトルバック/トレーナーのメディア、イベントコマンドのグラフ、シーン統合は意図的にスキップし、各スキップはサマリーの SkippedSteps に記録されます。

大きなインポートはコマンドラインから実行する

スプライト生成を伴う完全なインポートは、数分間の同期的な AssetDatabase 作業を行います。対話的に行うのではなく、エディターを閉じた状態でバッチモードで実行してください。そうすれば、長いアセット処理がエディターをブロックしません。対話的なインポートは、段階的なデータのみのパスに最適です。

カートリッジのダンプ(HeartGold / SoulSilver、FireRed、Black / White)とそのゲームプロファイルについては、インポートされたゲームとゲームプロファイル を参照してください。

インポート後のチェックリスト​

インポート後に、このチェックリストを順に確認します。

  • Monster Database Editor で種のデータを確認する
  • Type Chart Editor でタイプ相性を抜き取りで確認する
  • インポートしたモンスターと技でいくつかバトルを試す
  • インポートしたマップを歩いて、タイルの衝突を確認する
  • NPC イベントとダイアログの流れを試す
  • ポケモン固有の名前をすべてオリジナルに置き換える
  • 名前を変えたモンスターに自分のスプライトを追加する
  • ゲームの進行に合わせてエンカウントテーブルを設定する
  • ゲームのセーブ形式でセーブシステムを設定する

よくあるインポートの問題​

"Species X has an unknown ability"​

PE ではプラグインでカスタム特性を使えます。インポーターが特性を認識できない場合は、プレースホルダーに対応づけます。その挙動に合わせて、OpenMon でカスタムの Ability アセットを作成してください。

"Map tile Y has no matching collision type"​

PE は、OpenMon の GridController に直接対応しない一部のタイルプロパティを使います。インポーターはタイルを作成しますが、手動での衝突の割り当てが必要なものとしてフラグを立てます。

"Evolution method Z not supported"​

OpenMon は 37 種類の進化タイプに対応していますが、PE のプラグインはカスタムのものを追加することがあります。これらは手動実装のための警告としてログに記録されます。

なぜ移行するのか​

インポートと名前変更の手間は一度きりのコストです。得られるもの:

以前(PE)以後(OpenMon)
Windows のみ7 以上のプラットフォーム
ファンゲームのみ商用リリース
マルチプレイヤーなし25 のオンラインサービスクラスが利用可能
Ruby スクリプト完全な IDE サポートのある C#
自動テストなしNUnit テストフレームワーク
手動デプロイUnity のビルドパイプライン
320x240 の解像度任意の解像度

何年にもわたるあなたの創作 — 築き上げたワールド、デザインしたモンスター、書き上げたストーリー — は、最高の技術で、可能な限り広い観客に届けられるに値します。

サポート​

  • Discord: OpenMon コミュニティに参加する — #essentials-import チャンネルに専用サポートがあります
  • ドキュメント: OpenMon 固有のワークフローについては、ガイド全集を参照してください
  • Issues: インポートのバグは GitHub で報告してください