Deprecations

Certain features of Unity Networking (UNet) were removed from Mirror or modified for various reasons. This page will identify all changed and removed features, properties, and methods, the reason for change or removal, and possible alternatives.

Note: Some changes in this document may apply to an upcoming release to the Asset Store.

Match Namespace & Host Migration

As part of the Unity Services, this entire namespace was removed. It didn't work well to begin with, and was incredibly complex to be part of the core networking package. We expect this, along with other back-end services, will be provided through standalone apps that have integration to Mirror.

Network Server Simple

This was too complex and impractical to maintain for what little it did, and was removed. There are much easier ways to make a basic listen server, with or without one of our transports.

Couch Co-Op

The core networking was greatly simplified by removing this low-hanging fruit. It was buggy, and too convoluted to be worth fixing. For those that need something like this, consider defining a non-visible player prefab as a message conduit that spawns actual player prefabs with client authority. All inputs would route through the conduit prefab to control the player objects.

Message Types

The MsgType enumeration was removed. All message types are generated dynamically. Use Send instead.

Network Transform

Network Transform was significantly simplified so that it only syncs position, rotation and scale. Rigidbody support was removed. We may create a new NetworkRigidbody component that will be server authoritative with physics simulation and interpolation.

Network Animator

Network Animator was also simplified, as it batches all Animator parameters into a single update message.

SyncVar Hook Parameters

SyncVar property values are now updated before the hook is called, and hooks now require two parameters of the same type as the property: oldValue and newValue

SyncListSTRUCT

Use SyncList instead.

SyncList Operations

  • OP_REMOVE was replaced by OP_REMOVEAT

  • OP_DIRTY was replaced by OP_SET

SyncIDictionary Operations

  • OP_DIRTY was replaced by OP_SET

Quality of Service Flags

In classic UNet, QoS Flags were used to determine how packets got to the remote end. For example, if you needed a packet to be prioritized in the queue, you would specify a high priority flag which the Unity LLAPI would then receive and deal with appropriately. Unfortunately, this caused a lot of extra work for the transport layer and some of the QoS flags did not work as intended due to buggy code that relied on too much magic.

In Mirror, QoS flags were replaced with a "Channels" system. While the default transport, Telepathy, does not use channels at all because it's TCP-based, other transports, such as Ignorance and LiteNetLib, do support them.

The currently defined channels are:

  • Channels.Reliable = 0

  • Channels.Unreliable = 1

Changes by Class

NetworkManager

  • networkPort Removed as part of separating Transports to components. Not all transports use ports, but those that do have a field for it. See Transports for more info.

  • IsHeadless() Use compiler symbol UNITY_SERVER instead.

  • client Use NetworkClient directly, it will be made static soon. For example, use NetworkClient.Send(message) instead of NetworkManager.client.Send(message).

  • IsClientConnected() Use static property NetworkClient.isConnected instead.

  • onlineScene and offlineScene These store full paths now, so use SceneManager.GetActiveScene().path instead.

  • OnStartClient(NetworkClient client) Override OnStartClient() instead since all NetworkClient methods are static now.

  • OnClientChangeScene(string newSceneName) Override OnClientChangeScene(string newSceneName, SceneOperation sceneOperation, bool customHandling) instead.

  • OnClientChangeScene(string newSceneName, SceneOperation sceneOperation) Override OnClientChangeScene(string newSceneName, SceneOperation sceneOperation, bool customHandling) instead.

  • OnServerAddPlayer(NetworkConnection conn, AddPlayerMessage extraMessage) Override OnServerAddPlayer(NetworkConnection conn) instead. See Custom Player Spawn Guide for details.

  • OnServerRemovePlayer(NetworkConnection conn, NetworkIdentity player) Use NetworkServer.RemovePlayerForConnection(NetworkConnection conn, GameObject player, bool keepAuthority = false) instead.

NetworkRoomManager

  • OnRoomServerCreateGamePlayer(NetworkConnection conn) Use OnRoomServerCreateGamePlayer(NetworkConnection conn, GameObject roomPlayer) instead.

  • OnRoomServerSceneLoadedForPlayer(GameObject roomPlayer, GameObject gamePlayer) Use OnRoomServerSceneLoadedForPlayer(NetworkConnection conn, GameObject roomPlayer, GameObject gamePlayer) instead.

NetworkIdentity

  • clientAuthorityOwner Use connectionToClient instead

  • GetSceneIdenity Use GetSceneIdentity instead (typo in original name)

  • RemoveClientAuthority(NetworkConnection conn) NetworkConnection parameter is no longer needed and nothing is returned

  • Local Player Authority checkbox This checkbox is no longer needed, and we simplified how Authority works in Mirror.

NetworkBehaviour

  • sendInterval attribute Use NetworkBehaviour.syncInterval field instead. Can be modified in the Inspector too.

  • List m_SyncObjects Use List syncObjects instead.

  • OnSetLocalVisibility(bool visible) Override OnSetHostVisibility(bool visible) instead.

  • OnRebuildObservers, OnCheckObserver, and OnSetHostVisibility were moved to a separate class called NetworkVisibility

  • NetworkBehaviour.OnNetworkDestroy was renamed to NetworkBehaviour.OnStopClient.

NetworkConnection

  • hostId Removed because it's not needed ever since we removed LLAPI as default. It's always 0 for regular connections and -1 for local connections. Use connection.GetType() == typeof(NetworkConnection) to check if it's a regular or local connection.

  • isConnected Removed because it's pointless. A NetworkConnection is always connected.

  • InvokeHandlerNoData(int msgType) Use InvokeHandler instead.

  • playerController renamed to identity since that's what it is: the NetworkIdentity for the connection.

  • RegisterHandler(short msgType, NetworkMessageDelegate handler) Use NetworkServer.RegisterHandler() or NetworkClient.RegisterHandler() instead.

  • UnregisterHandler(short msgType) Use NetworkServer.UnregisterHandler() or NetworkClient.UnregisterHandler() instead.

  • Send(int msgType, MessageBase msg, int channelId = Channels.Reliable) Use Send(msg, channelId) instead.

NetworkServer

  • FindLocalObject(uint netId) Use NetworkIdentity.spawned[netId].gameObject instead.

  • RegisterHandler(int msgType, NetworkMessageDelegate handler) Use RegisterHandler(T msg) instead.

  • RegisterHandler(MsgType msgType, NetworkMessageDelegate handler) Use RegisterHandler(T msg) instead.

  • UnregisterHandler(int msgType) Use UnregisterHandler(T msg) instead.

  • UnregisterHandler(MsgType msgType) Use UnregisterHandler(T msg) instead.

  • SendToAll(int msgType, MessageBase msg, int channelId = Channels.Reliable) Use SendToAll(T msg, int channelId = Channels.Reliable) instead.

  • SendToClient(int connectionId, int msgType, MessageBase msg) Use NetworkConnection.Send(T msg, int channelId = Channels.Reliable) instead.

  • SendToClient(int connectionId, T msg) Use NetworkConnection.Send(T msg, int channelId = Channels.Reliable) instead.

  • SendToClientOfPlayer(NetworkIdentity identity, int msgType, MessageBase msg) Use SendToClientOfPlayer(NetworkIdentity identity, T msg, int channelId = Channels.Reliable) instead.

  • SendToReady(NetworkIdentity identity, short msgType, MessageBase msg, int channelId = Channels.Reliable) Use SendToReady(NetworkIdentity identity, T msg, int channelId = Channels.Reliable) instead.

  • SpawnWithClientAuthority(GameObject obj, GameObject player) Use Spawn(GameObject obj, GameObject player) instead.

  • SpawnWithClientAuthority(GameObject obj, NetworkConnection ownerConnection) Use Spawn(GameObject obj, NetworkConnection ownerConnection) instead.

  • SpawnWithClientAuthority(GameObject obj, Guid assetId, NetworkConnection ownerConnection) Use Spawn(GameObject obj, Guid assetId, NetworkConnection ownerConnection) instead

NetworkClient

  • NetworkClient singleton Use NetworkClient directly. Singleton isn't needed anymore as all functions are static now. Example: NetworkClient.Send(message) instead of NetworkClient.singleton.Send(message).

  • allClients Use NetworkClient directly instead. There is always exactly one client.

  • GetRTT() Use NetworkTime.rtt instead.

  • RegisterHandler(int msgType, NetworkMessageDelegate handler) Use RegisterHandler(T msg) instead.

  • RegisterHandler(MsgType msgType, NetworkMessageDelegate handler) Use RegisterHandler(T msg) instead.

  • UnregisterHandler(int msgType) Use UnregisterHandler(T msg) instead.

  • UnregisterHandler(MsgType msgType) Use UnregisterHandler(T msg) instead.

  • Send(short msgType, MessageBase msg) Use Send(T msg, int channelId = Channels.Reliable) with no message id instead

  • ShutdownAll() Use Shutdown() instead. There is only one client.

ClientScene

  • Merged into NetworkClient.

Messages

Basic messages of simple types were all removed as unnecessary bloat. You can create your own message classes instead.

  • StringMessage

  • ByteMessage

  • BytesMessage

  • IntegerMessage

  • DoubleMessage

  • EmptyMessage

NetworkMessage requires structs in all cases - classes no longer supported

NetworkReader

  • Read(byte[] buffer, int offset, int count) Use ReadBytes instead.

  • ReadPackedInt32(int value) Use ReadInt32(int value) instead

  • ReadPackedUInt32(uint value) Use ReadUInt32(uint value) instead

  • ReadPackedUInt64(ulong value) Use ReadUInt64(ulong value) instead

NetworkWriter

  • Write(bool value) Use WriteBoolean instead.

  • Write(byte value) Use WriteByte instead.

  • Write(sbyte value) Use WriteSByte instead.

  • Write(short value) Use WriteInt16 instead.

  • Write(ushort value) Use WriteUInt16 instead.

  • Write(int value) Use WriteInt32 instead.

  • Write(uint value) Use WriteUInt32 instead.

  • Write(long value) Use WriteInt64 instead.

  • Write(ulong value) Use WriteUInt64 instead.

  • Write(float value) Use WriteSingle instead.

  • Write(double value) Use WriteDouble instead.

  • Write(decimal value) Use WriteDecimal instead.

  • Write(string value) Use WriteString instead.

  • Write(char value) Use WriteChar instead.

  • Write(Vector2 value) Use WriteVector2 instead.

  • Write(Vector2Int value) Use WriteVector2Int instead.

  • Write(Vector3 value) Use WriteVector3 instead.

  • Write(Vector3Int value) Use WriteVector3Int instead.

  • Write(Vector4 value) Use WriteVector4 instead.

  • Write(Color value) Use WriteColor instead.

  • Write(Color32 value) Use WriteColor32 instead.

  • Write(Guid value) Use WriteGuid instead.

  • Write(Transform value) Use WriteTransform instead.

  • Write(Quaternion value) Use WriteQuaternion instead.

  • Write(Rect value) Use WriteRect instead.

  • Write(Plane value) Use WritePlane instead.

  • Write(Ray value) Use WriteRay instead.

  • Write(Matrix4x4 value) Use WriteMatrix4x4 instead.

  • Write(NetworkIdentity value) Use WriteNetworkIdentity instead.

  • Write(GameObject value) Use WriteGameObject instead.

  • Write(byte[] buffer, int offset, int count) Use WriteBytes instead.

  • WritePackedInt32(int value) Use WriteInt32(int value) instead

  • WritePackedUInt32(uint value) Use WriteUInt32(uint value) instead

  • WritePackedUInt64(ulong value) Use WriteUInt64(ulong value) instead

Transport

  • GetConnectionInfo(int connectionId, out string address) Use ServerGetClientAddress(int connectionId) instead.

Telepathy Transport

  • MaxMessageSize Use MaxMessageSizeFromClient or MaxMessageSizeFromServer instead.