Netcode for GameObjects (NGO) 1.0.0-pre.2 リリースノート

Netcode for GameObjects (NGO)

f:id:xrdnk:20211105162600j:plain

8月くらいに MLAPI が Netcode for GameObjects になるというアナウンスがありましたが,
Unity Gaming Services 発表を皮切りに MLAPI が Netcode for GameObjects として改められました.
その際,結構な変更点等があったので,個人的にリリースノートの日本語訳を作りました.

MLAPI 0.1.0 は3月にリリースされましたが,それから 7か月経ち,結構バージョンアップされています.

xrdnk.hateblo.jp

ちなみに 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 を生成しようとすると、サポートされていない動作を示す例外がスローされるように
  • NetworkTimeNetworkTickSystem を追加.これにより、時間と Tick の制御が改善
  • NetworkObjectOnNetworkDespawn 関数を追加.この関数は NetworkObject が Despawn されたときに呼び出され、オーバーライドが可能
  • 変数や spawn/despawn メッセージを送信できるようにする SnapshotSystem を追加しました。
    • spawn/despawn のメッセージを除き,デフォルトでは無効
    • 最終的には一貫性のある信頼性の低いメッセージを利用する予定
  • NetworkBehaviourNetworkObjectNetworkManager インスタンスのオーバーライドをサポート
  • Multiplayer Toolsパッケージがインストールされている場合,新しいネットワークプロファイラのメトリクスレポートを追加
  • 関連する NetworkObject が Spawn されているかどうかを素早く(そして安定して)判定できるプロパティ NetworkBehaviour.IsSpawned を追加
  • NetworkRigidbodyNetworkRigidbody2D を追加し,RigidbodyRigidbody2D のネットワーク化に対応
  • NetworkObjectReferenceNetworkBehaviourReference を追加し、RPC/NetworkVariablesNetworkObject/Behaviours を送信できるようにした #1173
  • Animator のネットワーク化をサポートする NetworkAnimator を追加 (Prototype実装だったものが本格実装)

変更箇所

  • 最低限のUnityのバージョン:2019.4 → 2020.3+
  • パッケージの名前の表示名:MLAPI Netwroking Library → Netcode for GameObjects
  • パッケージ名称:com.unity.multiplayer.mlapicom.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.SwitchSceneNetworkSceneManager.LoadScene に置き換えられました
  • NetworkManagerNetworkConfigNetworkSceneManager のシーン登録がビルドリストのシーンに置換
  • GlobalObjectIdHashPrefabHashPrefabHashGenerator に置き換わり安定性と一貫性が増加
  • NetworkStartOnNetworkSpawn に名称変更(正直わかりにくかったのでこの変更は助かる)
  • NetworkVariable の共有モードを廃止し,変数はサーバーが権限を持つようになりました
  • NetworkManager やその他のシステムが Singleton/static ではなくなった
  • INetworkSerializable.NetworkSerialize メソッドのシグネチャを変更し,NetworkSerializer の代わりに BufferSerializer<T> を使用するように変更
  • CustomMessagingManager のメソッドが Stream の代わりに FastBufferWriterFastBufferReader を使用するように変更
  • LINQの呼び出しを削除し、Managed Lists / Arrays を Native Collections に置き換えることで内部ランタイムの割り当てを削減

削除箇所

  • NetworkNavMeshAgent の削除
  • NetworkDictionaryNetworkSet の削除
  • NetworkVariableSettings の削除(正直煩わしかったので個人的にGood)
  • 定義済みの NetworkVariable タイプを削除.以下が例.これからは全部ジェネリック型で書く(そうしたくない場合はNetworkVariableBaseを継承する感じ?)
    • NetworkVariableBool
    • NetworkVariableByte
    • NetworkVariableSByte
    • NetworkVariableUShort
    • NetworkVariableShort
    • NetworkVariableUInt
    • NetworkVariableInt
    • NetworkVariableULong
    • NetworkVariableLong
    • NetworkVariableFloat
    • NetworkVariableDouble
    • NetworkVariableVector2
    • NetworkVariableVector3
    • NetworkVariableVector4
    • NetworkVariableColor
    • NetworkVariableColor32
    • NetworkVariableRay
    • NetworkVariableQuaternion
  • NetworkChannelMultiplexTransportAdapter の削除
  • 2019.4 の ILPP バックエンドを削除し、最小必要バージョンは 2020.3+ に
  • NetworkManager.NetworkConfig の以下のプロパティを削除#1080
    • Scene Registrations の廃止
    • Allow Runtime Scene Changes(ランタイムシーン変更の許可)が不要になり、削除されました
  • NetworkObject.Spawnペ イロードパラメータが削除されました #1005
  • MLAPI用のProfiler と組み込みのNetworkProfiler が削除されて,代わりのものがMultiplayer Toolsパッケージに含まれるように(今後 Profiling する場合は Multiplayer Tools を一緒にインストールすること)
  • UNetTransportRelayTransport と関連するリレー機能を削除 (Unity Relay を利用する)
  • ServerRpcSendParamsClientRpcSendParams から UpdateStage パラメータを削除
  • NetworkBufferNetworkWriterNetworkReaderNetworkSerializerPooledNetworkBufferPooledNetworkWriterPooledNetworkReader の削除
  • NetworkConfigEnableNetworkVariable を削除して,常に有効になるように変更
  • NetworkTransformFixedSendsPerSecondAssumeSyncedSendsInterpolateServerExtrapolatePositionMaxSendsToExtrapolateChannelEnableNonProvokedResendChecksDistanceSendrate を削除(正直使ってなかった項目だったし,NetworkTransform の Inspector の見栄えがよくなるのでよい)
  • NetworkManagerStopServer()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を取得しようとした際に、サイレントフェイルの例外を投げるように変更(サーバー側でのみ許可)

既知の問題

  • NetworkVariableNetworkSerialize の実装によってINetworkSerializable 型をシリアライズしない
  • DontDestroyOnLoad としてマークされた NetworkObject が一部のネットワークシーンの遷移時に無効になる
  • NetworkTransformLocal Space の同期を切り替える際に原点から補間する
  • あるオブジェクトの OnNetworkSpawn ユーザーコードで例外が発生すると他のオブジェクトのコールバックができなくなる
  • RPC で INetworkSerializable の配列型を送信できない
  • プロジェクトのパスに特殊な文字が含まれていると ILPP の生成に失敗する

参考資料

docs-multiplayer.unity3d.com

docs-multiplayer.unity3d.com

余談

ボク以外に旧MLAPI → 新MLAPI → NGOマイグレーション作業を行ったマンおるだろうか….