This is an extension/doc of a video guide I made -- I am posting this here for the dual purpose that: 1) This may help you! 2) I am hoping others will please add to this (and correct me~). <rage style="passiveAggressive"> While Unity isn't updating any docs/demos/videos/tutorials on UNET/Lobby/HLAPI/MatchMaker/HostMigration or anything pre-game (hint, hint) </rage> I've been trying to get the workflow down for lobby since November (that link gets ugly, here is the better/updated version) - I feel that I've progressed a lot and would like some help filling in the gaps, for the sake of myself and others while the lobby/HLAPI/MatchMaker is extremely undocumented: Create a new empty scene - save it as Game. Create a new scene. Save it as Lobby. Stay here. Build settings >> Set Lobby as 0, Game as 1. Create LobbyMgr gameObj. Throw on a NetworkLobbyMgr derived script on LobbyMgr gameObj. I called it lobbyMgr. Throw on a Mono derived script on LobbyMgr gameObj (because NetworkLobbyMgr destroys on match d/c, so need something static). I called it lobbyUI. StartMMBtn to click - 1 single button to rule it all. Link an event to call MMStart() to start from our lobbyUI script. The UI script will find the non-destroyed version of lobbyMgr and get it to start matchMaker later. Create LobbyPlayer gameObj. Throw on a NetworkLobbyPlayer derived script on LobbyPlayer gameObj. I called it lobbyPlayer. This will automatically add a Network Identity. Save as prefab, then delete. Create GamePlayer gameObj. Throw on a NetworkLobbyPlayer derived script on GamePlayer. I called it lobbyPlayerScript. This will automatically add a Network Identity. Save as prefab, then delete. On lobbyMgr inspector, drag your LobbyPlayer into Lobby Player, GamePlayer into Game Player, Lobby Scene into Lobby Scene, Day scene into Day Scene. Set max players. I put 3. ___________________________________ So, up to this point, we have: * a btn that calls StartMM() from UI (which will find the lobbyMgr instance and call start matchMaker later), * a lobbyMgr with 2 scripts inside, * a LobbyPlayer prefab deleted, * a GamePlayer prefab deleted, * and the lobbyMgr component's serialized fields filled ___________________________________ Open your lobbyMgr script and make a void MMStart(). Inside that, add: this.StartMatchMaker(). This will enable this.MatchMaker.<thingsToDo> Below StartMatchMaker, add: this.ListMatches(parameters....., OnMatchList) Then outside that void, add public override void ListMatches(p1, p2, p3). Inside this, in a nutshell, if success && list.Count > 0, there's players so, for each the list, if the match has a player and isn't full, join 1st match: this.JoinMatch(match......OnMatchJoin). ELSE IF no matches found, then: this.CreateMatch(params.....OnMatchCreate) Create a: override void OnMatchJoin(p1, p2, p3) -- Pretty much, if (success) then you're good to go. After that, you need to handle some override events to ready up automatically later. Create a: override void OnMatchCreate(p1, p2, p3) -- Pretty much, good to go. In your Start() on lobbyPlayer script we made in #10, if it's a this.localPlayer and isn't already this.ReadyToBegin then SendReadyToBeginMessage() to auto-ready up. Throw in your SyncLists, SyncVars (Example), ClientRpc and Cmd's here. Probably to sync a x/y players joined the game and a list of players that joined. It's hard to find these instances, so you should probably create a List<lobbyPlayer> on your lobbyMgr script to keep track of instances. For the index, use this.slot -- the slot is super important to remember as it's most all of your indexes for everything that is UI or instances. Don't forget TO DO something with the vars when they sync. You need a hook [SyncVar(hook="someCallbackVoid")] I think? I forgot ... I'm just using a SyncList so far that has it's own .callback The easiest way to remember ClientRpc vs Cmd is .... isServer? Then [ClientRpc] isClient? Then [Command] with nothing but the RpcSomething() call. Pretty much, what you're trying to do is saying "I'm a client, so I need to tell the server to tell the other clients to do something". In comparison, your laptop can't talk to your desktop directly, BUT you can ask your router to relay a message to your laptop. ___________________________________ So, up to this point since last point, we have: * lobbyMgr.StartMatchMaker() * lobbyMgr.Start * lobbyMgr.ListMatches(....,OnMatchList) * override void OnMatchList() * @ OnMatchList, if game, join 1st JoinGame(match, ..., OnMatchJoin) * @ MatchList, if NO game, CreateGame(..., OnMatchCreate) * Ready up your client * ClientRpc, Cmd, SyncStuff ___________________________________ Now, we need to handle disconnection from server/client. PLEASE HELP If you guys made it this far and know how to handle d/c, let's help each other out and let us know what you did and where you did it <3 Or if a UNET dev exists (I heard legends!) in this forum that wants to respond to fill in some gaps, that would rock! (To start somewhere on disconnection, I created a CancelBtn, but we also need to handle disconnection outside the btn, like loss of connection, directly closing the game, etc. For CancelBtn, I call lobbyMgr.StopHost() which technically works (on both server/client), but bugs out the server for the next 30 seconds) Hopefully this is a nice win-win guide. Catch up to me, then let me know what to do next If I can answer my own question, I will update this. Until then, guys, help us all out and update/correct this, add tips, and add unofficial documentation here. >> Want OFFICIAL doc support/demos/examples/Q+A? Shout out to the devs for help!