2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SinglePlayerTransport で Co-op対応ゲームをそのままシングルプレイ対応する

Last updated at Posted at 2025-12-15

Netcode for GameObjects(NGO)でオンライン Co-op 対応のゲームを作っていると、次にこう思うことがあります。

シングルプレイも同じゲーム内容で遊ばせたい

しかし実際には、

  • シングル用に別実装を作る
  • ネットワーク処理を無効化する
  • Co-op用コードを分岐する

など、手間が増えがちです。

SinglePlayerTransport を使うと、この問題はかなり雑に解決できます。

前提

この記事ではNetcodeの入門は行いません。

  • Netcode for GameObjectsを既に使用している
  • NetworkVariablesでデータの同期をしている
  • RPCサーバーとクライアント間でメッセージングを行っている
  • NetworkObjectNetworkSceneManager でオブジェクトやシーンの管理をしている
  • NetworkManager.ServerTimeで時間を管理している
  • Netcodeを使用したCo-opの作り方を把握している

という前提です。

Netcodeにおける Transport とは

SinglePlayerTransport について話す前に、Transportとは何ぞやという話をします。

NetcodeにおけるTransportは 「Netcodeが内部でデータを伝達するための最下層」 です。
具体的には RPCNetworkVariables などの変更を、実際に各クライアントへ伝播させるためのレイヤーです。

普段はあまり意識しませんが、Transport では主に、

  • データの送信と受信
  • クライアントの接続と切断
  • (使用する方式に応じた)データの破損や遅延のチェック

といった処理を担当しています

言うならば、Transport は、
RPCNetworkVariable の変更を、 実際に配送するための下位レイヤーです。

多くの場合は Unity TransportRelay Transport を使用していると思います。NetworkManagerから最初に設定するアレです。

image.png

SinglePlayerTransportとは

SinglePlayerTransport はNetcode 2.4(2025年6月頃)から追加された Transport です。

特徴は以下の通り

  • ネットワーク通信を行わない(通信処理を疑似的に再現する)
  • 物理的なサーバーを立てず、外部との接続しない
  • 内部でメッセージングするだけ
  • Host 専用の Transport

つまり、 Netcodeの世界を完全にローカルで閉じるTransport です。

重要な点として、RPCNetworkVariable などの同期機能をはじめ、

  • NetworkSpawnManager.InstantiateAndSpawn
  • NetworkSceneManager.LoadScene
  • NetworkBehaviour の各種コールバック

といった Netcode の主要な機能を、サーバーを立てずにそのまま使用できる という点があります。

SinglePlayerTransport を知るまでは、オンラインとローカルの両対応を行おうとすると、

  • メッセージング処理
  • コールバックの分岐
  • データ同期フロー

などを、オンライン用/オフライン用にレイヤーで分けたり調整したりと、
正直かなり面倒な実装をしていました。

シングルプレイでは過剰になりがちな UnityTransport の処理を、
軽量に置き換えるための 非常に良いオプション だと言えそうです。

使い方

SinglePlayerTransportの使い方ですが、NetworkManagerSelectTransport で設定するだけです。これで自動的に SinglePlayerTransport コンポーネントが追加されます。

image.png

問題はオンライン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についての説明

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?