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を継承する感じ?) NetworkVariableBool
NetworkVariableByte
NetworkVariableSByte
NetworkVariableUShort
NetworkVariableShort
NetworkVariableUInt
NetworkVariableInt
NetworkVariableULong
NetworkVariableLong
NetworkVariableFloat
NetworkVariableDouble
NetworkVariableVector2
NetworkVariableVector3
NetworkVariableVector4
NetworkVariableColor
NetworkVariableColor32
NetworkVariableRay
NetworkVariableQuaternion
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 の生成に失敗する