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: https://docs.unity3d.com/Packages/[email protected]/manual/index.html Refer to this for more information on NetCode.
Unity samples for NetCode: https://github.com/Unity-Technologies/multiplayer This is the official Unity Asteroids sample that we based our gitbook off of.
Unity thread for NetCode: https://forum.unity.com/threads/dots-multiplayer-discussion.694669/ Unity is responsive here.
Unity documentation for UI Builder 1.0.0-preview.12: https://docs.unity3d.com/Packages/[email protected]/manual/index.html Refer to this for more information.
Unity documentation for UI Toolkit: https://docs.unity3d.com/2020.1/Documentation/Manual/UIElements.html Refer to this for more information on UI Toolkit.
Microsoft's documentation for UdpClient: https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.udpclient?view=net-5.0 Refer to this for more info on broadcasting.
Microsoft's documentation for Thread: https://docs.microsoft.com/en-us/dotnet/api/system.threading.thread?view=net-5.0 Refer to this for more info on multi-threading.
Last modified 7mo ago