Intro to Unity NetCode Multiplayer
Code and workflows to find/create/join/leave LAN games with authoritative scorekeeping

What you'll develop in the Multiplayer section

Ability to join a LAN game through broadcasting and receive ghosts within a certain radius

Functionalities included

  • Using launch GameObjects to configure server and client connections
    • Trigger starting a game as a NetCode host
    • Trigger starting a game but joining as a NetCode client to a specific IP address
  • Sending and receiving broadcast messages
    • Automatically send a broadcast UDP packet of game information including IP address on LAN for players to join
    • Listen and receive broadcast UDP packet information and populating a ListView of available LAN games
  • Run Threads to listen for UDP packets
    • Be able to run non-Unity handled threads in-game
  • Graceful handling of joining and leaving games
    • Add NetworkStreamRequestDisconnect component on both host and client when quitting a game
    • Handling timeouts by querying for NetworkStreamDisconnected components from host and client to clean up entities and return to title screen
  • Server-authoritative scorekeeping
    • Create PlayerScore ghosts and HighestScore ghosts to keep player scores authoritative and in sync
    • Associate scores with NCE NetworkIdComponent values
  • UI Toolkit + DOTS
    • Updating Game UI through a MonoBehaviour by pulling DOTS data from ghosts
  • Using GhostRelevancyMode to be mindful of network transmission
    • We will implement a server-side system that will send only send ghosts within a certain radius to players
    • We will also include the ability to override this behavior to send player scores to all players

How we'll handle finding/joining/hosting games

Joining and hosting games

We must pass data between NavigationScene and MainScene in our project. This data includes:
  • Game name
  • Server IP
  • Player name
  • Broadcast port
These are the same values that are currently in our ClientLaunchObject and ServerLaunchObject in MainScene.
We will create ClientLaunchObject and ServerLaunchObject in NavigationScene before we transition to MainScene and use DontDestroyOnLoad() so they "survive" the transition between scenes.
Unity has started to recommend using a "manager scene" by using additive scene loading. This is a solid approach, but it's just a bit overkill for this tutorial so you won't see it in this gitbook.

Finding games

We will be using .NET's UdpClient class to send broadcast packets across the local area network's router. This will not work if the player is not connected to WiFi.
We will also be using .NET's Thread class to create listening threads for broadcast packets so it does not interrupt Unity's threading.

Linking DOTS and MonoBehaviour

NetCode will handle the tracking of scores of each player in the game. We want to take this data from ECS and populate the game UI which runs on MonoBehaviours.
In this section we will demonstrate our approach of pulling data from ECS into MonoBehaviours by using the EntityManager.
In the next AR Foundation section, we will also demonstrate how we provide data from MonoBehaviours (the AR Camera's "pose") to ECS.
With both of these techniques it is possible to use any classic Unity MonoBehaviours with ECS.
They key is to understand that a ECS System cannot "push" values directly into a GameObject; instead, a MonoBehaviour must "pull" data using an EntityManager.

Unity resources

Unity documentation for NetCode 0.6.0-preview.7:[email protected]/manual/index.html Refer to this for more information on NetCode.
Unity samples for NetCode: This is the official Unity Asteroids sample that we based our gitbook off of.
Unity thread for NetCode: Unity is responsive here.
Unity documentation for UI Builder 1.0.0-preview.12:[email protected]/manual/index.html Refer to this for more information.
Unity documentation for UI Toolkit: Refer to this for more information on UI Toolkit.
Microsoft's documentation for UdpClient: Refer to this for more info on broadcasting.
Microsoft's documentation for Thread: Refer to this for more info on multi-threading.