Search Unity

  1. Good news ✨ We have more Unite Now videos available for you to watch on-demand! Come check them out and ask our experts any questions!
    Dismiss Notice

Unity Multiplayer Mirror - Networking for Unity (UNET Replacement)

Discussion in 'Connected Games' started by vis2k, Aug 11, 2016.

  1. wdjones

    wdjones

    Joined:
    May 22, 2013
    Posts:
    1
    I'm having problems with this detecting steam running. It is getting detected inside unity or if I do a "Build and Run" inside unity. If I run the exe manually or run it through steam as a "non-steam game," steam is not being detected. This is my first go at dealing with connections through steam FYI.
     
  2. Roamer79

    Roamer79

    Joined:
    Oct 25, 2016
    Posts:
    41
    Sorry I'm retarded. Can you please point to the exact example of how we use channels now or some documentation or a real quick example? Is it the same way as the orig UNET where we can designate the channel in the Command param?
    Thx
     
  3. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,685
    Send functions have a channel parameter and the Transport may or may not ignore it. E.g. Telepath (TCP) ignores it. UDP transports don't ignore it.
    Come by our discord if you can't get an example running!
     
  4. antsonthetree

    antsonthetree

    Joined:
    May 15, 2015
    Posts:
    75
    I have a change request - feel free to ignore if you don't think it's useful. Would you consider making the following 3 NetworkManager static variables 'protected' instead of private? It would make overriding ServerChangeScene much easier - and would keep me from having to recompile from source every new build! :).
    s_StartPositions
    s_StartPositionIndex
    s_LoadingSceneAsync

    Thanks
    Jake
     
  5. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,685
    Can you explain why this is important? E.g. why do you overwrite ServerChangeScene?
     
  6. antsonthetree

    antsonthetree

    Joined:
    May 15, 2015
    Posts:
    75
    In my case I override ServerChangeScene so that I can provide my own custom scene loading code and display a loading screen with progress bar while it loads. In order to do that I need to have access to s_LoadingSceneAsync which is protected.

    Also just on general principal, if a base class is going to provide an overridable function (ServerChangeScene) then it should also allow the internals of that function to be accessible to anyone overriding the function.
     
  7. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,685
    Could you make a pull request on github?
     
  8. Hummy91

    Hummy91

    Joined:
    Jun 7, 2017
    Posts:
    22
    Hey guys, I just picked up Mirror and as I'm a networking novice, I'm pretty much in the dark on setting up a simple system to manage hosts/clients for a lan/lobby GUI system, (I was using Unets default match making system prior).

    Can anyone recommend a lobby asset or something similar from the store that works with Mirror that I could check out as an example to make my own? Or even some documentation/material that'll point me in the right direction of accessing the information needed on the creation of a new host/server and using it to create 'rooms' etc. As I noticed a lot of the functionality provided by Unet by default like NetworkDiscovery has been removed from Mirror, which puts me in the dark on how to go about re-implementing these features. Cheers
     
    Last edited: Dec 10, 2018
  9. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,685
    There is a NetworkLobby asset from Unity on the store, but it has several bugs.
    As far as I know, my uMOBA asset has the only lobby example that works at the moment.

    It's not too difficult to do though, maybe try it yourself. Inherit from NetworkManager and then keep connections in a lobby dictionary or list while they select their team.
     
    Last edited: Dec 10, 2018
  10. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,685
    Progress: several smaller fixes and improvements during the last few days. We are also still working on 2018 support, and waiting for the Unity 2018 LTS version.
     
    runningbird likes this.
  11. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,685
    Progress: been untangling spawned NetworkIdentities https://github.com/vis2k/Mirror/pull/164/files
    Previously they were stored in NetworkScene. Once for ClientScene and once for NetworkServer (hence twice).

    The change will move all spawned NetworkIdentities to NetworkIdentities.spawned.

    • The name will be more clear, instead of 'NetworkServer.objects'.
    • It will get rid of 71 lines of unnecessary code: upload_2018-12-16_20-2-0.png
    • It will get rid of a lot of unnecessary dictionary lookups and assignments. Should improve performance with large amounts of entities.
    • It will get rid of a lot of complexity, like this SetLocalObject magic:
    • ApplySpawnPayload also required a strange extra GameObject parameter that will be removed after this change.

    In other words: two spawned dicts with a lot of lookups and inserts are now one spawned dict with a lot fewer lookups. These architectural changes are way more important than premature GC optimizations.
     
  12. runningbird

    runningbird

    Joined:
    Sep 3, 2009
    Posts:
    380
    Awesome find! mirror gets better everyday... keep up the great work
     
    vis2k likes this.
  13. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,685
    Thanks, we will!
     
    runningbird likes this.
  14. Happycamper8

    Happycamper8

    Joined:
    Aug 31, 2017
    Posts:
    7
    I'm pretty much a one man operation and am an artist. Due to a need I tried to fill, I created a multiplayer training platform using Unity. I demoed to the people in charge and they are excited to push forward. I have been working on other projects and now have deadlines to meet. I now discover the Networking is being deprecated!

    I discovered Mirror and started migrating yesterday. I hope I can get some help and you may have to assume I'm a pretty dumb artist. :)

    The first error I'm getting is the following:
    The best overloaded method match for `Mirror.NetworkServer.AddPlayerForConnection(Mirror.NetworkConnection, UnityEngine.GameObject, System.Guid)' has some invalid arguments.

    From recent comments made here, it seems the playerControllerId has been eliminated? So I took that out of the code and that error seems to have cleared. Is this correct?

    The next error I'm getting is:
    No overload for method `AddPlayer` takes `3` arguments.
    The code is ClientScene.AddPlayer(conn, 0, msg);
    I'm assuming I need to delete the 0, as that seems to clear the error. That 0 is the playerControllerId correct?

    Assuming I'm correct above, that leaves me with 2 errors left I believe.

    Type `Mirror.NetworkConnection` does not contain a definition for `playerControllers` and no extension method `playerControllers` of type `Mirror.NetworkConnection` could be found. Are you missing an assembly reference?

    The code where it's happening is in OnServerDisconnect as follows:
    public override void OnServerDisconnect(NetworkConnection conn)
    {
    var disconnectedClient = conn.playerControllers[0].gameObject;

    Does playerControllers no longer exist? What should I do here? I need to find the gameObject just disconnected.

    Thanks for any help you can offer...
     
  15. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,685
    Yes, simply remove playerControllerId parameter.

    Same for AddPlayer, remove the 0.

    NetworkConnection.playerController replaces .playerControllers (just one now).
    So in your case: disconnected = conn.playerController.gameObject;
     
  16. Happycamper8

    Happycamper8

    Joined:
    Aug 31, 2017
    Posts:
    7
    BAM! Thanks so much! That took care of the last 2 errors and allows me to build.

    Now I'm getting an error while running. I start out with a screen where a "player" is chosen. Depending on the player selected in the drop down list, it runs the following in OnClientConnect:
    IntegerMessage msg = new IntegerMessage(chosenCharacter); // This is the index of the character in dropdown
    ClientScene.AddPlayer(conn, msg);

    The error is the following:
    The PlayerPrefab is empty on the NetworkManager. Please setup a PlayerPrefab object.

    I have not set that up in the past since I'm just using the index of the dropdown to correspond to the list of Registered Spawnable Prefabs in the Network Manager.

    To try to solve that, I added one of the characters to the Player Prefab slot under Spawn Info. This caused the error to go away, but only seems to spawn that one character anymore.

    Any ideas?
     
  17. Happycamper8

    Happycamper8

    Joined:
    Aug 31, 2017
    Posts:
    7
    Hmmm, I think what's happening is I had an override for OnServerAddPlayer, which took that msg and spawned the characters.

    I remember now getting this error:
    `NetworkCustom.OnserverAddPlayer(Mirror.NetworkConnection, short, Mirror.NetworkReader)` is marked as an override but no suitable method found to override

    I had removed the override to fix it earlier, but I think this is why my spawning code is not working?
     
  18. Happycamper8

    Happycamper8

    Joined:
    Aug 31, 2017
    Posts:
    7
    Sigh...

    Told ya, I'm a dumb artist. My override still had the playerControllerId parameter...

    Thanks for your help! Seems to be working now!
     
    vis2k likes this.
  19. Happycamper8

    Happycamper8

    Joined:
    Aug 31, 2017
    Posts:
    7
    Man, I wish you had a paypal or something. I don't really know much of anything about patreon. Also, since it's for work, they wouldn't do a monthly payment, but personally I wish I could send some money.

    You have helped me so much. Thanks!
     
  20. thegreatzebadiah

    thegreatzebadiah

    Joined:
    Nov 22, 2012
    Posts:
    793
    Soooo, I'm finally looking to make NAT Traversal compatible with Mirror, as several people have requested it now, but I'm hitting a bit of a wall because of this bit:

    NAT Traversal is dependent on running multiple servers, as each punch-through connection can occur on a different port. Also the punch-through connections require a special NetworkConnection class (or at least they did for UNET) to prevent the connection ID's from colliding.

    So, I agree that UNET's approach was cumbersome. Using multiple servers with special NetworkConnections was a crappy hack anyway, but I do need some way to listen on multiple ports on the server. Is there any way to do this in Mirror or could some way be added?
     
  21. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,685
    You can start another telepathy server rather easily and listen on that port.
     
    BiosElement likes this.
  22. RealMTG

    RealMTG

    Joined:
    Jul 27, 2013
    Posts:
    357
    Hi!
    Just wanted to pop by and say that when I tried to join the Discord server, I'm just greeted by an invalid invite screen. "This invite may be expired, or you might not have permission to join." Darn shame as I would like to join it in case I need help! :)
     
  23. MrG

    MrG

    Joined:
    Oct 6, 2012
    Posts:
    335
    Here ya go - https://discord.gg/2BvnM4R
     
    RealMTG likes this.
  24. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,685
    Which link did you try?
     
  25. RealMTG

    RealMTG

    Joined:
    Jul 27, 2013
    Posts:
    357
    I tried the one on here on the forum post, but I then later realized you need to be logged into Discord in your browser, or else it will just give you an error (that doesn't tell you that you need to be logged in). My bad. :oops:
     
    vis2k likes this.
  26. dimon_babon

    dimon_babon

    Joined:
    Dec 30, 2018
    Posts:
    25
    Hi, if i switch to Mirror, will i still be able to use it in a 'One person is a host and a player simultaneously' way. Or does the server have to be separate from the client in mirror?
     
  27. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,685
    Yes, host mode still works!
     
    Last edited: Dec 30, 2018
  28. MrG

    MrG

    Joined:
    Oct 6, 2012
    Posts:
    335
    Host mode also works :D
    Of course you still have to deal with NAT traversal, a public NAT facilitator, and a public relay as fallback. This is true regardless of which networking solution you choose.
     
  29. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,685
    Or just open the port in your router :)
     
  30. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,685
    Progress: lots of smaller improvements today. Removed a lot of unnecessary code (and possible bugs):
     
    Arganth likes this.
  31. Roamer79

    Roamer79

    Joined:
    Oct 25, 2016
    Posts:
    41
    Hey I'm upgrading mirror from a september build and just checking something. So that last package I downloaded months back had a telepathy.dll file and the new zip package does not. Do I just delete everything in the mirror folder and replace with the new zip contents?
     
  32. Justice0Juic3

    Justice0Juic3

    Joined:
    Apr 29, 2013
    Posts:
    185
    @vis2k Final question before using: Is there any option to host "worldwide"/matchmaking servers like in the old UNet?
     
  33. jacknero

    jacknero

    Joined:
    Aug 15, 2018
    Posts:
    23
    HI folks!First of all,very grateful for your going on efforts on the fix and evolution for UNET.

    Since I transport my project to Mirror,the UNET-steam (https://github.com/rempelj/unet-steamworks) plugin I’m using needs a total conversion.For now ,I think I should do it all myself. Due to my poor socket knowledge and experience(as well as English) ,it’ has been really a defy for me.Now I would like to share the work I’ve done and consult you for more help,because actually I got stuck and in fact I’m not sure any of my modification could work indeed.


    1. Mirror has removed everything about channel,so I just delete codes on them,for example ignore the parameters.





    2. I found some fields and attributes just disappear ,so I either replace them with the newer ones (I guess),or just delete them.





    I really don’t if they’re right.



    Since there’s no channel so I guess QoS doesn’t really matter.



    For this one I just can’t find anything looks like, so I delete it.

    3.First I use the release version Mirror and it just can’t connect(localhost,0).

    Since I use 2018.2.18 I change it to the 2018 branch and this socket error is elimated.

    4.Then I found the original unet-steam uses UDP ,afraid of extra compatibility problems caused by TCP.(and there really are,using telepathy will let the initialization stuck at ) So I found Ignorance and put it in.Despite of some little troubles, it helps me push the transport a lot.


    Now the main obstacle in front is this.

    EndOfStreamException: Unable to read beyond the end of the stream.
    System.IO.__Error.EndOfFile () (at <f2e6809acb14476a81f399aeb800f8f2>:0)
    System.IO.BinaryReader.ReadByte () (at <f2e6809acb14476a81f399aeb800f8f2>:0)
    Mirror.NetworkReader.ReadByte () (at Assets/Mirror/Runtime/NetworkReader.cs:21)
    Mirror.NetworkReader.ReadPackedUInt64 () (at Assets/Mirror/Runtime/NetworkReader.cs:71)
    Mirror.NetworkReader.ReadPackedUInt32 () (at Assets/Mirror/Runtime/NetworkReader.cs:61)
    Mirror.Protocol.UnpackMessage (System.Byte[] message, System.UInt16& msgType, System.Byte[]& content) (at Assets/Mirror/Runtime/UNetwork.cs:123)
    Mirror.NetworkConnection.HandleBytes (System.Byte[] buffer) (at Assets/Mirror/Runtime/NetworkConnection.cs:198)
    Mirror.NetworkConnection.TransportReceive (System.Byte[] bytes) (at Assets/Mirror/Runtime/NetworkConnection.cs:273)
    SteamNetworkManager.Update () (at Assets/_Scripts/UNETSteamworks/Network/SteamNetworkManager.cs:206)

    This happens after everything almost done such as the client”connected to UNET server”,”P2P connection established”.Although I can’t tell why this happens and how to solve it ,But I’m sure it’s a lethal error and relates to many very basic things.

    Besides I noticed the connection could disconnected automatically few minutes right after connection established.

    I’m very moved by the passion of discussion and atmosphere here.I hope to get your help and share this good stuff with you sincerely.
     
  34. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,685
    New one has telepathy too. Get Mirror from the asset store maybe, that's the easiest way.

    Mirror is for the game server/client, not for matchmaking servers. Would have to add that yourself or use Unity's upcoming matchmaking service.
     
  35. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,685
    Final 2018 Update and post #1000 on this thread!
    2018 is coming to an end, and it's been one hell of a year for Mirror. It's shaping up really well.
    • We got rid of a LOT of HLAPI magic
    • We started diving into the Weaver, untangling it into several subclasses and simplifying where possible.
    What this means for you guys: Mirror is now faster and more stable than ever before. 500 CCU in a real world project like uMMORPG should be no problem at this point. 1000 CCU are getting more realistic every day, hopefully we can test this in late 2019.

    What this means for us: we are now very comfortable with all aspects of Mirror, including the Weaver. Code was simplified to the point where we can act fast if we need to fix bugs or add new features. And most importantly, we trust it with our multiplayer games.

    ----------------------------------------------------
    Big thanks to all the people that recommended Mirror to their friends, reported bugs, helped people out in our Discord, spread the word and trusted us enough to use it in their game projects.
    Special thanks to all the developers in our discord, especially @goldbug who's in the trenches with me even today, when everyone else is partying.

    We wish you all a great start into 2019!
    ----------------------------------------------------

    We have one last update for 2018:
    NetworkSettings.sendInterval
    and GetNetworkSendInterval were replaced with NetworkBehaviour.syncInterval. Removes about 100LOC, including lots of weaver magic. Easier to deal with now too, no more custom [Range]sendInterval settings for components that should have variable intervals.



    ---
     
    MarkusGod, Hitch42, Dareheim and 3 others like this.
  36. Dareheim

    Dareheim

    Joined:
    Oct 12, 2013
    Posts:
    7
    Happy New Year, devils:D
     
  37. bran76765

    bran76765

    Joined:
    Jul 14, 2018
    Posts:
    19
    Hey, I have a problem that I just can't seem to figure out (and maybe someone here can help me).

    So I'm trying to call a function from a client to get executed on the server. Seems easy enough. I try the [Command] attribute and the host works but a single client doesn't. I try the [ClientRpc] Attribute and get the error "Rpc function being called on client." I've tried other stuff too but nothing seems to be working to get the client syncing its actions and functions with the server.

    Code (CSharp):
    1. void Update()
    2.         {
    3.             float time = Time.deltaTime;
    4.             CmdUpdateSettings();
    5.         }
    6. [Command]
    7.         public virtual void CmdUpdateSettings()
    8.         {
    9.            //Do Stuff here
    10.         }
    11.  
    [Command] only works on Host and the client just straight out skips the [Command] but when I try to do a [ClientRpc] it throws an error as well. Any ideas?

    Edit: Also tried the server in the unity editor and I get the error "Command function called on server". So looking like even though I'm using them for their intended purpose, I'm getting errors because of it lol
     
  38. goldbug

    goldbug

    Joined:
    Oct 12, 2011
    Posts:
    712
    @bran76765
    1. You are calling the [Command] on every frame. That is nuts, that is a lot of traffic on your network. You should only call the command on key presses, or button presses or something like that.
    2. Is this [Command] on a player object? You need to get familiar with the authority model of Mirror. If you have 3 clients connected to your server, then there will be 4 instances of your this player object one in each client and one in the server. One of the clients will be designated as the owner of that object, and only he is allowed to call [Command], the other ones will get errors. So check if isLocalPlayer before calling the [Command]
    3. Make sure the player object is assigned as the player prefab in the network manager and auto spawned (at least to start with)
    4. [Commands] can only be called in the client (or host), and they get executed in the server (or host).
    5. You might want to watch some Unet tutorial to get familiar with the framework
     
  39. bran76765

    bran76765

    Joined:
    Jul 14, 2018
    Posts:
    19

    1. Yes I'll try to slim it down after but atm I just need it working.
    2. Yes it's on a player object and I've tried checking if isLocalPlayer but it still gets passed through all the same and skips all the commands.
    3. It's not the player prefab, I'm using uMMO's systems and both host and client are getting spawned the same way....but I'll try taking another look at the client and see how it gets spawned in.
     
  40. jacknero

    jacknero

    Joined:
    Aug 15, 2018
    Posts:
    23
    Happy New Year Guys.
    I recently meet some message transport problems.
    I send a spawnRequest from Cient to Host like this:
    Code (CSharp):
    1. myClient.Send(NetworkMessages.SpawnRequestMsg, new StringMessage(SteamUser.GetSteamID().m_SteamID.ToString()));
    On the Host I got a "EndOfStreamException: Unable to read beyond the end of the stream. " error.
    I checked the message I send by a modified TransportSend method
    Code (CSharp):
    1. SteamNetworking.SendP2PPacket(steamId, bytes, (uint)numBytes, eP2PSendType, channelId)
    and found that message 21 Bytes long,consists of a sring of SteamID(17) after a 4 Bytes unknown data.
    I call it Unkown because the msgType should normal a short ,it should be only 2 Bytes long.
    Does this caused the "ReadByte"error?
     
  41. jacknero

    jacknero

    Joined:
    Aug 15, 2018
    Posts:
    23
    After I checked the data the Host recieved ,I found it actually recieved nothing .
    And the send method also return a fail result.
    It seems it's the steam things problem ,not mirror's for now.
     
  42. goldbug

    goldbug

    Joined:
    Oct 12, 2011
    Posts:
    712
    Channels were restored a while back. they work for [Command],[ClientRpc],[TargetRpc] and [EventRpc] and custom messages, But they do not work for syncvars and synclists since unreliable does not make sense for them.

    One of our discord users already made a steam transport for Mirror.
    https://github.com/FizzCube/SteamNetNetworkTransport
    and it does support channels.

    I suggest you take a look at that


    If you use steam, you are using UDP, our TCP transport would be completely unused and you don't need to worrry about it.

    That error normally means that your messages are corrupted for some reason. Either your transport is doing something wrong with the message, or your components override OnSerialize/OnDeserialize and they are not handling the data correctly.


    By all mean, join us in discord where most of the action happens.
     
  43. VrTechEx

    VrTechEx

    Joined:
    Aug 4, 2013
    Posts:
    36
    I get the error when I change to .net 4.x

    Code (CSharp):
    1. Unable to delete file Library/ScriptAssemblies/Assembly-CSharp.pdb: Sharing violation on path Library/ScriptAssemblies/Assembly-CSharp.pdb
    2. UnityEngine.Debug:LogWarning(Object)
    3. Mirror.Weaver.Weaver:Weave(String, IEnumerable`1, IAssemblyResolver, String, String, String)
    4. Mirror.Weaver.Weaver:WeaveAssemblies(IEnumerable`1, IEnumerable`1, IAssemblyResolver, String, String, String)
    5. Mirror.Weaver.Program:Process(String, String, String, String[], String[], IAssemblyResolver, Action`1, Action`1)
    6. Mirror.Weaver.<>c:<.cctor>b__0_0(String, CompilerMessage[])
    7. UnityEditor.Scripting.ScriptCompilation.EditorCompilationInterface:TickCompilationPipeline(EditorScriptCompilationOptions, BuildTargetGroup, BuildTarget)
    8.  
    Any ideas?
     
    Zelek likes this.
  44. RelajoSoft

    RelajoSoft

    Joined:
    Apr 29, 2018
    Posts:
    21
    Is it possible to create a lobby using mirror?
     
  45. goldbug

    goldbug

    Joined:
    Oct 12, 2011
    Posts:
    712
    @VrTechEx This is caused by the incremental compiler in 2018.3. The pdb is not essential so we just print a warning. You can ignore this warning.

    On a side note, if you are using unity 2018.3, make sure to get the 2018 branch. The version from the asset store (master branch) has known issues with it.
     
    Zelek and VrTechEx like this.
  46. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,685
    Yes. I did this in my uMOBA asset - which is the only Mirror lobby example as far as I know.
    There is also 'network lobby' asset on asset store, but it still uses UNET and it's full of bugs.
     
  47. vis2k

    vis2k

    Joined:
    Sep 4, 2015
    Posts:
    3,685
    News: new NetworkTransform is live. It only syncs the transform, and it actually uses interpolation now.

    NetworkRigidbody etc. may follow, but using NetworkTransform for everything should do just fine - because in the end, it's always just about the position and the rotation. If you use Rigidbodies then consider setting to kinematic on everything that doesn't have authority.

    This removes almost 2000 lines of magic code from Mirror, which is huge.

    Lines of Code overview:
    • UNET: 21129 lines of code
    • Mirror: 11134 lines of code (7681 without Weaver)
    That's half as much code that your CPU needs to worry about.
    That's half as much code that we need to worry about when debugging and adding features.
    That's half as many possible bugs (not to mention all the broken code that we rewrote)
     
    validname1, JimChan88 and pesapower like this.
  48. pesapower

    pesapower

    Joined:
    Oct 13, 2015
    Posts:
    1
    That's really good news, thank you really much for your fabulous work!
     
  49. Paradoks

    Paradoks

    Joined:
    Oct 13, 2009
    Posts:
    426
    Will mirror work with webGL(client) / linux(server) games ?
     
  50. AnthonE

    AnthonE

    Joined:
    Sep 30, 2015
    Posts:
    2
    This was some amazing timing. I've been using UNet from release and saw this project along the way. I figured I would hold out for as long as I could. So last night, I gave up trying to get my transforms to sync better. I came here to check the latest about the project. This post had perfect timing for me!

    Then after reading about all the bugs that Mirror fixes, I realized just how buggy my game was thanks to Unet. No way I would ever reach 100 players on one server. Pretty sure I was getting out of sync with just 7-8 players, explaining the never before seen bugs.

    Thanks to everyone who has helped to contribute to this whole project! This has really reinvigorated the work on doing right now. After Unet support was dropped I was really disappointed. You all saved the day.
     
    vis2k likes this.
unityunity