Netcode for GameObjects (NGO)

8月くらいに MLAPI が Netcode for GameObjects になるというアナウンスがありましたが, Unity Gaming Services 発表を皮切りに MLAPI が Netcode for GameObjects として改められました. その際,結構な変更点等があったので,個人的にリリースノートの日本語訳を作りました.
MLAPI 0.1.0 は3月にリリースされましたが,それから 7か月経ち,結構バージョンアップされています.
ちなみに Relay の Documentation を見てみると,Netcode for GameObjects が NGO って略されているっぽいです. なんか某ソシャゲっぽい….
追加箇所 (新機能)
- SDKパッケージに
ClientNetworkTransformサンプルを追加 - SDKパッケージに
Bootstrapサンプルを追加 NetworkSceneManagerの実装を強化し,Additive Scene Loading 機能を追加NetworkSceneManager.OnSceneEventによるシーンイベントの通知機能の改善NetworkTransformの実装を強化し,軸やコンポーネントごとの状態の複製や閾値ベースの状態の複製が可能にNetworkTransformに jitter 耐性のあるBufferedLinearInterpolator<T>を追加NetworkPrefabHandlerを実装し,Object Pooling とNetworkPrefab のオーバーライドをサポートNetworkObjectTransformの親の自動同期をネットワーク経由でランタイムに実装- .
editorconfigルールセットに Unity C# Coding Standardsを採用 - クライアントが
NetworkObjectを生成しようとすると、サポートされていない動作を示す例外がスローされるように NetworkTimeとNetworkTickSystemを追加.これにより、時間と Tick の制御が改善NetworkObjectにOnNetworkDespawn関数を追加.この関数はNetworkObjectが Despawn されたときに呼び出され、オーバーライドが可能- 変数や
spawn/despawnメッセージを送信できるようにするSnapshotSystemを追加しました。- spawn/despawn のメッセージを除き,デフォルトでは無効
- 最終的には一貫性のある信頼性の低いメッセージを利用する予定
NetworkBehaviourとNetworkObjectのNetworkManagerインスタンスのオーバーライドをサポート- Multiplayer Toolsパッケージがインストールされている場合,新しいネットワークプロファイラのメトリクスレポートを追加
- 関連する
NetworkObjectが Spawn されているかどうかを素早く(そして安定して)判定できるプロパティNetworkBehaviour.IsSpawnedを追加 NetworkRigidbodyとNetworkRigidbody2Dを追加し,RigidbodyとRigidbody2Dのネットワーク化に対応NetworkObjectReference,NetworkBehaviourReferenceを追加し、RPC/NetworkVariablesでNetworkObject/Behavioursを送信できるようにした #1173Animatorのネットワーク化をサポートするNetworkAnimatorを追加 (Prototype実装だったものが本格実装)
変更箇所
- 最低限のUnityのバージョン:2019.4 → 2020.3+
- パッケージの名前の表示名:MLAPI Netwroking Library → Netcode for GameObjects
- パッケージ名称:
com.unity.multiplayer.mlapi→com.unity.netcode.gameobjects - すべての
MLAPI.xxxxx名前空間はUnity.Netcodeに置換されています.以下が例です.- MLAPI.Messaging → Unity.Netcode
- MLAPI.Connection → Unity.Netcode
- MLAPI.Logging → Unity.Netcode
- MLAPI.SceneManagement → Unity.Netcode
- すべてのアセンブリ定義は、
Unity.Netcode.xxxxxのバリアントで名前が変更されます.以下が例です.- Unity.Multiplayer.MLAPI.Runtime → Unity.Netcode.Runtime
- Unity.Multiplayer.MLAPI.Editor → Unity.Netcode.Editor
- Prototyping名前空間とアセンブリ定義の名前を
Componentsに変更 NetworkObject.Despawn(bool destroy)APIのデフォルトをdestroy = trueに変更して使い勝手を向上NetworkManagerのシーン登録が Build Setttings → Scenes in Build List に変更NetworkSceneManager.SwitchSceneがNetworkSceneManager.LoadSceneに置き換えられましたNetworkManager,NetworkConfig,NetworkSceneManagerのシーン登録がビルドリストのシーンに置換GlobalObjectIdHashがPrefabHashとPrefabHashGeneratorに置き換わり安定性と一貫性が増加NetworkStartがOnNetworkSpawnに名称変更(正直わかりにくかったのでこの変更は助かる)NetworkVariableの共有モードを廃止し,変数はサーバーが権限を持つようになりましたNetworkManagerやその他のシステムがSingleton/staticではなくなったINetworkSerializable.NetworkSerializeメソッドのシグネチャを変更し,NetworkSerializerの代わりにBufferSerializer<T>を使用するように変更CustomMessagingManagerのメソッドがStreamの代わりにFastBufferWriterとFastBufferReaderを使用するように変更- LINQの呼び出しを削除し、Managed Lists / Arrays を Native Collections に置き換えることで内部ランタイムの割り当てを削減
削除箇所
NetworkNavMeshAgentの削除NetworkDictionary,NetworkSetの削除NetworkVariableSettingsの削除(正直煩わしかったので個人的にGood)- 定義済みの NetworkVariable
タイプを削除.以下が例.これからは全部ジェネリック型で書く(そうしたくない場合はNetworkVariableBaseを継承する感じ?) NetworkVariableBoolNetworkVariableByteNetworkVariableSByteNetworkVariableUShortNetworkVariableShortNetworkVariableUIntNetworkVariableIntNetworkVariableULongNetworkVariableLongNetworkVariableFloatNetworkVariableDoubleNetworkVariableVector2NetworkVariableVector3NetworkVariableVector4NetworkVariableColorNetworkVariableColor32NetworkVariableRayNetworkVariableQuaternion
NetworkChannelとMultiplexTransportAdapterの削除- 2019.4 の ILPP バックエンドを削除し、最小必要バージョンは 2020.3+ に
NetworkManager.NetworkConfigの以下のプロパティを削除#1080Scene Registrationsの廃止Allow Runtime Scene Changes(ランタイムシーン変更の許可)が不要になり、削除されました
- NetworkObject.Spawnペ イロードパラメータが削除されました #1005
- MLAPI用のProfiler と組み込みのNetworkProfiler が削除されて,代わりのものがMultiplayer Toolsパッケージに含まれるように(今後 Profiling する場合は Multiplayer Tools を一緒にインストールすること)
UNetTransportのRelayTransportと関連するリレー機能を削除 (Unity Relay を利用する)ServerRpcSendParamsとClientRpcSendParamsからUpdateStageパラメータを削除NetworkBuffer,NetworkWriter,NetworkReader,NetworkSerializer,PooledNetworkBuffer,PooledNetworkWriter,PooledNetworkReaderの削除NetworkConfigのEnableNetworkVariableを削除して,常に有効になるように変更NetworkTransformのFixedSendsPerSecond,AssumeSyncedSends,InterpolateServer,ExtrapolatePosition,MaxSendsToExtrapolate,Channel,EnableNonProvokedResendChecks,DistanceSendrateを削除(正直使ってなかった項目だったし,NetworkTransformの Inspector の見栄えがよくなるのでよい)NetworkManagerのStopServer()、StopClient()、StopHost()メソッドを削除し,全てのNetworkManager.Shutdown()メソッドに置換
修正箇所
MLAPI 0.1.0 での既知の問題の修正など.
- ServerRpcの所有権確認チェックが
Debug.LogWarningではなくDebug.LogErrorになっていたのを修正 NetworkBehaviour.OnGainedOwnership()コールバックの前にNetworkObject.OwnerClientIdプロパティが変化していたのを修正NetworkBehaviourILPPがアセンブリ内の全てのタイプを繰り返し処理するように修正- 外部アセンブリにタイプをインポートすることで asmdef 間の RPC ILPPを修正
- アプリケーションを終了したりシーンを切り替えたりしたときの
NetworkManagerのシャットダウンを修正 NetworkManagerが正しくシャットダウンされ既存のNetworkObjectが破棄されるように修正- エディタ内の
NetworkManagerインスペクタのUIで、PlayerPrefabを1つしか選択できないのを修正 - ホストに対して
ConnectionApprovalが行われないことがあった問題を修正 - メッセージが不正な順序で処理され、エラーが発生することがあった問題を修正
NetworkVariablesがクライアント上で望ましい値で初期化されず、デフォルトで初期化されてしまう問題を修正- 実行時のパフォーマンスを改善し GC の負荷を軽減
- クライアントが表示されていないオブジェクトからデータを受信してしまうのを修正
NetworkTransformの "late join "の問題を修正しNetworkTransformはRPCの代わりにNetworkVariablesを使用するように変更- クライアントが他のプレイヤーのPlayerObjectを取得しようとした際に、サイレントフェイルの例外を投げるように変更(サーバー側でのみ許可)
既知の問題
NetworkVariableがNetworkSerializeの実装によってINetworkSerializable型をシリアライズしないDontDestroyOnLoadとしてマークされたNetworkObjectが一部のネットワークシーンの遷移時に無効になるNetworkTransformがLocal Spaceの同期を切り替える際に原点から補間する- あるオブジェクトの
OnNetworkSpawnユーザーコードで例外が発生すると他のオブジェクトのコールバックができなくなる - RPC で
INetworkSerializableの配列型を送信できない - プロジェクトのパスに特殊な文字が含まれていると ILPP の生成に失敗する