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 fully replaced so that it only syncs position, rotation and scale, has control options for those and whether to interpolate them, and uses Snapshot Interpolation. It also has a bunch of virtual methods and there's a Script Template for making your own derived version. Rigidbody support was removed in favor of a separate Network Rigidbody component.
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 Classes
SyncListString
was replaced bySyncList<string>
.SyncListFloat
was replaced bySyncList<float>
.SyncListInt
was replaced bySyncList<int>
.SyncListUInt
was replaced bySyncList<uint>
.SyncListBool
was replaced bySyncList<bool>
.
See documentation for more details.
SyncList Operations
OP_REMOVE
was replaced byOP_REMOVEAT
OP_DIRTY
was replaced byOP_SET
See documentation for more details.
SyncDictionary Operations
OP_DIRTY
was replaced byOP_SET
See documentation for more details.
SyncObject
This is now a class instead of an interface.
Flush
- UseClearChanges
instead.
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
NetworkConnection
was replaced byNetworkConnectionToClient
in many places.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 symbolUNITY_SERVER
instead.ConfigureServerFrameRate
was renamed toConfigureHeadlessFrameRate
.client
Use NetworkClient directly, it will be made static soon. For example, useNetworkClient.Send(message)
instead ofNetworkManager.client.Send(message)
.IsClientConnected()
Use static propertyNetworkClient.isConnected
instead.onlineScene
andofflineScene
These store full paths now, so use SceneManager.GetActiveScene().path instead.OnStartClient(NetworkClient client)
Override OnStartClient() instead since allNetworkClient
methods are static now.OnClientChangeScene(string newSceneName)
OverrideOnClientChangeScene(string newSceneName, SceneOperation sceneOperation, bool customHandling)
instead.OnClientChangeScene(string newSceneName, SceneOperation sceneOperation)
OverrideOnClientChangeScene(string newSceneName, SceneOperation sceneOperation, bool customHandling)
instead.OnServerAddPlayer(NetworkConnection conn, AddPlayerMessage extraMessage)
OverrideOnServerAddPlayer(NetworkConnection conn)
instead. See Custom Player Spawn Guide for details.OnServerRemovePlayer(NetworkConnection conn, NetworkIdentity player)
UseNetworkServer.RemovePlayerForConnection(NetworkConnection conn, GameObject player, bool keepAuthority = false)
instead.OnServerError(NetworkConnection conn, int errorCode)
Replaced with
OnServerError(NetworkConnection conn, Exception exception)
.OnClientError(NetworkConnection conn, int errorCode)
Replaced with
OnClientError(Exception exception)
.disconnectInactiveConnections
anddisconnectInactiveTimeout
were removed.OnClient* virtual methods no longer take a
NetworkConnection
parameter. Remove the parameter from your overrides and useNetworkClient.connection
in your code instead.serverTickRate
renamed tosendRate
.serverTickInterval
moved toNetworkServer
.
NetworkManagerHUD
showGUI
was removed.Disable the component instead.
NetworkRoomManager
NetworkConnection
was replaced byNetworkConnectionToClient
in many places.OnRoomServerCreateGamePlayer(NetworkConnection conn)
UseOnRoomServerCreateGamePlayer(NetworkConnection conn, GameObject roomPlayer)
instead.OnRoomServerSceneLoadedForPlayer(GameObject roomPlayer, GameObject gamePlayer)
UseOnRoomServerSceneLoadedForPlayer(NetworkConnection conn, GameObject roomPlayer, GameObject gamePlayer)
instead.Client virtual methods no longer take a
NetworkConnection
parameter.Use
NetworkClient.connection
within your overrides.
NetworkIdentity
clientAuthorityOwner
Use connectionToClient insteadGetSceneIdenity
UseGetSceneIdentity
instead (typo in original name)RemoveClientAuthority(NetworkConnection conn)
NetworkConnection parameter is no longer needed and nothing is returnedspawned
dictionaryThis has been split up to
NetworkServer.spawned
andNetworkClient.spawned
dictionaries.Local Player Authority checkbox This checkbox is no longer needed, and we simplified how Authority works in Mirror.
NetworkBehaviour
NetworkConnection
was replaced byNetworkConnectionToClient
in many places.sendInterval
attribute UseNetworkBehaviour.syncInterval
field instead. Can be modified in the Inspector too.List m_SyncObjects
UseList syncObjects
instead.OnSetLocalVisibility(bool visible)
OverrideOnSetHostVisibility(bool visible)
instead.OnRebuildObservers
,OnCheckObserver
, andOnSetHostVisibility
were moved to a separate class calledNetworkVisibility
NetworkBehaviour.OnNetworkDestroy
was renamed toNetworkBehaviour.OnStopClient
.getSyncVarHookGuard
renamed toGetSyncVarHookGuard
.setSyncVarHookGuard
- renamed toSetSyncVarHookGuard
.SetDirtyBit
- UseSetSyncVarDirtyBit
instead.[Command]
attribute parameterignoreAuthority
replaced withrequiresAuthority
.[ClientRpc]
attribute parameterincludeOwner
replace withexcludeOwner
.hasAuthority
renamed toisOwned
.
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. Useconnection.GetType() == typeof(NetworkConnection)
to check if it's a regular or local connection.isConnected
Removed because it's pointless. ANetworkConnection
is always connected.InvokeHandlerNoData(int msgType)
UseInvokeHandler
instead.playerController
renamed toidentity
since that's what it is: theNetworkIdentity
for the connection.RegisterHandler(short msgType, NetworkMessageDelegate handler)
UseNetworkServer.RegisterHandler()
orNetworkClient.RegisterHandler()
instead.UnregisterHandler(short msgType)
UseNetworkServer.UnregisterHandler()
orNetworkClient.UnregisterHandler()
instead.Send(int msgType, MessageBase msg, int channelId = Channels.Reliable)
UseSend(msg, channelId)
instead.clientOwnedObjects
renamed toowned
.
NetworkServer
NetworkConnection
was replaced byNetworkConnectionToClient
in many places.FindLocalObject(uint netId)
UseNetworkServer.spawned[netId].gameObject
instead.RegisterHandler(int msgType, NetworkMessageDelegate handler)
UseRegisterHandler(T msg)
instead.RegisterHandler(MsgType msgType, NetworkMessageDelegate handler)
UseRegisterHandler(T msg)
instead.RegisterHandler(Action handler, bool requireAuthentication = true)
Use
RegisterHandler(Action<NetworkConnection, T), requireAuthentication = true)
instead.UnregisterHandler(int msgType)
UseUnregisterHandler(T msg)
instead.UnregisterHandler(MsgType msgType)
UseUnregisterHandler(T msg)
instead.SendToAll(int msgType, MessageBase msg, int channelId = Channels.Reliable)
UseSendToAll(T msg, int channelId = Channels.Reliable)
instead.SendToClient(int connectionId, int msgType, MessageBase msg)
UseNetworkConnection.Send(T msg, int channelId = Channels.Reliable)
instead.SendToClient(int connectionId, T msg)
UseNetworkConnection.Send(T msg, int channelId = Channels.Reliable)
instead.SendToClientOfPlayer(NetworkIdentity identity, int msgType, MessageBase msg)
Useidentity.connectionToClient.Send<T>(T message, int channelId = Channels.Reliable)
instead.SendToReady(NetworkIdentity identity, short msgType, MessageBase msg, int channelId = Channels.Reliable)
Useidentity.connectionToClient.Send()
instead.SendToReady(NetworkIdentity identity, T message, bool includeOwner = true, int channelId = Channels.Reliable)
Renamed to
SendToReadyObservers
.SpawnWithClientAuthority(GameObject obj, GameObject player)
UseSpawn(GameObject obj, GameObject player)
instead.SpawnWithClientAuthority(GameObject obj, NetworkConnection ownerConnection)
UseSpawn(GameObject obj, NetworkConnection ownerConnection)
instead.SpawnWithClientAuthority(GameObject obj, Guid assetId, NetworkConnection ownerConnection)
UseSpawn(GameObject obj, Guid assetId, NetworkConnection ownerConnection)
instead.disconnectInactiveConnections
anddisconnectInactiveTimeout
were removed.NoConnections
was renamed toNoExternalConnections
.DisconnectAllExternalConnections
/DisconnectAllConnections
Use
DisconnectAll
instead.OnError
renamed toOnTransportError
for clarity.
NetworkClient
NetworkClient singleton
UseNetworkClient
directly. Singleton isn't needed anymore as all functions are static now. Example:NetworkClient.Send(message)
instead ofNetworkClient.singleton.Send(message)
.allClients
UseNetworkClient
directly instead. There is always exactly one client.GetRTT()
UseNetworkTime.rtt
instead.readyConnection
Use
connection
instead.isLocalClient
Use
isHostClient
instead.DisconnectLocalServer()
Use
NetworkClient.Disconnect()
instead.RegisterHandler(int msgType, NetworkMessageDelegate handler)
UseRegisterHandler(T msg)
instead.RegisterHandler(MsgType msgType, NetworkMessageDelegate handler)
UseRegisterHandler(T msg)
instead.RegisterHandler(Action<NetworkConnection, T> handler, bool requireAuthentication = true)
Use
RegisterHandler(Action<T> handler, bool requireAuthentication = true)
instead.UnregisterHandler(int msgType)
UseUnregisterHandler(T msg)
instead.UnregisterHandler(MsgType msgType)
UseUnregisterHandler(T msg)
instead.Ready(NetworkConnection conn)
Use
Ready()
without theNetworkConnection
parameter instead.Send(short msgType, MessageBase msg)
UseSend(T msg, int channelId = Channels.Reliable)
with no message id insteadShutdownAll()
UseShutdown()
instead. There is only one client.OnError
renamed toOnTransportError
for clarity.
ClientScene
Merged into
NetworkClient
.
Network Scene Checker
Replaced by Scene Interest Management.
Network Proximity Checker
Replaced by Spatial Hash / Distance Interest Management.
Network Match Checker
Replaced by Network Match and requires Match Interest Management.
Network Owner Checker
Replaced by Network Team and requires Team Interest Management.
Network Authenticator
NetworkConnection
was replaced byNetworkConnectionToClient
in many places.OnClientAuthenticate
no longer takes aNetworkConnection
parameter. UseNetworkClient.connection
as needed.OnClientAuthenticated
event no longer takes aNetworkConnection
parameter. UseNetworkClient.connection
as needed.NetworkConnection
is no longer used in client message handlers.Use
NetworkClient.connection
within your handlers instead.ClientAccept
andClientReject
no longer needs aNetworkConnection
parameter.
NetworkTime
NetworkTime.timeVar
was renamed totimeVariance
.NetworkTime.timeSd
was renamed totimeStandardDeviation
.NetworkTime.rttVar
was renamed torttVariance
.NetworkTime.rttSd
was renamed torttStandardDeviation
.
Transport
activeTransport
renamed toactive
.
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)
UseReadBytes
instead.ReadPackedInt32(int value)
UseReadInt32(int value)
instead.ReadPackedUInt32(uint value)
UseReadUInt32(uint value)
instead.ReadPackedUInt64(ulong value)
UseReadUInt64(ulong value)
instead.ReadBoolean
renamed toReadBool
.ReadInt16
renamed toReadShort
.ReadInt32
renamed toReadInt
.Readint64
renamed toReadLong
.ReadSingle
renamed toReadFloat
.
NetworkWriter
Write(bool value)
UseWriteBool
instead.Write(byte value)
UseWriteByte
instead.Write(sbyte value)
UseWriteSByte
instead.Write(short value)
UseWriteShort
instead.Write(ushort value)
UseWriteUShort
instead.Write(int value)
UseWriteInt
instead.Write(uint value)
UseWriteUInt
instead.Write(long value)
UseWriteLong
instead.Write(ulong value)
UseWriteULong
instead.Write(float value)
UseWriteFloat
instead.Write(double value)
UseWriteDouble
instead.Write(decimal value)
UseWriteDecimal
instead.Write(string value)
UseWriteString
instead.Write(char value)
UseWriteChar
instead.Write(Vector2 value)
UseWriteVector2
instead.Write(Vector2Int value)
UseWriteVector2Int
instead.Write(Vector3 value)
UseWriteVector3
instead.Write(Vector3Int value)
UseWriteVector3Int
instead.Write(Vector4 value)
UseWriteVector4
instead.Write(Color value)
UseWriteColor
instead.Write(Color32 value)
UseWriteColor32
instead.Write(Guid value)
UseWriteGuid
instead.Write(Transform value)
UseWriteTransform
instead.Write(Quaternion value)
UseWriteQuaternion
instead.Write(Rect value)
UseWriteRect
instead.Write(Plane value)
UseWritePlane
instead.Write(Ray value)
UseWriteRay
instead.Write(Matrix4x4 value)
UseWriteMatrix4x4
instead.Write(NetworkIdentity value)
UseWriteNetworkIdentity
instead.Write(GameObject value)
UseWriteGameObject
instead.Write(byte[] buffer, int offset, int count)
UseWriteBytes
instead.WritePackedInt32(int value)
UseWriteInt32(int value)
insteadWritePackedUInt32(uint value)
UseWriteUInt32(uint value)
insteadWritePackedUInt64(ulong value)
UseWriteUInt64(ulong value)
instead
RemoteCallHelper
Renamed to
RemoteProcedureCalls
.CmdDelegate
renamed toRemoteCallDelegate
.MirrorInvokeType
renamed toRemoteCallType
.
Transport
GetConnectionInfo(int connectionId, out string address)
UseServerGetClientAddress(int connectionId)
instead.GetMaxBatchSize
renamed toGetMaxPacketSize
.ClientSend(int channelId, ArraySegment segment)
Use
ClientSend(segment, channelId)
instead.ServerSend(int connectionId, int channelId, ArraySegment segment)
Use
ServerSend(connectionId, segment, channelId)
instead.
Telepathy Transport
MaxMessageSize
UseMaxMessageSizeFromClient
orMaxMessageSizeFromServer
instead.
Fallback Transport
This has been removed.
Utils
Version
enum removed.DefaultReliable
renamed toReliable
.DefaultUnreliable
renamed toUnreliable
.
Last updated