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

モンスター捕獲 MMORPG を作る

PokeMMO は、プレイヤーが、捕まえ、戦い、取引し、交流できる永続的なオンラインワールドを求めていることを証明しました。その体験をゼロから作るのに、PokeMMO のチームは 10 年以上の開発を要しました。

稼働中のオンラインワールド

Hub の Online タブ

チャンネルの帯、近くのプレイヤー数、遅延バッジはモックアップではありません。 Nakama サーバーに接続したクライアントそのものであり、下の Hub のタブは、それをあなたのサーバーに向ける場所です。

OpenMon の Pro、Source、Studio には、モンスター捕獲 MMO のバックエンドを提供する、25 の統合サービスが含まれています。世界中のスタジオが使うオープンソースのゲームサーバー、Nakama が動力です。

Pro、Source、Studio エディションで利用できます。

得られるもの​

Pro エディションは、OpenMon のシングルプレイヤーのエンジンを、マルチプレイヤーのバックエンドで拡張します。各サービスは NakamaManager.Instance のパブリックプロパティで、それぞれに専用のガイドがあります。

モジュールサービス(NakamaManager のプロパティ)ガイド
認証Auth、SessionMgr -- メール、デバイス、SSO(Discord、Google、Apple)のログインと、セッションの永続化および自動再接続認証
ワールドWorldSync、Channels -- リアルタイムの共有オーバーワールド、マップごとに 1 マッチ、サーバー側の関心領域、チャンネルワールド同期
バトルMatchmaker、PvpBattle、Spectator、Raids -- サーバー権威の野生バトルと PvP バトル、ELO マッチメイキング、観戦、5 人のレイドPvP バトル、バトル権限
ソーシャルChat、Guilds、Friends、Trade -- チャンネルとささやき、役職付きのギルド、フレンドとプレゼンス、アトミックなプレイヤー間取引ソーシャル
経済Wallet、Shop、GTL、Gts、Inventory -- サーバー権威の通貨、ショップ、Global Trade Link マーケットプレイス、Global Trade Station経済
ハウジングHousing、BaseSync、Gym -- 他人が訪問できるシークレットベース、ベース内でのライブな同席、挑戦できるプレイヤージムプレイヤーハウジング
永続化CloudSave -- 競合検出付きの、サーバー側のセーブ保存LiveOps
LiveOpsEvents、Leaderboards、Achievements、Mods -- ライブイベント、ランキング、実績、Mod の読み込みLiveOps
運用AntiCheatManager、GameMasterService -- チート対策のチェック、そして稼働中のサーバーをテスト・運用するためのゲームマスターコンソールGM モード
表現周囲のプレイヤーに見える感情バルーンオンラインエモート
モンスターギフトサーバーが生成する、最初のパートナーと NPC のギフトモンスターギフト

アーキテクチャの概要​

┌─────────────┐     WebSocket      ┌──────────────┐
│ Unity Client │ ◄──────────────► │ Nakama Server │
│ (OpenMon) │ │ (Docker) │
└─────────────┘ └──────┬───────┘
│
┌──────┴───────┐
│ PostgreSQL │
│ (Game Data) │
└──────────────┘

クライアントは、リアルタイム通信のために WebSocket で Nakama に接続します。すべての権威あるゲームロジックは、RPC(リモートプロシージャコール)を通じてサーバー側で動作し、オーバーワールドは Go のプラグインで動作します。PostgreSQL が永続データを保存します。

はじめに​

ステップ 1:サーバーをセットアップする​

サーバーはバンドルとして配布されます。Hub の Online タブで Extract Server Bundle を押し、Docker で起動します。

cd path/to/OpenMon-Nakama-Server
docker compose up -d postgres nakama

バンドルの docker-compose.yml は、Nakama と PostgreSQL があらかじめ設定されています。これで、約 1 分でローカルの開発サーバーが得られます。Hub の Online タブには、Docker スタック用の Start Server、Stop Server、Show Logs ボタンもあります。

本番では、任意のクラウドプロバイダーにデプロイできます。Nakama は次に対応しています。

  • Heroic Cloud(マネージド、最も簡単)
  • AWS / GCP / Azure(セルフホスト、完全な制御)
  • DigitalOcean / Hetzner(低予算の VPS)

詳細は オンラインセットアップ を参照してください。

ステップ 2:クライアントを設定する​

Unity で、OnlineConfig アセットを設定します。

  1. OpenMon Hub(Tools > MCE > OpenMon Hub)→ Online タブ → Online Setup Wizard を開きます
  2. サーバーの URL を設定します(デフォルト:開発用は 127.0.0.1:7350)
  3. サーバーキーを設定します(デフォルト:開発用は defaultkey)
  4. 設定アセットは Resources フォルダー(Assets/Resources/OnlineConfig.asset)にあり、自動的に読み込まれます

ステップ 3:オンラインモードを有効にする​

プロジェクトに MCE_ONLINE スクリプティング define シンボルを追加します(または、Hub の Welcome タブの Setup Online ボタンを使うと、代わりに行ってくれます)。

  1. Edit > Project Settings > Player > Scripting Define Symbols
  2. MCE_ONLINE を追加します
  3. NakamaManager シングルトンは、最初のシーンのロード時に自動的に作成されます

ステップ 4:サーバーをシードする​

新しいサーバーは、あなたのゲームを知りません。バトルの結果を判断する前に、データをエクスポートして送ってください。種のシーディング と Hub の Seeding タブを参照してください。

ステップ 5:接続をテストする​

Play Mode に入ります。コンソールには、次のような行が表示されます。

[MCE Online] Connected as <DisplayName> (<UserId>)

2 つ目の Unity エディターのインスタンス(またはスタンドアロンのビルド)を開いて、2 つのクライアントでマルチプレイヤー機能をテストします。

主要な機能を構築する​

PvP バトルシステム​

OpenMon の PvP バトルはサーバー権威です。サーバーがすべての技を検証し、チートを防ぎ、切断を処理します。

// Look for an opponent of a similar rating
await NakamaManager.Instance.Matchmaker.StartSearchAsync(eloRating: 1200, tier: "any");

NakamaManager.Instance.Matchmaker.OnMatchFound += (matchId, opponent) =>
{
// the authoritative battle then runs in a shared server-owned match
};

マッチメイキングシステムは、プレイヤーの ELO の周りのレーティング範囲で検索し、検索のキャンセルに対応します。観戦と 5 人のレイドは同じモジュールにあります:PvP バトル を参照してください。

取引システム​

サーバーが検証する取引は、アイテムの複製を防ぎ、公平な交換を保証します。

var trade = NakamaManager.Instance.Trade;

string tradeId = await trade.RequestTradeAsync(partnerId);
await trade.OfferMonsterAsync(tradeId, monsterId);
await trade.OfferItemAsync(tradeId, "rare_candy", 5);

// Both players confirm; the server then executes the trade atomically
await trade.ConfirmTradeAsync(tradeId);

ギルドシステム​

GuildInfo guild = await NakamaManager.Instance.Guilds.CreateGuildAsync(
name: "Gym Leaders United", tag: "GLU", description: "Welcome!");

// Guilds have roles (promote, kick), search and member limits

プレイヤーハウジング​

ハウジングにより、プレイヤーは個人の空間をカスタマイズできます。

  • シークレットベースを作り、カタログから装飾する
  • フレンドに訪問してもらう(保存されたスナップショット、またはベース内でライブに一緒に)
  • 他のプレイヤーのジムに挑戦する
  • 3 つのレイヤーについては プレイヤーハウジング を参照

経済とマーケットプレイス​

サーバー権威の経済は、インフレと搾取を防ぎます。

  • ウォレットとショップ -- サーバーが残高を所有し、アイテムの価格を決める
  • Global Trade Link(GTL) -- プレイヤーがモンスターとアイテムを出品し、ほかのプレイヤーが検索して購入する。出品料と有効期限がある
  • Global Trade Station(GTS) -- モンスターを預け、見返りに別の種類を求める

ゲームマスターコンソール​

GM モード の動詞を使って、エディターまたはゲーム内から、稼働中のサーバーを運用・テストします。

本番向けのスケーリング​

スケールのためのサーバーアーキテクチャ​

オーバーワールドは、プレイヤーあたりのコストが安くなるように作られています。サーバーは、各クライアントに、見えるものだけを含む 1 ティックあたり 1 つのバッチを送ります。以下の規模の目安は、約束ではなく計画の指針です。ご自身のデプロイで計測してください。

同時接続プレイヤー数インフラ
1-500単一の Nakama + PostgreSQL
500-5,000Nakama クラスター(2〜3 ノード)+ マネージド PostgreSQL
5,000-50,000オートスケールする Nakama クラスター + リードレプリカ
50,000+リージョナルクラスター + グローバルなマッチメイキング

ホスティング費用(概算)​

規模月額費用
開発$0(ローカルの Docker)
ソフトローンチ(100 CCU)$20-50/月(VPS)
運用中(1,000 CCU)$100-300/月
成長期(10,000 CCU)$500-2,000/月

これらはおおまかな見積もりです。実際の費用は、サーバーの場所、データ転送量、データベースのサイズによります。

PokeMMO が作ったもののうち、含まれるもの​

機能PokeMMO(独自開発、10 年以上)OpenMon Online(含まれる)
リアルタイムのワールド独自の Java ネットワーキングマップごとの Nakama マッチ、サーバー側の関心領域
PvP バトル独自のバトルサーバーサーバー権威の PvP
取引独自の取引プロトコル検証済みの取引サービス
チャット独自のチャットサーバーNakama のチャットチャンネル
経済独自のマーケットプレイスGTL / GTS のマーケットプレイス + ウォレットとショップ
チート対策独自のサーバー検証サーバー権威のロジック
ギルド独自のギルドシステムNakama のグループ + 拡張

制限と、正直な期待値​

MMO を作るのは大変です。OpenMon Pro は技術的なインフラを担いますが、それでも次のことは自分で行う必要があります。

  • 魅力的なコンテンツをデザインする -- MMO がプレイヤーを維持するには、継続的なコンテンツが必要です
  • コミュニティをモデレートする -- チャットのモデレーション、BAN の仕組み、プレイヤーの通報
  • サーバーを保守する -- アップデート、監視、バックアップ、スケーリング
  • 経済のバランスを取る -- 実際のお金とゲーム内通貨の経済
  • 運営を行う -- カスタマーサポート、バグのトリアージ、ライブイベント

MMO は製品ではなくサービスです。継続的な取り組みに備えてください。

次のステップ​