Netcode for GameObjects(NGO)でオンライン Co-op 対応のゲームを作っていると、次にこう思うことがあります。
シングルプレイも同じゲーム内容で遊ばせたい
しかし実際には、
- シングル用に別実装を作る
- ネットワーク処理を無効化する
- Co-op用コードを分岐する
など、手間が増えがちです。
SinglePlayerTransport を使うと、この問題はかなり雑に解決できます。
前提
この記事ではNetcodeの入門は行いません。
- Netcode for GameObjectsを既に使用している
-
NetworkVariablesでデータの同期をしている -
RPCサーバーとクライアント間でメッセージングを行っている -
NetworkObjectやNetworkSceneManagerでオブジェクトやシーンの管理をしている -
NetworkManager.ServerTimeで時間を管理している - Netcodeを使用したCo-opの作り方を把握している
という前提です。
Netcodeにおける Transport とは
SinglePlayerTransport について話す前に、Transportとは何ぞやという話をします。
NetcodeにおけるTransportは 「Netcodeが内部でデータを伝達するための最下層」 です。
具体的には RPC や NetworkVariables などの変更を、実際に各クライアントへ伝播させるためのレイヤーです。
普段はあまり意識しませんが、Transport では主に、
- データの送信と受信
- クライアントの接続と切断
- (使用する方式に応じた)データの破損や遅延のチェック
といった処理を担当しています
言うならば、Transport は、
RPC や NetworkVariable の変更を、 実際に配送するための下位レイヤーです。
多くの場合は Unity Transport や Relay Transport を使用していると思います。NetworkManagerから最初に設定するアレです。
SinglePlayerTransportとは
SinglePlayerTransport はNetcode 2.4(2025年6月頃)から追加された Transport です。
特徴は以下の通り
- ネットワーク通信を行わない(通信処理を疑似的に再現する)
- 物理的なサーバーを立てず、外部との接続しない
- 内部でメッセージングするだけ
- Host 専用の Transport
つまり、 Netcodeの世界を完全にローカルで閉じるTransport です。
重要な点として、RPC や NetworkVariable などの同期機能をはじめ、
NetworkSpawnManager.InstantiateAndSpawnNetworkSceneManager.LoadScene-
NetworkBehaviourの各種コールバック
といった Netcode の主要な機能を、サーバーを立てずにそのまま使用できる という点があります。
SinglePlayerTransport を知るまでは、オンラインとローカルの両対応を行おうとすると、
- メッセージング処理
- コールバックの分岐
- データ同期フロー
などを、オンライン用/オフライン用にレイヤーで分けたり調整したりと、
正直かなり面倒な実装をしていました。
シングルプレイでは過剰になりがちな UnityTransport の処理を、
軽量に置き換えるための 非常に良いオプション だと言えそうです。
使い方
SinglePlayerTransportの使い方ですが、NetworkManager の SelectTransport で設定するだけです。これで自動的に SinglePlayerTransport コンポーネントが追加されます。
問題はオンラインCo-opとシングルプレイを切り替えたい場合です。これは単純にNetworkManager.NetworkConfig.NetworkTransport に使いたいTransportを設定するだけで切り替えることが出来ます。
[SerializeField] private SinglePlayerTransport _singlePlayerTransport;
[SerializeField] private NetworkTransport _onlineTransport;
private NetworkManager _manager;
public void SetOnlineMode(bool isOnline)
{
_manager.NetworkConfig.NetworkTransport = isOnline ?
_onlineTransport :
_singlePlayerTransport;
}
参照
SinglePlayerTransport追加のアナウンス
SinglePlayerTransportに付いての唯一の資料
Transportについての説明

