Unity Multiplayer Networking (MLAPI) 0.1.0 Experimental Release Note (日本語版)
MLAPI 改め Unity Multiplayer Networking v0.1.0 が Experimentalリリースされています. こっそりリリースノートが公開されていたので,日本語版を書きました.
旧MLAPIのLast Release (v12.1.7) との相違点などをまとめました. 昨年12月で発表されたMLAPIの改善予定の部分がいくつか反映されています.
- New MLAPI v 0.1.0
- New Features (新機能)
- Changes (変更点)
- Fixes (修正点)
- Known Issues (既知の問題)
- 終わりに
New MLAPI v 0.1.0
先日 Unity Multiplayer Networking (MLAPI) の新ドキュメントが公開されました.
本日 3/23 にてこっそりと 0.1.0 のリリースノートが公開されています. v0.1.0 は develop ブランチ または release/0.1.0 ブランチが対応しています.
新 MLAPI から UPM が対応しており,Add Package from git URL もできます.
(2021.04.01 追記)
以下は Unity 2020.3.2f1 以上, Unity 2021.1.0f1 以上でエラーが出るようです
https://github.com/Unity-Technologies/com.unity.multiplayer.mlapi?path=/com.unity.multiplayer.mlapi
こちらを利用してください. https://github.com/Unity-Technologies/com.unity.multiplayer.mlapi.git?path=/com.unity.multiplayer.mlapi#release/0.1.0
New MLAPI は誤解が持たれていますが,GameObjectベースのMultiplayerソリューションになります. 公式の方もそうTweetしていたり.
No, the MLAPI networking library is for MonoBehaviour/GameObject space.
— Christopher Pope (@CreativeChris1) 2021年3月17日
What we mean by “fully supported”, development, issues/bugs etc will be addressed while in experimental and beyond.
New Features (新機能)
リファクタリング
MLAPI の RPC 新規格のリファクタリング,パフォーマンス向上,定型的なコードの大幅な削減,拡張性の実現
Convenience / Performance RPC が統一
今までは MLAPI は Convenience RPC (利便性の高いRPC) と Performance RPC (パフォーマンス重視のRPC) がありましたが, これが統一されました.これは昨年12月に発表された「RPCの改善」を反映しています.
以下,これまでのConvenience RPC と Performance RPC の例を記しておきます.
Convenience RPC
public class Example : NetworkedBehaviour { private void OnGUI() { if (GUILayout.Button("SendRandomInt")) { if (IsServer) { InvokeClientRpcOnEveryone(MyClientRPC, Random.Range(-50, 50)); } else { InvokeServerRpc(MyServerRPC, Random.Range(-50, 50)); } } } [ServerRPC(RequireOwnership = false)] private void MyServerRPC(int number) { Debug.Log("The number received was: " + number); Debug.Log("This method ran on the server upon the request of a client"); } [ClientRPC] private void MyClientRPC(int number) { Debug.Log("The number received was: " + number); Debug.Log("This method ran on the client upon the request of the server"); } }
Performance RPC
void (ulong clientId, Stream readStream) というシグネチャが必要で, 逐一 PooledBitStream,PooledBitWriter,PooledBitReader を using する必要があって正直冗長でした.
private void OnGUI() { if (GUILayout.Button("SendRandomInt")) { if (IsServer) { using (PooledBitStream stream = PooledBitStream.Get()) { using (PooledBitWriter writer = PooledBitWriter.Get(stream)) { writer.WriteInt32Packed(Random.Range(-50, 50)); InvokeClientRpcOnEveryonePerformance(MyClientRPC, stream); } } } else { using (PooledBitStream stream = PooledBitStream.Get()) { using (PooledBitWriter writer = PooledBitWriter.Get(stream)) { writer.WriteInt32Packed(Random.Range(-50, 50)); InvokeServerRpcPerformance(MyServerRPC, stream); } } } } } [ServerRPC] private void MyServerRPC(ulong clientId, Stream stream) { using (PooledBitReader reader = PooledBitReader.Get(stream)) { int number = reader.ReadInt32Packed(); Debug.Log("The number received was: " + number); Debug.Log("This method ran on the server upon the request of a client"); } } [ClientRPC] private void MyClientRPC(ulong clientId, Stream stream) { using (PooledBitReader reader = PooledBitReader.Get(stream)) { int number = reader.ReadInt32Packed(); Debug.Log("The number received was: " + number); Debug.Log("This method ran on the client upon the request of the server"); } }
IBitWritable の置換
IBitWritable
が INetworkSerializable
に置き換えられます.
NetworkSerializer の追加
NetworkSerializer が追加されます.これまで NetworkVar は Serialization が未対応で,SyncVar の方が対応されてました. 後述しますが,新MLAPI では SyncVar が廃止されるので,NetworkVariable (NetworkVar の後継) が Serialization に対応するようにした感じでしょうか.
Network Update Loop インフラの実装|MonoBehaviourライフサイクルの前後に処理を走らせることが可能に
標準的なMonoBehaviourイベントサイクルの外で,Netcode システムのアップデート(RPCキューや Transport など)を支援する Network Update Loopインフラが追加されました.
言葉だとわかりにくいので,以下の図を見てください. Network Update Loop を利用すれば,MonoBehaviourライフサイクルの前後に処理を走らせることが出来るようになります.
RPCキューやTransportなどのNetcodeシステムを、標準的なMonoBehaviourのイベントサイクルの外でアップデートする必要があることがよくあったので, Network Update Loop を利用すれば,それが実現できるわけです.後程利用方法例を記事にする予定です.
(2021.04.01 追記)
実装方法追記.
RpcBatcher|バッチ処理の追加
RpcBatcher
が追加されます.同じクライアントに送られた連続したRPCリクエストを処理するためのメッセージのバッチ処理機能です.
RpcBatcher は RpcQueueProcessing からのリクエストに基づいて,バッチサイズのしきい値で,または即時にバッチを送信します.
NetworkObject は 1オブジェクトに 1つ
NetworkObject に DisallowMultipleComponent 属性が追加されたため,1オブジェクトに1NetworkObjectが保証されるようになりました.
Unity 2020.2 以降の Profiler に統合
MLAPI が Unity 2020.2 以降の Profiler に統合されました.
MLAPI Community Contributions リポジトリの公開|MLAPI の拡張機能が利用可能
MLAPI Community Contributions リポジトリが公開されました.ここでは,MLAPI の様々な拡張機能が追加されています.
旧MLAPI にはなかった,NetworkManagerHud.cs (Mirror や UNET にはあった,すぐに Host,Client,Server ボタン押せる奴) があったり LagCompensation(後述),NetworkObjectPool などがあり,こちらも MLAPI ライブラリと一緒に使う方がよいと思います.
NetworkManagerHud は上の画像のことです.これですぐに MLAPI のサンプルを試したい時に View 側を作る必要が省くことができます.
Changes (変更点)
MLAPI が UPM でインストール可能に
最初の方でも説明しましたが Add Package from git URL ができるようになりました.最高.
(2021.04.01 追記)
以下は Unity 2020.3.2f1 以上, Unity 2021.1.0f1 以上でエラーが出るようです
https://github.com/Unity-Technologies/com.unity.multiplayer.mlapi?path=/com.unity.multiplayer.mlapi
こちらを利用してください. https://github.com/Unity-Technologies/com.unity.multiplayer.mlapi.git?path=/com.unity.multiplayer.mlapi#release/0.1.0
NetworkVariable (旧 NetworkVariable) の機能追加と SyncVar の廃止
NetworkVariable(以前の名称はNetworkVar)に機能と使いやすさを追加しました. このアップデートにより,オプションが強化されたため,SyncedVarsの必要性が完全になくなり,廃止されています.
NetworkAnimator の再実装
NetworkAnimator は実は少し欠陥部分があったのですが,それが修正されたようです. ここはちょっと要確認かな….
Refactored API names (API の名前変更)
旧MLAPI の命名が新MLAPIでは以下のように変更されました.
名前がNetwork~
で始まるようになったので,個人的にはとっつきやすくなったと感じます.
旧MLAPI | 新MLAPI (0.1.0) |
---|---|
NetworkingManager |
NetworkManager |
NetworkedObject |
NetworkObject |
NetworkedBehaviour |
NetworkBehaviour |
NetworkedClient |
NetworkClient |
NetworkedPrefab |
NetworkPrefab |
NetworkedVar |
NetworkVariable |
NetworkedTransform |
NetworkTransform |
NetworkedAnimator |
NetworkAnimator |
NetworkedAnimatorEditor |
NetworkAnimatorEditor |
NetworkedNavMeshAgent |
NetworkNavMeshAgent |
SpawnManager |
NetworkSpawnManager |
BitStream |
NetworkBuffer |
BitReader |
NetworkReader |
BitWriter |
NetworkWriter |
NetEventType |
NetworkEventType |
ChannelType |
NetworkDelivery |
Channel |
NetworkChannel |
Transport |
NetworkTransport |
NetworkedDictionary |
NetworkDictionary |
NetworkedList |
NetworkList |
NetworkedSet |
NetworkSet |
MLAPIConstants |
NetworkConstants |
NetworkChannel の string から byte 表現に
C# スクリプトのリファクタリング
文字列補間,var や nameof の利用,明示的なアクセス修飾子の利用など.
Removed features (なくなった機能)
SyncVar の廃止
代わりに NetworkVariable を利用すること.
NetworkVariable に対応している型は以下の通り
- C# プリミティブ型
bool, char, sbyte, byte, short, ushort, int, uint, long, ulong, float, double, string
- Unity プリミティブ型
Color, Color32, Vector2, Vector3, Vector4, Quaternion, Ray, Ray2D
- Enum 型
独自の型を作りたい場合は,INetworkSerializable を実装すれば出来る模様ではあります. 今後試してみます.
Lag Compensation が MLAPI Commnuty Contributions リポジトリへ移行
ラグ補間システムを利用する場合は MLAPI Community Contributions リポジトリも利用すること.
MLAPI から暗号化機能が削除
これまで所々にあった暗号化機能がなくなりました. 暗号化機能は将来のリリースで開発される可能性はあるとのこと.
NetworkManager を見ると Cryptography の機能のところがなくなってますね.
MLAPI Profiler が Unity 2020.2 以降からは削除
Unity 2020.2 の Profiler と統合されています.
Convenience / Perfomance API の削除
新規格のRPC API に統一されています.
MLAPI Installer の削除
UPM対応になったので不要になった感じでしょう.私も正直使ってませんでした.
Fixes (修正点)
特定条件下で RPC の送受信が出来ない問題の修正
NetworkManager で loopback のフラグが設定されていない時に RPC の送受信ができない問題があったようです.
MLAPI Profiler の修正
プロファイラーのデータが正しく集計・描画されず,フレームごとにリセットされずに無限に増加してしまう問題の修正.
PlayModeでシーントランザクションに問題があったのを修正
Server モードで実行する際の NetworkList,NetworkDictionary のシリアル化の問題の修正
数値精度の問題修正
bool の修正
ShutDown() の修正
NetworkManager.Singleton = nullにする前にShutdown()を呼び出すと,NetworkManager.OnDestroy()でnullになってしまう問題を修正.
NetworkSceneManager の問題修正
NetworkSceneManagerで,HostまたはServerがNetworkSceneManager.SwitchSceneメソッドを呼び出したときに, Client 側で "Soft sync" 例外の後にヌルポ例外が発生する問題が修正.
この修正により,シーンからシーンへの移行の安定性が向上します.
Known Issues (既知の問題)
NetworkNavMeshAgent の同期問題
以下の設定は同期されない. Mesh Data,Agent Size,Steering,Obstacle Avoidance,Path Finding Settings.
また,destinationとvelocityの同期のみで目的地までの経路の同期は行いません.
RPC Suffix 問題
ClientRpc または ServerRpc の Suffix を持つメソッドで,[ClientRPC] または [ServerRPC] のマークを付けてない場合はコンパイルエラーになる. こちらの方は正しい気がするような… Mirror もそうなっていた気がする.
NetworkAnimator の問題
Animator Override がサポートされていない. Trigger は機能してない.(なので自分でRPCを作る必要があります)
NetworkVariable の問題
NetworkDictionary の List および Set は、reliableSequenced チャネルを使用する必要があります.
NetworkObjects の注意点
NetworkObjects はおそらく,NetworkObject の子孫を持つ NetworkObject のことだと解釈しています.
NetworkObjects はサポートされていますが,ネストされた子ネットワークオブジェクトを持つプレハブを生成する際には それらに対して手動でスポーンを呼び出す必要があります.
NetworkTransform の問題
- 複製されたオブジェクトには jitter が発生する可能性がある
- Owner は常にオブジェクトの位置について権限を持つ
- Scale は同期されない.
Connection Approval は ホストクライントでは呼ばれない
NamedMessages の問題
常に NetworkBuffer を利用する必要がある.
NetworkManager の機能の制限
接続管理には制限があり,IsServer,IsClient,IsConnectedClient を利用して適切にMLAPI接続が出来ているか確認してください. NetworkManager がアタッチされているオブジェクトに NetworkObject を割り当てると soft sync エラー問題が発生するので避けること.
終わりに
4/7 あたりに出てくる予定の MLAPI 公式サンプルプロジェクトの「Boss Room」は New MLAPI v 0.1.0 の内容で公開する予定です.