From c2f62d93358fda291765cd15bd90699eb204ba7e Mon Sep 17 00:00:00 2001 From: Larah Armstrong <29762984+armstrongl@users.noreply.github.com> Date: Wed, 7 Dec 2022 18:40:19 -0600 Subject: [PATCH 1/4] Update UTP 2.0 documentation --- .../version-2.0.0/about.md | 32 +- .../version-2.0.0/custom-pipeline.md | 1 - .../version-2.0.0/getting-started.md | 17 +- .../version-2.0.0/install.md | 28 +- .../integrate-with-unity-logging.md | 8 + .../version-2.0.0/migration.md | 58 +-- .../version-2.0.0/network-settings.md | 22 +- .../version-2.0.0/pipelines-usage.md | 186 ++++---- .../version-2.0.0/supported-platforms.md | 3 +- .../version-2.0.0/using-sample.md | 27 +- .../workflow-client-server-jobs.md | 161 ++++--- .../workflow-client-server-secure.md | 88 ++-- .../workflow-client-server-udp.md | 228 +++++----- .../workflow-client-server-ws.md | 425 +----------------- .../version-2.0.0-sidebars.json | 40 +- 15 files changed, 492 insertions(+), 832 deletions(-) create mode 100644 transport_versioned_docs/version-2.0.0/integrate-with-unity-logging.md diff --git a/transport_versioned_docs/version-2.0.0/about.md b/transport_versioned_docs/version-2.0.0/about.md index f62448d7b..9c9a4e395 100644 --- a/transport_versioned_docs/version-2.0.0/about.md +++ b/transport_versioned_docs/version-2.0.0/about.md @@ -2,35 +2,19 @@ id: about title: About Unity Transport --- -:::note -Need an update before releasing UTP 2.0.0 -::: -Unity Transport provides the `com.unity.transport` package, used to add multiplayer and network features to your project. +The Unity Transport package (`com.unity.transport`) is a low-level networking library for multiplayer game development. -:::note -This package should not be confused with Unity Netcode's `NetworkTransport` abstraction. Please see Netcode's [Transports](/netcode/current/advanced-topics/transports) section for more information. -::: +It’s the underlying protocol of both [Netcode for GameObjects](../../docs/about.md) and [Netcode for Entities](https://docs.unity3d.com/Packages/com.unity.netcode@latest), but you can also use it with a custom solution. -:::unity Content Licenses -All Transport code and documentation is covered by Unity Companion License. See [Licenses](/reference/license) for more information. -::: +Unity Transport seamlessly supports all platforms the Unity Engine supports thanks to a connection-based abstraction layer (built-in network driver) provided over UDP and WebSockets. -## Overview +You can set up both UDP and WebSockets with or without encryption. The following illustration shows encrypted connections with a closed padlock and unencrypted connections with an open padlock. -![Transport Overview](/img/transport/layercake.png) + -## Installing Transport +You can also use [pipelines](pipelines-usage.md) to leverage additional functionality, such as reliability, packet ordering, and packet fragmentation. -See the [installation guide](install.md) to install the `com.unity.transport` package. +## Get started with Unity Transport -## Using Transport - -To learn how to use the `com.unity.transport` package in your own project, review the client and server workflows, additional information, and sample code available in this guide. - -## Requirements - -This version of `com.unity.transport` is compatible with the following Unity versions and platforms: - -* 2020.1.2 and later. -* All platforms supported by Unity are supported, except WebGL. +See [Getting started](getting-started.md). diff --git a/transport_versioned_docs/version-2.0.0/custom-pipeline.md b/transport_versioned_docs/version-2.0.0/custom-pipeline.md index bf29ac08b..41a6499eb 100644 --- a/transport_versioned_docs/version-2.0.0/custom-pipeline.md +++ b/transport_versioned_docs/version-2.0.0/custom-pipeline.md @@ -4,4 +4,3 @@ title: Custom Network interface --- COMING SOON. - \ No newline at end of file diff --git a/transport_versioned_docs/version-2.0.0/getting-started.md b/transport_versioned_docs/version-2.0.0/getting-started.md index 78a0eb2ac..a523e28af 100644 --- a/transport_versioned_docs/version-2.0.0/getting-started.md +++ b/transport_versioned_docs/version-2.0.0/getting-started.md @@ -3,4 +3,19 @@ id: getting-started title: Getting Started --- -#PlaceHolder +See the [Installation](install.md) guide if you’re new to Unity Transport. If you’re upgrading from a earlier version of Unity Transport, see Migrating from 1.X. + +Next, check out [Create a simple client and server](workflow-client-server-udp.md) and the Unity Transport [sample projects](using-sample.md). + +## Requirements + +- Install Unity Editor version 2022.2 or later. +- Install the `com.unity.transport` package. + +:::note +WebGL only supports Unity Transport WebSocket connections in client mode. +::: + +:::warning +Unity Transport (the `com.unity.transport` package) is separate from the NetworkTransport abstraction in Netcode for GameObjects. +::: diff --git a/transport_versioned_docs/version-2.0.0/install.md b/transport_versioned_docs/version-2.0.0/install.md index 07927a143..2b530d081 100644 --- a/transport_versioned_docs/version-2.0.0/install.md +++ b/transport_versioned_docs/version-2.0.0/install.md @@ -4,22 +4,26 @@ title: Install Unity Transport description: Install Unity Transport, the com.unity.transport package, using the Package Manager. --- -:::note -Need an update before releasing UTP 2.0.0 -::: - Follow these instructions to install Unity Transport. ## Prerequisites -You need Unity Editor version 2020.1.2f1 or later. +Unity Transport 2.0 requires Unity Editor version 2022.2 or later. + +:::note +WebGL only supports Unity Transport WebSocket connections in client mode. +::: + +:::warning +Unity Transport (the com.unity.transport package) is separate from the NetworkTransport abstraction in Netcode for GameObjects. +::: ## Install Transport -1. Open the **Unity Hub**. -1. Create a **New Project** or open an existing Project you want to include Transport. -2. Open the **Unity Package Manager** by navigating to **Window** > **Package Manager** along the top bar. -3. Click ![Add](/img/add.png) in the status bar. -4. Select **Add package by name** -5. In the **Name**, enter `com.unity.transport`. It may take a moment to load. -6. Under **Packages** in the **Package Manager**, you should now see **Unity Transport** with it's current version number. \ No newline at end of file +You can install the Unity Transport package using the Package Manager in the Unity Editor: + +1. From the Unity Editor, select **Window** > **Package Manager**. +2. Select **Add (+)** > **Add package by name**. +3. In the **Name** field, enter com.unity.transport. + +After the import completes, you should see Unity Transport under **Packages** in the **Package Manager**. diff --git a/transport_versioned_docs/version-2.0.0/integrate-with-unity-logging.md b/transport_versioned_docs/version-2.0.0/integrate-with-unity-logging.md new file mode 100644 index 000000000..837c22178 --- /dev/null +++ b/transport_versioned_docs/version-2.0.0/integrate-with-unity-logging.md @@ -0,0 +1,8 @@ +--- +id: integrate-logging +title: Integrate with Unity Logging +--- + +Unity Transport integrates well with the Unity Logging package (`com.unity.logging`), an efficient alternative to the standard Unity logger. Normally, log messages go through `UnityEngine.Debug.Log`. However, if you include both packages in a project, Unity Transport automatically uses `Unity.Loggin`g with the default logger settings. + +Check the [`Unity.Logging` documentation site](https://docs.unity3d.com/Packages/com.unity.logging@latest) for more information on how to adjust specific log settings. diff --git a/transport_versioned_docs/version-2.0.0/migration.md b/transport_versioned_docs/version-2.0.0/migration.md index 41332ccd6..2b5cf89e8 100644 --- a/transport_versioned_docs/version-2.0.0/migration.md +++ b/transport_versioned_docs/version-2.0.0/migration.md @@ -1,65 +1,69 @@ --- id: migration -title: Migration from 1.X +title: Migrate from 1.X description: How to deal with breaking changes introduced in version 2.0 of Unity Transport. --- This section describes the breaking changes introduced in version 2.0 of the Unity Transport Package (UTP). It also explains how to update projects written for version 1.X. -**Note**: In most use cases, there’s no need to perform any additional steps to migrate from 1.X to 2.0. The core APIs like `NetworkDriver` remain the same, and the most significant changes are limited to specialized scenarios, such as [custom network interfaces](custom-network-interface.md). +:::note +In most use cases, there’s no need to perform any additional steps to migrate from 1.X to 2.0. The core APIs (like `NetworkDriver`) remain the same, and the most significant changes are limited to specialized scenarios, such as [custom network interfaces](#custom-network-interfaces). +::: ## Editor version support -UTP 1.X supports Unity Editor 2020.3 and up, but 2.0 only supports 2022.2 and up to keep the `Collections` package dependency up to date. Unity Editor 2022.2 brings many changes to the core engine runtime, allowing more code to be Burst-compiled. UTP benefits from this through increased performance. +UTP 1.X supports Unity Editor 2020.3 and up, but 2.0 only supports 2022.2 and up to keep the Collections package dependency up to date. Unity Editor 2022.2 brings changes to the core Unity Engine runtime, allowing more code to be Burst-compiled. UTP benefits from this through increased performance. -**Note**: UTP 1.X remains fully supported on LTS versions 2020.3 and 2021.3, and Unity will continue to release bug fixes and improvements. However, some features (like WebSocket support) will only be available in UTP 2.0 and up. +:::note +UTP 1.X remains fully supported on LTS versions 2020.3 and 2021.3, and Unity will continue to release bug fixes and improvements. However, some features (like [WebSocket](workflow-client-server-ws.md) support) will only be available in UTP 2.0 and up. +::: -## `DataStreamReader`/`DataStreamWriter` moved to `Collections` +## DataStreamReader/DataStreamWriter moved to Collections -UTP 2.0 moves the `DataStreamReader` and `DataStreamWriter` APIs to the `Collections` package to make them more widely available outside UTP. Consequently, updating to UTP 2.0 might require you to add a `Unity.Collections` directive at the top of files using the `DataStreamReader` and `DataStreamWriter` APIs. +UTP 2.0 moves the `DataStreamReader` and `DataStreamWriter` APIs to the Collections package to make them more widely available outside UTP. As a result, updating to UTP 2.0 might require you to add a using `Unity.Collections` directive at the top of files using the `DataStreamReader` and `DataStreamWriter` APIs. -The APIs are mostly unchanged, except for raw pointers. `Unity.Collections.LowLevel.Unsafe` namespace provides the raw pointer methods with `Unsafe` appended to their names. For example, the method `WriteBytes(byte*, int)` is now `WriteBytesUnsafe(byte*, int)`. +The APIs are mostly unchanged, except for raw pointers. `Unity.Collections.LowLevel.Unsafe` namespace now provides the raw pointer methods with Unsafe appended to their names. For example, the method `WriteBytes(byte*, int)` is now `WriteBytesUnsafe(byte*, int)`. ## Protocol incompatibility -The custom communication protocol UTP uses to implement connections over UDP has changed in a backward-incompatible manner, which means clients running UTP 2.0 or later can't connect to servers running 1.X, and vice versa. If you attempt to establish a connection between UTP 2.0 and UTP 1.X, it returns a connection failure after the usual timeout. +The custom communication protocol UTP uses to implement connections over UDP has changed in a backward-incompatible manner, which means clients running UTP 2.0 or later can't connect to servers running 1.X, and vice versa. If you try to establish a connection between UTP 2.0 and UTP 1.X, UTP returns a connection failure after the usual timeout. -Due to the incompatibility between UTP 2.0 and UTP 1.X, you must either ensure that you either update clients and servers simultaneously or disallow older clients from connecting to updated servers. Alternatively, you can provide different endpoints for UTP 1.X and 2.0 servers to smooth the transition while older clients are updated. +Due to the incompatibility between UTP 2.0 and UTP 1.X, you must either ensure that you update clients and servers simultaneously or disallow older clients from connecting to updated servers. Alternatively, you can create different endpoints for UTP 1.X and 2.0 servers to smooth the transition while you update older clients. -These breaking changes introduced in UTP 2.0 improve bandwidth efficiency, simplify the protocol, and lay the foundations for better forward compatibility. +These breaking changes improve bandwidth efficiency, simplify the protocol, and lay the foundations for better forward compatibility. ## Custom network interfaces The updates in UTP 2.0 heavily modify the `INetworkInterface` API used to implement custom network interfaces (the low-level layer to send and receive packets) to simplify it. -UTP 2.0 introduces the following breaking changes to custom network interfaces: +UTP 2.0 introduces the following breaking changes to custom network interfaces: -* UTP 2.0 no longer has the concept of `NetworkInterfaceEndPoint`; the more general `NetworkEndpoint` replaces `NetworkInterfaceEndPoint`. As a result, you do not need to implement conversion logic between `NetworkEndpoint` and `NetworkInterfaceEndPoint` anymore, so `INetworkInterface` omits `CreateInterfaceEndPoint` and `GetGenericEndPoint`. -* You no longer need to provide a `NetworkSendInterface` through `CreateSendInterface`. `ScheduleSend` handles `Send` operations, which get passed a `PacketsQueue` containing the packets to send. -* The `ScheduleReceive` method doesn't use the (now obsolete) `NetworkPacketReceiver` to propagate received packets to the rest of UTP. Instead, implementations of `ScheduleReceive` should fill the `PacketsQueue` passed in with the received packets. -* Implementations of `INetworkInterface` must now be fully compatible with Burst. If an implementation is incompatible with Burst, you can wrap it into a compatible implementation with the new `WrapToUnmanaged` extension method. -* You must now create `NetworkDriver`s using a custom network interface using the static `NetworkDriver.Create` method. For example, `NetworkDriver.Create(new MyCustomInterface())` creates a `NetworkDriver `named `MyCustomInterface()`. Directly constructing a `NetworkDriver` with `new` is deprecated. -* `INetworkInterface.Initialize` now takes another parameter: a reference to the packet padding, and you can increase this value to reserve space for headers. +- UTP 2.0 no longer has the idea of `NetworkInterfaceEndPoint`; the more general `NetworkEndpoint` replaces `NetworkInterfaceEndPoint`. As a result, you don't need to implement conversion logic between `NetworkEndpoint` and `NetworkInterfaceEndPoint` anymore, so INetworkInterface omits `CreateInterfaceEndPoint` and `GetGenericEndPoint`. +- You no longer need to create a `NetworkSendInterface` through `CreateSendInterface`. `ScheduleSend` handles send operations, which get passed a `PacketsQueue` containing the packets to send. +- The `ScheduleReceive` method doesn't use the (now obsolete) `NetworkPacketReceiver` to propagate received packets to the rest of UTP. Instead, implementations of `ScheduleReceive` should fill the `PacketsQueue` passed in with the received packets. +- Implementations of `INetworkInterface` must now be fully compatible with Burst. If an implementation is incompatible with Burst, you can wrap it into a compatible implementation with the new `WrapToUnmanaged` extension method. +- You must now create NetworkDrivers using a custom network interface using the static `NetworkDriver.Create` method. For example, `NetworkDriver.Create(new MyCustomInterface())` creates a `NetworkDrivernamed MyCustomInterface()`. Directly constructing a NetworkDriver with new is deprecated. +- `INetworkInterface.Initialize` now takes another parameter: a reference to the packet padding, and you can increase this value to reserve space for headers. -These breaking changes simplify and increase the flexibility of the interface. See [Custom network interfaces](custom-network-interface.md) for more details on creating custom network interfaces. +These breaking changes simplify and increase the flexibility of the interface, making it easier to create custom network interfaces. ## Pipeline stages -UTP 2.0 does not introduce changes to how you write custom pipeline stages. However, the mechanisms you should use to register and get the identifier of a pipeline stage have changed: +UTP 2.0 don't introduce changes to how you write custom pipeline stages. However, the mechanisms you should use to register and get the identifier of a pipeline stage have changed: -* Instead of registering a custom pipeline stage with `NetworkPipelineStageCollection.RegisterPipelineStage`, use `NetworkDriver.RegisterPipelineStage`. Note: You must perform this change on every instance of `NetworkDriver` that uses the custom pipeline stage. -* Instead of retrieving the ID of a pipeline stage with `NetworkPipelineStageCollection.GetStageId`, use the static `NetworkPipelineStageId.Get` method. +- Instead of registering a custom pipeline stage with `NetworkPipelineStageCollection.RegisterPipelineStage`, use `NetworkDriver.RegisterPipelineStage`. You must do this on every instance of `NetworkDriver` that uses the custom pipeline stage. +- Instead of retrieving the ID of a pipeline stage with `NetworkPipelineStageCollection.GetStageId`, use the static `NetworkPipelineStageId.Get` method. -These breaking changes remove Burst-incompatible APIs, allowing you to use more of UTP with Burst-compiled code. +These breaking changes remove Burst-incompatible APIs, allowing you to use more of UTP with Burst-compiled code. -For more information, see [Creating a custom pipeline stage](custom-pipeline.md) and [Pipeline usage](pipelines-usage.md). +For more information, see the [section on using pipelines](https://docs.unity3d.com/Packages/com.unity.transport@2.0/manual/pipelines-usage.html). ## Other breaking changes -In addition to the changes around data streams, custom network interfaces, and pipeline stages, UTP 2.0 also introduces the following breaking changes: +UTP 2.0 also introduces the following breaking changes: -* You must now complete a `NetworkDriver.ScheduleUpdate` job when notifying the remote peer of the disconnection after calling `NetworkDriver.Disconnect`. In 1.X, `NetworkDriver.ScheduleFlushSend` was sufficient to notify a remote peer of a disconnection, but this is not the case with UTP 2.0. This change supports new protocols, such as WebSockets, where disconnecting might involve more work than simply sending a message. -* Using `SimulatorPipelineStageInSend` is now deprecated. Instead, use `SimulatorPipelineStage` and configure the new `ApplyMode` parameter to the direction (for example, `send`, `receive`, or both). +* You must now complete a `NetworkDriver.ScheduleUpdate` job when notifying the remote peer of a disconnection after calling `NetworkDriver.Disconnect`. In 1.X, `NetworkDriver.ScheduleFlushSend` was enough to tell a remote peer of a disconnection, but this isn't the case with UTP 2.0. This change supports new protocols, such as WebSockets, where disconnecting might involve more work than simply sending a message. +* Using `SimulatorPipelineStageInSend` is now deprecated. Instead, use SimulatorPipelineStage and configure the new `ApplyMode` parameter to the direction desired (send, receive, or both). * `NetworkSettings.WithBaselibNetworkInterfaceParameters` is now deprecated. You can no longer configure the maximum payload size; UTP handles the payload size automatically. However, you can configure the receive and send queue sizes with `NetworkSettings.WithNetworkConfigParameters`. * UTP 2.0 removes `NetworkSettings.WithDataStreamParameters` and `NetworkSettings.WithPipelineParameters`. You no longer need to manually configure either of these parameters, so the methods are unnecessary. You can safely delete calls to these methods. -* You no longer need to configure `Read` and handshake timeouts through `NetworkSettings.WithSecureClientParameters` and `NetworkSettings.WithSecureServerParameters`. Instead, UTP derives the values automatically from other configuration parameters. You can safely remove these settings from these calls. +* You no longer need to configure read and handshake timeouts through `NetworkSettings.WithSecureClientParameters` and `NetworkSettings.WithSecureServerParameters`. Instead, UTP derives the values automatically from other configuration parameters. You can safely remove these settings from these calls. diff --git a/transport_versioned_docs/version-2.0.0/network-settings.md b/transport_versioned_docs/version-2.0.0/network-settings.md index 11254b139..911742b42 100644 --- a/transport_versioned_docs/version-2.0.0/network-settings.md +++ b/transport_versioned_docs/version-2.0.0/network-settings.md @@ -1,24 +1,29 @@ --- id: network-settings -title: network settings +title: Network settings --- The configuration of the `NetworkDriver` is defined using the `NetworkSettings` API. It might be required to change some of the default values of the parameters, that can be done as in the following example. -```markdown title="NetworkSettings example" + +```csharp title="NetworkSettings example" var settings = new NetworkSettings(); settings.WithNetworkConfigParameters(disconnectTimeoutMS: 1000); var driver = NetworkDriver.Create(settings); ``` + ## Extending the NetworkSettings -When extending Unity Transport it is often useful to add custom parameters or settings that users can set to define the configuration of the `NetworkDriver`. -That can be done by extending the `NetworkSettings` API so the custom Network Interfaces or Pipelines can capture the parameter values inside the Initialization method as detailed in the following sections. + +When extending Unity Transport it's often useful to add custom parameters or settings that users can set to define the configuration of the `NetworkDriver`. +S +That can be done by extending the `NetworkSettings` API so the custom Network Interfaces or Pipelines can capture the parameter values inside the `Initialization` method as detailed in the following sections. ### INetworkParameter + By implementing the `INetworkParameter` interface, any unmanaged struct can be identified as a network parameter that can be assigned to the `NetworkDriver` settings. The `NetworkSettings` will automatically call the `Validate()` method and will throw an exception if `false` is returned. -```markdown title="INetworkParameter example" +```csharp title="INetworkParameter example" public struct MyCustomParameter : INetworkParameter { public int MyCustomInt; @@ -37,12 +42,13 @@ public struct MyCustomParameter : INetworkParameter } ``` -### NetworkSettings extension methods +### `NetworkSettings` extension methods + Every new custom `INetworkParameter` requires of at least one extension method to the `NetworkSettings` API. These extension methods must receive and return a `ref NetworkSettings` to ensure the proper functioning of the fluent interface. Those constraints are checked by the Roslyn Analyzers provided in the Unity Transport package. -```markdown title="NetworkSettings extension methods example" +```csharp title="NetworkSettings extension methods example" public static class MyCustomParameterExtensions { private const int k_MyCustomIntDefault = 1024; @@ -76,4 +82,4 @@ public static class MyCustomParameterExtensions return parameter; } } -``` \ No newline at end of file +``` diff --git a/transport_versioned_docs/version-2.0.0/pipelines-usage.md b/transport_versioned_docs/version-2.0.0/pipelines-usage.md index ac33468a9..169ad1448 100644 --- a/transport_versioned_docs/version-2.0.0/pipelines-usage.md +++ b/transport_versioned_docs/version-2.0.0/pipelines-usage.md @@ -3,150 +3,136 @@ id: pipelines title: Use pipelines --- -Pipelines are a feature which offers layers of functionality on top of the default socket implementation behaviour. In the case of the UDP socket this makes it possible to have additional functionality on top of the standard unreliable datagram, such as Quality of Service features like sequencing, reliability, fragmentation and so on. +Pipelines are a core functionality of Unity Transport that allows selectively adding layers of functionality on top of the standard unreliable datagrams that UTP provides by default. -## How it works +You can use pipelines to add sequencing, reliability, and fragmentation features. -The way it works is that you can add any number of pipelines (each with any number of stages) to your transport driver. The pipelines are chained together in the order defined by the user. Each pipeline input will the output of the previous pipeline. In other terms, when you send a packet it will go to the first stage, then the second one and so on until it's sent on the wire. On the receiving side the stages are then processed in reverse order, so the packet is correctly "unpacked" by the stages. +Pipelines are a sequence of one or more stages. When you **send** a message through a pipeline, Unity Transport runs through the stages in order, piping the output of the first stage into the second stage. As a result, if the first stage adds a header to the packet, the second stage processes the entire packet, including the header added by the first stage. When you **receive** a message, it goes through the same chain of stages in reverse order. -For example the first stage might compress a packet and a second stage could add a sequence number (just the packets header). When receiving the packet is first passed through the sequence stage and then decompressed. The sequence stage could drop the packet if it's out of order in which case it leaves the pipeline and doesn't continue to the decompression. + -:::note -* The order in which the pipelines are defined is extremely important. For instance, a pipeline created with ```CreatePipeline(typeof(ReliableSequencedPipelineStage), typeof(SimulatorPipelineStage))``` is different from a pipeline created with the same stages but in the reverse order. - In that example, putting the simulator pipeline stage first would result in packets being dropped/delayed before there can be any reliability added to them, which is likely not the desired outcome. -* It is highly recommended to use the same pipelines, in the same order for both the client and the server. -::: - -![PipelineStagesDiagram](/img/transport/pipeline-stages.png) +`FragmentationPipelineStage` allows breaking large messages into smaller pieces, and `ReliableSequencedPipelineStage` allows sending messages with guaranteed order and delivery. The following example shows how to create a pipeline with both functionalities: -The pipeline stages are gathered together in a collection. This is the interface between the pipeline processor in the driver to the pipeline stages you might be using. Here the pipeline stages are initialized and so on. There is a default collection provided in the driver which has all the built in pipeline stages already configured. It's possible to just use that and use a custom collection if you have your own pipeline stage you need to add to the collection. +```csharp +// In initialization code, before any connections are made. +var myPipeline = driver.CreatePipeline( + typeof(FragmentationPipelineStage), typeof(ReliableSequencedPipelineStage)); +``` +This creates a pipeline where Unity Transport first fragments messages into smaller pieces (that each fit in a packet), then delivers the individual packets reliably and in the correct order. + -## Example usage +This illustration shows the process of fragmentation and delivering packets in order. The small orange pieces on the fragments represent sequence numbers and other information added by the reliable stage. -The example below shows how the driver can create a new pipeline with 2 pipeline stages present (sequencer and simulator). The driver is created with the default pipeline collection and the pipeline parameters can be passed to the collection there. Multiple pipeline parameters can be passed in this way and the collection itself takes care of assigning them to the right pipeline stage. +:::note +The order of the stages in a pipeline is important. If you reverse the order, UTP only adds the reliability information to the larger unfragmented message. Doing so is less bandwidth-efficient because losing any single fragment would result in needing to resend the entire unfragmented message. By ordering the reliable stage after fragmentation, you only need to resend a single fragment if you lose a fragment. +::: -When sending packets the pipeline can then be specified as a parameter, so the packet is passed through it, it's then automatically processed the right way on the receiving end. It is therefore important both the client and server set up their pipelines in exactly the same way. One exception is with pipeline stages which do not manipulate the packet payload or header, these do not need to be symmetric. For example, the simulator stage here is only keeping packets on hold for a certain time and then releases them unmodified or drops them altogether, it can therefore be set up to only run on the client. +You can pass the pipeline to `BeginSend` to send a message on this new pipeline: ```csharp -using Unity.Collections; -using Unity.Networking.Transport; -using Unity.Networking.Transport.Utilities; +driver.BeginSend(myPipeline, connection, out var writer); +``` + +You can use the last argument of `PopEvent`/`PopEventForConnection` to know which pipeline you received a message on: -public class Client +```csharp +var eventType = driver.PopEvent(out _, out _, out var receivePipeline); +if (eventType == NetworkEvent.Type.Data) { - NetworkDriver m_DriverHandle; - NetworkPipeline m_Pipeline; - - const int k_PacketSize = 256; - - // Connection establishment omitted - public NetworkConnection m_ConnectionToServer; - - public void Configure() - { - // Driver can be used as normal - m_DriverHandle = NetworkDriver.Create(new SimulatorUtility.Parameters {MaxPacketSize = k_PacketSize, MaxPacketCount = 30, PacketDelayMs = 100}); - // Driver now knows about this pipeline and can explicitly be asked to send packets through it (by default it sends directly) - m_Pipeline = m_DriverHandle.CreatePipeline(typeof(UnreliableSequencedPipelineStage), typeof(SimulatorPipelineStage)); - } - - public void SendMessage(NativeArray someData) - { - // Send using the pipeline created in Configure() - m_DriverHandle.BeginSend(m_Pipeline, m_ConnectionToServer, out var writer); - writer.WriteBytes(someData); - m_DriverHandle.EndSend(writer); - } + // Data message was received on the receivePipeline pipeline. } ``` -## Simulator Pipeline +:::note +You should always configure pipelines the same way on the server and client. The CreatePipeline calls (and their order) must match on both ends of a connection. Unity Transport doesn't protect you against mismatched pipelines between servers and clients. +::: -The simulator pipeline stage could be added on either the client or server to simulate bad network conditions. It is best to add it as the last stage in the pipeline, then it will either drop the packet or add a delay right before it would go on the wire. +## The fragmentation pipeline stage -### Use the simulator +By default, Unity Transport can only send messages that fit into the [MTU](https://en.wikipedia.org/wiki/Maximum_transmission_unit) (roughly 1400 bytes). You must split larger messages into smaller pieces. This process is called message fragmentation. -No further configuration is needed after configuring the pipeline. It can be set up when the driver is created, as follows: +Pipelines configured with a `FragmentationPipelineStage` automatically fragment messages for you. You can configure the maximum pre-fragmentation payload size when creating a `NetworkDriver`: ```csharp -m_DriverHandle = NetworkDriver.Create(new SimulatorUtility.Parameters {MaxPacketSize = NetworkParameterConstants.MTU, MaxPacketCount = 30, PacketDelayMs = 25, PacketDropPercentage = 10}); -m_Pipeline = m_DriverHandle.CreatePipeline(typeof(SimulatorPipelineStage)); +var settings = new NetworkSettings(); +settings.WithFragmentationStageParameters(payloadCapacity: 10000); + +var driver = NetworkDriver.Create(settings); +var fragmentedPipeline = driver.CreatePipeline(typeof(FragmentationPipelineStage)); ``` -This would create a simulator pipeline stage which can delay up to 30 packets of a size up to the MTU size constant. Each packets gets a 25 ms delay applied and 10% of packets received will be dropped. SimulatorPipelineStage processes packets on the Receive stage of the pipeline. +The maximum value is about ~20 megabytes. However, the fragmentation pipeline stage is only optimized for payloads of a few kilobytes (the default value is 4096 bytes). We don't recommend sending messages much larger than a few kilobytes unless it’s a one-time transmission at initialization. -### Debug information +Furthermore, if you use this pipeline stage with the `ReliableSequencedPipelineStage`, the maximum value is even lower at around 88 kilobytes. -To get information about internal state in the simulator, check the `SimulatorUtility.Context` structure, stored in the pipeline stage shared buffer. This tracks how many packets have been set, `PacketCount`, and how many of those were dropped, `PacketDropCount`. `ReadyPackets` and `WaitingPackets` shows what packets are now ready to be sent (delay time expired) and how many are stored by the simulator. `StatsTime` and `NextPacketTime` show the last time the simulator ran and when the next packet is due to be released. +:::note +Most pipeline stages don't support packets larger than the MTU (maximum transmission unit). As a result, in most cases, you should use `FragmentationPipelineStage` as the first stage in pipelines with multiple stages. +::: -```csharp -public unsafe void DumpSimulatorStatistics() -{ - var simulatorStageId = NetworkPipelineStageCollection.GetStageId(typeof(SimulatorPipelineStage)); - driver.GetPipelineBuffers(pipeline, simulatorStageId, connection[0], out var receiveBuffer, out var sendBuffer, out var sharedBuffer); - var simCtx = (SimulatorUtility.Context*)sharedBuffer.GetUnsafeReadOnlyPtr(); - UnityEngine.Debug.Log("Simulator stats\n" + - "PacketCount: " + simCtx->PacketCount + "\n" + - "PacketDropCount: " + simCtx->PacketDropCount + "\n" + - "ReadyPackets: " + simCtx->ReadyPackets + "\n" + - "WaitingPackets: " + simCtx->WaitingPackets + "\n" + - "NextPacketTime: " + simCtx->NextPacketTime + "\n" + - "StatsTime: " + simCtx->StatsTime); -} -``` +## The reliable pipeline stage + +Pipelines configured with a `ReliableSequencedPipelineStage` guarantee the delivery and order of their packets, similar to how a [TCP](https://en.wikipedia.org/wiki/Transmission_Control_Protocol) connection would. The `ReliableSequencedPipelineStage` tags packets with a sequence number and peers acknowledge the reception of these numbers. If a peer doesn't acknowledge a packet, UTP resends it until it’s acknowledged. If a packet arrives out of order, UTP buffers it until it receives all earlier packets. + +While reliability is useful, you should use it sparingly in a multiplayer game context. Reliable data streams can suffer from [head-of-line blocking](https://en.wikipedia.org/wiki/Head-of-line_blocking), which can cause increased latency and delay packet processing. We recommend using the `ReliableSequencedPipelineStage` pipeline stage only for important traffic you can't afford to lose (like RPCs and character actions). -## Reliability pipeline +### Maximum in-flight packets -The reliability pipeline makes sure all packets are delivered and in order. It adds header information to all packets sent and tracks their state internally to make this happen. Whenever a packet is sent, it is given a sequence ID and then stored in the send processing buffer along with timing information (send time). The packet is then sent with that sequence ID added to the packet header. All packet headers also include information about what remote sequence IDs have been seen, so the receiver of the packet can know the delivery state of the packets it sent. This way there is always information about delivery state flowing between the two endpoints who make up a connection. If a certain time interval expires without an acknowledgement for a particular sequence ID the packet is resent and the timers reset. +The reliable stage limits the number of packets in-flight at any given time. The default limit is 32, but you can increase the limit up to 64. The in-flight packet limit is per connection and per pipeline; it's not shared across connections. -Reliability packet header looks like this: +Due to the in-flight package limitation, we recommend batching reliable messages together as much as possible. For example, instead of sending two reliable messages of 20 bytes each, concatenate them and send a single message of 40 bytes. + +If you try to send a new reliable message while the maximum number of packets is already in-flight, `EndSend` returns the error code `NetworkSendQueueFull` (value `-5`). If you encounter this situation, we recommend storing the message in a queue until it's possible to send it again: ```csharp -public struct PacketHeader +driver.BeginSend(myReliablePipeline, connection, out var writer); +// Write your message to the writer. +if (driver.EndSend(writer) == (int)Error.StatusCode.NetworkSendQueueFull)) { - public ushort Type; - public ushort ProcessingTime; - public ushort SequenceId; - public ushort AckedSequenceId; - public uint AckMask; + // Copy your message to a queue, and try resending later. } ``` -Where the type could be either a payload or ack packet, which is an empty packet with only this header. Processing time is time which passed between receiving a particular sequence ID and sending an acknowledgement for it, this is used for Round Trip Time (RTT) calculations. Then there is the sequence ID of this packet (not used in ack packets) and what remote sequence ID is being acknowledged. The AckMask is the history of acknowledgements we know about (up to the window size) so you can acknowledge multiple packets in a single header. - -The ack packet type is used when a certain amount of time has passed and nothing has been sent to the remote endpoint. We then check if we need to send a pending acknowledgement to him, or else the last packet will be assumed lost and a resend will take place. If a message is sent on every update call these kinds of packets never need to be sent. +### Increasing the limit -### Use the reliability pipeline - -The following creates a pipeline with just the reliability pipeline stage present, and initialize it to a window size of 32 (so it can keep track of 32 reliable packets at a one time). The maximum value for this is 32. Note this is a 32 packet limit per connection, and you may create multiple pipelines. +You can change the in-flight package limit when creating a `NetworkDriver`: ```csharp -m_ServerDriver = NetworkDriver.Create(new ReliableUtility.Parameters { WindowSize = 32 }); -m_Pipeline = m_ServerDriver.CreatePipeline(typeof(ReliableSequencedPipelineStage)); +var settings = new NetworkSettings(); +settings.WithReliableStageParameters(windowSize: 64); + +var driver = NetworkDriver.Create(settings); +var reliablePipeline = driver.CreatePipeline(typeof(ReliableSequencedPipelineStage)); ``` -Because only 32 packets can be tracked at a time there can't be more than 32 packets in flight at any one time, trying to send a 33rd packet will result in an error. It's possible to check for such errors by checking the error code in the reliability internal state: +The default limit is 32, and the maximum is 64. Any value higher than 32 results in slightly large (4 bytes) headers, leaving much less space for actual data in the packets. + +## The simulator pipeline stage + +The `SimulatorPipelineStage` is meant to be used when testing your application. It allows you to simulate network conditions like packet loss, delay, and jitter. You can use this stage to know how a game might behave in a real-world environment. + +You can configure the network conditions when creating a `NetworkDriver`: ```csharp -// Get a reference to the internal state or shared context of the reliability -var reliableStageId = NetworkPipelineStageCollection.GetStageId(typeof(ReliableSequencedPipelineStage)); -m_ServerDriver.GetPipelineBuffers(serverPipe, reliableStageId, serverToClient, out var tmpReceiveBuffer, out var tmpSendBuffer, out var serverReliableBuffer); -var serverReliableCtx = (ReliableUtility.SharedContext*) serverReliableBuffer.GetUnsafePtr(); - -m_ServerDriver.BeginSend(serverPipe, serverToClient, out var strm); -m_ServerDriver.EndSend(strm); -if (serverReliableCtx->errorCode != 0) -{ - // Failed to send with reliability, error code will be ReliableUtility.ErrorCodes.OutgoingQueueIsFull if no buffer space is left to store the packet -} +var settings = new NetworkSettings(); +settings.WithSimulatorStageParameters( + maxPacketCount: 100, + mode: ApplyMode.AllPackets, + packetDelayMs: 50); + +var driver = NetworkDriver.Create(settings); +var simulatorPipeline = driver.CreatePipeline(typeof(SimulatorPipelineStage)); ``` -It is possible to run into an `OutgoingQueueIsFull` error when packets are being sent too frequently for the latency and quality of the connection. High packet loss means packets need to stay for multiple Round Trip Times (RTTs) in the queue and if the RTT is high then that time can end up being longer than the send rate + window size permit. For example, with 60 packets sent per second, a packet will go out every 16 ms. If the RTT is 250ms, about 16 packets will be in the queue at any one time. With a packet drop, the total time will go up to 500 ms and the packet will be in the last slot when it is finally freed. - -It is best suited to use the reliability pipeline for event type messages (door opened), Remote Procedure Calls (RPCs), or slow frequency messages like chat. +The following list has some important parameters of the `SimulatorPipelineStage`. -### Debug information +* `maxPacketCount` is the maximum number of simultaneously delayed packets. Past that, packets go through without any added delay. +* mode In which direction the simulator should apply the network conditions (send, receive, or both). +* `packetDelayMs` is the delay in milliseconds to apply to packets. Good values range between `20` (for a good broadband connection) and `200` (for a bad mobile connection). +* `packetJitterMs` is the deviation around the packet delay in milliseconds. This value is typically half the packet delay or slightly less. +* `packetDropPercentage` is the percentage of packets to drop. You should use values above `3`, even for bad mobile connections. -More internal state information can be gathered using `GetPipelineBuffers` as shown above. The soaker test gathers statistics as seen in the *SoakCommon.cs* file, in the `GatherReliabilityStats` function. There it checks the internally used RTT and how many packets have been sent, received, dropped, duplicated and resent. +:::note +SimulatorPipelineStage should normally be the last in the chain when creating a pipeline with multiple stages. Otherwise, packets might drop before other stages can process them (which isn't useful for a reliable pipeline, for example). +::: diff --git a/transport_versioned_docs/version-2.0.0/supported-platforms.md b/transport_versioned_docs/version-2.0.0/supported-platforms.md index 300bd0604..b3cf6106f 100644 --- a/transport_versioned_docs/version-2.0.0/supported-platforms.md +++ b/transport_versioned_docs/version-2.0.0/supported-platforms.md @@ -2,4 +2,5 @@ id: supported-platforms title: Supported Platforms --- -COMING SOON. \ No newline at end of file + +Unity Transport seamlessly supports all platforms the Unity Engine supports thanks to a connection-based abstraction layer (built-in network driver) provided over UDP and WebSockets. \ No newline at end of file diff --git a/transport_versioned_docs/version-2.0.0/using-sample.md b/transport_versioned_docs/version-2.0.0/using-sample.md index 05331bb4d..0c4467eda 100644 --- a/transport_versioned_docs/version-2.0.0/using-sample.md +++ b/transport_versioned_docs/version-2.0.0/using-sample.md @@ -1,6 +1,29 @@ --- id: using-sample -title: Using Sample +title: Sample projects --- -COMING SOON. +The Unity Transport package comes with a `Samples` folder containing simple assembly definitions and associated scenes that illustrate the basic functionality of the Unity Transport package library. These sample projects include: + +- [Ping](#ping) +- [Pipeline](#pipeline) +- [RelayPing](#relayping) + +## Ping + +The Ping sample project implements a simple ping-pong service and supplies client and server behaviors for two scenarios. + +- The first scenario uses `PingMainThreadServerBehaviour` and `PingMainThreadClientBehaviour` to implement peers to process messages only in the main thread. +- The second scenario shows how to use the Burst compiler and the job system with `PingServerBehaviour` and `PingClientBehaviour`. + +## Pipeline + +The Pipeline sample shows how to define [pipeline](pipelines-usage.md) stages as described in [Pipelines](pipelines-usage.md). The code demonstrates a pipeline definition for unreliable sequenced delivery based on a default `UDPNetworkInterface`. + +:::note +Consider using pipeline stages carefully. Some pipeline configurations can't add value to the quality of service and might be harmful, depending on the underlying `NetworkInterface` you use. For example, it makes sense to have a pipeline stage for unreliable sequenced delivery over a `UDPNetworkInterface`. The same [pipeline](pipelines-usage.md) stage over a `WebSocketNetworkInterface` incurs unnecessary overhead because the underlying network interface already provides unreliable sequenced delivery. +::: + +## RelayPing + +The RelayPing sample project extends the [Ping](#ping) sample project to use the [Unity Relay Service](https://unity.com/products/relay) to connect players. It shows how to manipulate and pass custom [Network Settings](network-settings.md) to a `NetworkDriver`. diff --git a/transport_versioned_docs/version-2.0.0/workflow-client-server-jobs.md b/transport_versioned_docs/version-2.0.0/workflow-client-server-jobs.md index 93c44e371..2c787137a 100644 --- a/transport_versioned_docs/version-2.0.0/workflow-client-server-jobs.md +++ b/transport_versioned_docs/version-2.0.0/workflow-client-server-jobs.md @@ -3,20 +3,15 @@ id: jobs title: Efficient client and server --- -In the workflow [Creating a minimal client and server](workflow-client-server.md), the client should look like this [code example](samples/clientbehaviour.cs.md). +This section guides you through creating a jobified client and server. It extends and modifies the [minimal client and server example](workflow-client-server-udp.md) to use jobs to leverage parallel code execution. -## Prerequisites - -1. Before reading and using this workflow, you should understand how the [C# Job System](https://docs.unity3d.com/Manual/JobSystem.html) works. Review that information, then continue. -2. Install the jobs package to your `manifest.json` file, inside the */Packages* folder. To do this: - 1. Open your **Unity Editor** and create a new Project. - 2. Go to **Window** > **Package Manager** from the main menu to open the **Unity Package Manager**. - 3. Click on the ![Add](/img/add.png) (plus symbol) in the status bar and select **Add package from git URL...** from the dropdown. - 4. Enter `com.unity.jobs` for the latest version of the jobs package. +:::warning +Before reading this tutorial, you should understand how the [C# Job System](https://docs.unity3d.com/Manual/JobSystem.html) works. +::: -## Create a Jobified Client +## Create a jobified client -Create a client job to handle your inputs from the network. As you only handle one client at a time, use [IJob](https://docs.unity3d.com/ScriptReference/Unity.Jobs.IJob.html) as your job type. You need to pass the driver and the connection to the job to handle updates within the `Execute` method of the job. +This section shows how to create a jobified client to handle inputs from the network. Because you only handle one client at a time, use [`IJob`](https://docs.unity3d.com/ScriptReference/Unity.Jobs.IJob.html) as your job type. You need to pass the driver and the connection to the job to handle updates within the job’s Execute method. ```csharp struct ClientUpdateJob: IJob @@ -30,18 +25,18 @@ struct ClientUpdateJob: IJob ``` :::note -The data inside the `ClientUpdateJob` is **copied**. If you want to use the data after the job is completed, you need to have your data in a shared container, such as a [NativeContainer](https://docs.unity3d.com/Manual/JobSystemNativeContainer.html). +The data inside the `ClientUpdateJob` is copied. If you want to use the data after completing the job, you must have your data in a shared container, such as a [`NativeContainer`](https://docs.unity3d.com/Manual/JobSystemNativeContainer.html). ::: -You may want to update the `NetworkConnection` and the `done` variables inside your job as you may receive a disconnect message. Verify you can share the data between the job and the caller. In this case, use a [NativeArray](https://docs.unity3d.com/ScriptReference/Unity.Collections.NativeArray_1.html). +You should update the `NetworkConnection` and the done variables inside the job because you might receive a disconnect message. Verify you can share the data between the job and the caller. In this case, use a [`NativeArray`](https://docs.unity3d.com/ScriptReference/Unity.Collections.NativeArray_1.html). :::note -You can only use [blittable types](https://docs.microsoft.com/en-us/dotnet/framework/interop/blittable-and-non-blittable-types) in a `NativeContainer`. In this case, instead of a `bool` you need to use a `byte`, as its a blittable type. +You can only use [blittable types](https://docs.microsoft.com/en-us/dotnet/framework/interop/blittable-and-non-blittable-types) in a NativeContainer. In this case, because `bool` isn't blittable, you must use a `byte` instead of `bool`. ::: -In your `Execute` method, move over your code from the `Update` method that you have already in place from [_ClientBehaviour.cs_](samples/clientbehaviour.cs.md) and you are done. +Move the code from the Update method (from [`ClientBehaviour.cs`](samples/clientbehaviour.cs.md)) to the Execute method. -You need to change any call to `m_Connection` to `connection[0]` to refer to the first element inside your `NativeArray`. The same goes for your `done` variable, you need to call `done[0]` when you refer to the `done` variable. See the following: +You need to change any call to `m_Connection` to `connection[0]` to refer to the first element inside the `NativeArray`. The same goes for your done variable; you must call `done[0]` when you refer to the done variable. See the following code snippet: ```csharp public void Execute() @@ -87,12 +82,10 @@ public void Execute() ### Update the client MonoBehaviour -When you have a job, you need to verify that you can execute the job. +When you have a job, you must verify that you can execute the job. The following code sample shows the changes to `ClientBehaviour`: -Complete changes to `ClientBehaviour`: - -* Change `m_Done` and `m_Connection` to type `NativeArray` -* Add a [JobHandle](https://docs.unity3d.com/Manual/JobSystemJobDependencies.html) to track ongoing jobs +* Change `m_Done` and `m_Connection` to type `NativeArray`. +* Add a [JobHandle](https://docs.unity3d.com/Manual/JobSystemJobDependencies.html) to track ongoing jobs. ```csharp public class JobifiedClientBehaviour : MonoBehaviour @@ -110,6 +103,8 @@ public class JobifiedClientBehaviour : MonoBehaviour #### Start method +The Start method looks similar to the one in the simple client example; the most significant update is that the jobified version verifies that you create a `NativeArray`. + ```csharp void Start () { m_Driver = NetworkDriver.Create(); @@ -123,9 +118,9 @@ void Start () { } ``` -The `Start` method looks pretty similar to before, the major update here is to verify you create your `NativeArray`. +#### `OnDestroy` method -#### OnDestroy method +In the `OnDestroy` method, dispose of all `NativeArray` objects. Then add a `ClientJobHandle.Complete()` call to ensure the jobs complete before you clean up and destroy the data they might be using. ```csharp public void OnDestroy() @@ -138,11 +133,9 @@ public void OnDestroy() } ``` -For the `OnDestroy` method, dispose all `NativeArray` objects. Add a `ClientJobHandle.Complete()` call. This ensures your jobs complete before cleaning up and destroying the data they might be using. +#### Client `Update` loop -#### Client Update loop - -Finally update your core game loop: +Update the core game loop. Ensure the last frame completes before running the new frame. Instead of calling `m_Driver.ScheduleUpdate().Complete()`, use the `JobHandle`, then call `ClientJobHandle.Complete()`. ```csharp void Update() @@ -152,9 +145,7 @@ void Update() } ``` -Before you start running your new frame, check that the last frame has completed. Instead of calling `m_Driver.ScheduleUpdate().Complete()`, use the `JobHandle` and call `ClientJobHandle.Complete()`. - -To chain your job, start by creating a job struct: +Next, create a job struct to chain the job: ```csharp var job = new ClientUpdateJob @@ -165,25 +156,25 @@ var job = new ClientUpdateJob }; ``` - To schedule the job, pass the `JobHandle` dependency that was returned from the `m_Driver.ScheduleUpdate` call in the `Schedule` function of your `IJob`. Start by invoking the `m_Driver.ScheduleUpdate` without a call to `Complete`, and pass the returning `JobHandle` to your saved `ClientJobHandle`. +To schedule the job, pass the `JobHandle` dependency returned from the `m_Driver.ScheduleUpdate` call in the Schedule function of your `IJob`. Start by invoking the `m_Driver.ScheduleUpdate` without a call to `Complete`, and pass the returning `JobHandle` to the saved `ClientJobHandle`. -Pass the returned `ClientJobHandle` to your own job, returning a newly updated `ClientJobHandle`. +Pass the returned `ClientJobHandle` to the job you created, returning a newly updated `ClientJobHandle`. ```csharp ClientJobHandle = m_Driver.ScheduleUpdate(); ClientJobHandle = job.Schedule(ClientJobHandle); ``` -You now have a *JobifiedClientBehaviour* that looks like [this](samples/jobifiedclientbehaviour.cs.md). +You now have a `JobifiedClientBehaviour` that looks like [this](samples/jobifiedclientbehaviour.cs.md). -## Create a Jobified Server +## Create a jobified server -The server side is pretty similar to start with. You create the jobs you need and then you update the usage code. +The jobified server is similar to the simple server in the earlier example. The only necessary modification is to create the jobs you need, then update the usage code. -Consider this: you know that the `NetworkDriver` has a `ScheduleUpdate` method that returns a `JobHandle`. The job as you saw above populates the internal buffers of the `NetworkDriver` and lets us call `PopEvent`/`PopEventForConnection` method. What if you create a job that will fan out and run the processing code for all connected clients in parallel? If you look at the documentation for the C# Job System, you can see that there is a [IJobParallelFor](https://docs.unity3d.com/Manual/JobSystemParallelForJobs.html) job type that can handle this scenario +The `NetworkDriver` has a `ScheduleUpdate` method that returns a `JobHandle` that populates the internal buffers of the `NetworkDriver` and provides the `PopEvent`/`PopEventForConnection` method. You can use the [`IJobParallelFor`](https://docs.unity3d.com/Manual/JobSystemParallelForJobs.html) job type to create a job to run the processing code for all connected clients in parallel. :::note -Because you do not know how many requests you may receive or how many connections you may need to process at any one time, there is another `IJobPrarallelFor` job type that you can use namely: `IJobParallelForDefer`. +There’s another `IJobPrarallelFor` job type you can use: `IJobParallelForDefer`. This job type suits the jobified server because you don’t know the exact number of requests the server might receive or the number of connections the server might need to process. ::: ```csharp @@ -196,11 +187,11 @@ struct ServerUpdateJob : IJobParallelForDefer } ``` -However, you cannot run all of your code in parallel. +However, you can only run some of your code in parallel. -In the client example above, you begin by cleaning up closed connections and accepting new ones, which cannot be done in parallel. You need to create a connection job. +The jobified client begins by cleaning up closed connections and accepting new ones, which you can't do in parallel. Instead, you must create a connection job. -Start by creating a `ServerUpdateConnectionJob` job. Pass both the `driver` and `connections` to the connection job. Then you want your job to "Clean up connections" and "Accept new connections": +Create a `ServerUpdateConnectionJob` job, then pass both the driver and connections to the connection job. This job should clean up connections and accept new connections: ```csharp struct ServerUpdateConnectionsJob : IJob @@ -230,7 +221,7 @@ struct ServerUpdateConnectionsJob : IJob } ``` -The code above should be almost identical to your old non-jobified code. +The code above is nearly the same as the non-jobified server code from the simple server example. With the `ServerUpdateConnectionsJob` done, implement the `ServerUpdateJob` using `IJobParallelFor`: @@ -247,14 +238,20 @@ struct ServerUpdateJob : IJobParallelForDefer } ``` -There are two major differences compared with the other `job`: +The `ServerUpdateJob` has two significant differences compared with the `ServerUpdateConnectionJob` job: -* You are using the `NetworkDriver.Concurrent` type, this allows you to call the `NetworkDriver` from multiple threads, precisely what you need for the `IParallelForJobDefer`. Secondly, -* You are now passing a `NativeArray` of type `NetworkConnection` instead of a `NativeList`. The `IParallelForJobDefer` does not accept any other `Unity.Collections` type than a `NativeArray` (more on this later). +* The `ServerUpdateJob` uses the `NetworkDriver.Concurrent` type, which allows you to call the `NetworkDriver` from multiple threads. This is precisely what you need for the `IParallelForJobDefer`. +* The `ServerUpdateJob` passes a `NativeArray` of type `NetworkConnection` instead of a `NativeList`. The `IParallelForJobDefer` doesn't accept any other `Unity.Collections` type than a `NativeArray`. ### Execute method -The only difference between the old code and the jobified example is that you remove the top level `for` loop that you had in your code: `for (int i = 0; i < m_Connections.Length; i++)`. This is removed because the `Execute` function on this job will be called for each connection, and the `index` to that a available connection will be passed in. +The only difference in the Execute method between the simple server code and the jobified server code is that you remove the top-level for loop in the jobified server: + +```csharp +for (int i = 0; i < m_Connections.Length; i++) +``` + +The jobified server doesn’t need this top-level for loop because it calls the Execute function for each connection, and passes in the index to that available connection. ```csharp public void Execute(int index) @@ -286,26 +283,24 @@ public void Execute(int index) } ``` -You can see this `index` in use in the top level `while` loop: +The top-level `while` loop uses the index of the available connection: -``` +```csharp while ((cmd = driver.PopEventForConnection(connections[index], out stream)) != NetworkEvent.Type.Empty` ``` :::note -You are using the `index` that was passed into your `Execute` method to iterate over all the `connections`. +Use the index of the connection (passed into the `Execute` method) to iterate over all the connections. ::: You now have two jobs: -* The first job is to update your connection status: - * Add new connections. - * Remove old or stale connections. -* The second job is to parse `NetworkEvent` on each connected client. +* The first job, `ServerUpdateConnectionJob`, updates the connection status by adding new connections and removing old connections. +* The second job, `ServerUpdateJob`, parses the `NetworkEvent` for each connected client. -### Update the server MonoBehaviour +### Update the server `MonoBehaviour` -Access your [MonoBehaviour](https://docs.unity3d.com/ScriptReference/MonoBehaviour.html) and start updating the server. +Next, access the jobified server [`MonoBehaviour`](https://docs.unity3d.com/ScriptReference/MonoBehaviour.html) and start updating the server. ```csharp public class JobifiedServerBehaviour : MonoBehaviour @@ -322,11 +317,11 @@ public class JobifiedServerBehaviour : MonoBehaviour } ``` -The only change made in your variable declaration is adding a `JobHandle` to keep track of your ongoing jobs. +The only change between the simple server and the jobified server variable declaration is that the jobified server adds a JobHandle to keep track of ongoing jobs. -#### Start method +#### Server `Start` method -You do not need to change your `Start` method as it should look the same: +You don’t need to change the `Start` method from the simple server example: ```csharp void Start () @@ -343,9 +338,9 @@ void Start () } ``` -#### OnDestroy method +#### Server `OnDestroy` method -You need to remember to call `ServerJobHandle.Complete` in your `OnDestroy` method so you can properly clean up code: +Remember to call `ServerJobHandle.Complete` in the `OnDestroy` method to clean up the code: ```csharp public void OnDestroy() @@ -360,9 +355,9 @@ public void OnDestroy() } ``` -#### Server update loop +#### Server `Update` loop -In your `Update` method, call `Complete` on the `JobHandle`. This forces the jobs to complete before you start a new frame: +Call `Complete` on the `JobHandle` in the Update method to force the jobs to complete before you start a new frame: ```csharp void Update () @@ -387,10 +382,13 @@ void Update () } ``` -To chain the jobs, you want to follow this process: -`NetworkDriver.Update` -> `ServerUpdateConnectionsJob` -> `ServerUpdateJob`. +Use the following process to chain the jobs: + +1. `NetworkDriver.Update` +2. `ServerUpdateConnectionsJob` +3. `ServerUpdateJob` -Start by populating your `ServerUpdateConnectionsJob`: +Start by populating the `ServerUpdateConnectionsJob` with the `NetworkDriver` and the connections: ```csharp var connectionJob = new ServerUpdateConnectionsJob @@ -400,7 +398,7 @@ var connectionJob = new ServerUpdateConnectionsJob }; ``` -Then create your `ServerUpdateJob`. Remember to use the `ToConcurrent` call on your driver, to verify you are using a concurrent driver for the `IParallelForJobDefer`: +Next, create the `ServerUpdateJob`. Remember to call `ToConcurrent` on the `NetworkDriver` to ensure you’re using a concurrent driver for the `IParallelForJobDefer`: ```csharp var serverUpdateJob = new ServerUpdateJob @@ -410,23 +408,40 @@ var serverUpdateJob = new ServerUpdateJob }; ``` -The final step is to verify the `NativeArray` is populated to the correct size. This -can be done using a `DeferredJobArray`. When executed, it verifies the connections array is populated with the correct number of items that you have in your list. When runnning `ServerUpdateConnectionsJob` first, this may change the **size** of the list. +Verify the `NativeArray` is populated with the correct size. You can verify the `NativeArray` size using a `DeferredJobArray`. `DeferredJobArray` verifies that the connections array is populated with the same number of items in the connections list. -Create your job chain and call `Scheduele` as follows: +:::note +The size of the connections list might change when you first run `ServerUpdateConnectionsJob`. +::: -``` +Create the job chain and call `Scheduele` as follows: + +```csharp ServerJobHandle = m_Driver.ScheduleUpdate(); ServerJobHandle = connectionJob.Schedule(ServerJobHandle); ServerJobHandle = serverUpdateJob.Schedule(m_Connections, 1, ServerJobHandle); ``` -In the code above, you have: +In the code above, you: * Scheduled the `NetworkDriver` job. -* `JobHandle` returned as a dependency on the `ServerUpdateConnectionJob`. -* The final link in the chain is the `ServerUpdateJob` that needs to run after `ServerUpdateConnectionsJob`. In this line of code, there is a trick to invoke the `IJobParallelForDeferExtensions`. `m_Connections` `NativeList` is passed to the `Schedule` method, which updates the count of connections before starting the job. It will fan out and run all `ServerUpdateConnectionJobs` in parallel. +* `JobHandle` is returned as a dependency on the `ServerUpdateConnectionJob`. +* The final link in the chain is the `ServerUpdateJob`. It must run after `ServerUpdateConnectionsJob` to invoke the `IJobParallelForDeferExtensions`. `m_Connections` `NativeList` passed to the `Schedule` method, which updates the connections count before starting the job. It fans out and runs all `ServerUpdateConnectionJobs` in parallel. + +You now have a fully functional [jobified server](https://docs.unity3d.com/Packages/com.unity.transport@2.0/manual/samples/jobifiedserverbehaviour.cs.html). + +## Use Burst for extra performance -You should now have a fully functional [jobified server](samples/jobifiedserverbehaviour.cs.md). +All the jobs in the example code adhere to [the subset of C# supported by Burst](https://docs.unity3d.com/Packages/com.unity.burst@1.7/manual/docs/CSharpLanguageSupport_Types.html). Burst is a compiler that pre-compiles Unity jobs into highly-performant native code. Unity Transport takes advantage of Burst and uses mostly Burst-friendly data structures (like `NetworkDriver`). +You can make a job Burst-compiled by adding the [`BurstCompile`] attribute to its definition. For example: + +```csharp +[BurstCompile] +struct ClientUpdateJob : IJob +{ + ... +} +``` +Refer to the [Burst documentation](https://docs.unity3d.com/Packages/com.unity.burst@latest) for more details on how to use it. diff --git a/transport_versioned_docs/version-2.0.0/workflow-client-server-secure.md b/transport_versioned_docs/version-2.0.0/workflow-client-server-secure.md index 16f1c8745..6da435396 100644 --- a/transport_versioned_docs/version-2.0.0/workflow-client-server-secure.md +++ b/transport_versioned_docs/version-2.0.0/workflow-client-server-secure.md @@ -1,82 +1,92 @@ --- id: secure-connection -title: Create secure client and server +title: Create a secure client and server --- -The Unity Transport package can be configure to encrypt the connection between the server and the client while ensuring the server's/client's authenticity. +You can configure the Unity Transport package to encrypt the connection between the server and clients while ensuring the authenticity of both. -Secure connections are available with editor versions 2020.3 (starting at 2020.3.34), 2021.3, and 2022.1 and above. +:::note +Secure connections are available in Unity Editor versions 2020.3 (starting at 2020.3.34), 2021.3, and 2022.1 and above. +::: ## Server authentication -:::warning Warning -This example uses hardcoded certificates to make understanding the process easier, but in a real deployment the server certificates should be kept separate from client builds. One way to achieve this is to put them on a separate assembly, or load them from a file on the server. +This section demonstrates using encrypted communications with Unity Transport. + +:::warning +This example uses hardcoded certificates to make understanding the process easier. In a real deployment, you should keep the server certificates separate from client builds. You can separate server and client certificates by using separate assemblies or loading them from a file on the server. ::: -### High level authentication process +### High-level authentication process -In this configuration, the server will provide a certificate to the client (`certificate`) to prove its identity. The client will validate the certificate against its own root certificate (`caCertificate`) to validate its identity. +In this configuration, the server provides a certificate to the client (certificate) to prove its identity. The client compares the server’s certificate against its own root certificate (`caCertificate`) to validate the server’s identity. :::note Root certificates are also sometimes referred to as CA certificates. ::: -Once its identity confirmed, the server will then use the private key (`privateKey`) to establish the secure communication channel. +After the client confirms the server's identity, the server uses the private key (`privateKey`) to establish a secure communication channel. ### Requirements -To use the client/server secure workflow, you need a valid certificate and the root certificate that was used to sign it. You also need the private key that has been used to create the certificate. If you don't have these, they can be generated using OpenSSL. The procedure is detailed hereafter. +To use the secure communication workflow, you need the following: + +- A valid certificate +- The root certificate used to sign the certificate +- The private key used to create the certificate -### Generating the required keys and certificates with OpenSSL +If you don't have these, you can use OpenSSL to generate them. The following section explains how to use OpenSSL to generate certificates. -It is assumed that you have [OpenSSL](https://www.openssl.org/) installed on your machine. +### Generate keys and certificates + +This section explains how to use OpenSSL to generate a valid certificate (a requirement for using encrypted connections). Before continuing, ensure you have [OpenSSL](https://www.openssl.org/) installed on your machine. #### Generate the root certificate -First thing first is to generate a root private key. We will use it later on to generate the root certificate. +Generate a root private key. You need the root private key to generate the root certificate. -```shell +```csharp openssl genrsa -out clientPrivateKeyForRootCA.pem 2048 ``` -Now that you have a root private key, you can now generate the root certificate. +Use the root private key to generate the root certificate. -```shell +```csharp openssl req -x509 -new -nodes -key clientPrivateKeyForRootCA.pem -sha256 -days 1095 -out myGameClientCA.pem ``` -You will be prompted to answer several questions. Most of the answers are not that important within the present context. -It is however useful to use a common name that makes sense for you to identify this certificate amongst others. Ideally, you would want to use your domain name if you have one. +OpenSSL will prompt you to answer several questions. Most of the answers aren't that important within the present context. It's useful to use a common name that makes sense for you to identify this certificate, amongst others. Ideally, you want to use a domain name you own (if you have one). #### Generate the root-signed certificate to use with the server -Create now a private key for the server. +Create a private key for the server. -```shell +```csharp openssl genrsa -out myGameServerPrivateKey.pem 2048 ``` -From this private key, you can generate a certificate signing request. +Use the private key to generate a certificate signing request. -```shell +```csharp openssl req -new -key myGameServerPrivateKey.pem -out myGameServerCertificateSigningRequest.pem ``` -You'll be prompted with the same questions as for generating the root certificate. The answers are no more important, except for the common name: it is recommended to use the server's hostname. +OpenSSL will prompt you with the same questions you answered when you generated the root certificate. The answers are no more important. However, we recommend you use the server's hostname. -Finally, using the different files generated, we can create the certificate file the server will use to authenticate itself: +Using the different files generated, create the certificate file the server will use to authenticate itself: -```shell +```csharp openssl.exe x509 -req -in myGameServerCertificateSigningRequest.pem -CA myGameClientCA.pem -CAkey clientPrivateKeyForRootCA.pem -CAcreateserial -out myGameServerCertificate.pem -days 365 -sha256 ``` -You should have now generated a total of five files. Out of these, only three will be used later on: -* The content of the `myGameClientCA.pem` file will be used client-side as the `caCertificate` parameter. -* On the server end, the contents of `myGameServerCertificate.pem` will be used for the `certificate` parameter. -* On the server end, the contents of `myGameServerPrivateKey.pem` will be used for the `privateKey` parameter. +You should now have five generated files. Out of these, you only need the following three: + +- `myGameClientCA.pem` - You need the content of the client CA to use client-side as the `caCertificate` parameter. +- `myGameServerCertificate.pem` - You need the server certificate to use server-side for the certificate parameter. +- `myGameServerPrivateKey.pem` - You need the server private key to use server-side for the `privateKey` parameter. ### Boilerplate file holding the secure parameters -Create a `SecureParameters.cs` script file to hold your certificates and the private key. Place it in the same folder as the minimal server and minimal client scripts. Then declare the `SecureParameters` static class and the boilerplate code that will hold your secure information: +When you have all the requirements, create a `SecureParameters.cs` script file to hold your certificates and the private key. Place it in the same folder as the minimal server and minimal client scripts. Then declare the `SecureParameters` static class and the boilerplate code to hold the secure information: ```csharp public static class SecureParameters @@ -99,11 +109,13 @@ public static class SecureParameters *** Contents of myGameServerPrivateKey.pem *** -----END RSA PRIVATE KEY-----"; } -``` +``` + +### Create a secure server -### Creating the secure server +This section demonstrates creating a secure server. It uses the simple server code example as a starting point. -Starting from the minimal server sample code, create a `NetworkSettings` object in the `Start` method and configure it as follows: +Start by creating a `NetworkSettings` object in the `Start` method and configure it as follows: ```csharp void Start () @@ -123,11 +135,13 @@ When creating the `NetworkDriver`, pass in this `NetworkSettings` object: m_Driver = NetworkDriver.Create(settings); ``` -That's it for the server! +That’s all you need to do to enable secure communication server-side. + +### Create a secure client -### Creating a secure client +This section demonstrates creating a secure client. It uses the simple client code example as a starting point. -The secure client is very similar to the secure server. The only difference is in how the `NetworkSettings` object is configured. +The secure client is similar to the secure server. The only difference is in how you configure the NetworkSettings object. ```csharp void Start () @@ -144,6 +158,6 @@ void Start () You should now have a secure connection between the server and its clients! -:::note -If you create clients for multiple platforms, it is important for all of these to still use the same root certificate if they communicate with the same server. +:::warning +If you create clients for multiple platforms, all clients must use the same root certificate if they communicate with the same server. ::: diff --git a/transport_versioned_docs/version-2.0.0/workflow-client-server-udp.md b/transport_versioned_docs/version-2.0.0/workflow-client-server-udp.md index 3b5908914..7a619a7b3 100644 --- a/transport_versioned_docs/version-2.0.0/workflow-client-server-udp.md +++ b/transport_versioned_docs/version-2.0.0/workflow-client-server-udp.md @@ -1,33 +1,36 @@ --- id: minimal-workflow-udp -title: Client and Server over UDP +title: Create a simple client and server --- -:::note -Need an update before releasing UTP 2.0.0 -::: +This guide walks you through using the Unity Transport package to create a simple client and server that use a remote function over a UDP connection to add two numbers with the following flow: -This Transport workflow covers all aspects of the `Unity.Networking.Transport` package and helps you create a sample project that highlights how to use the `com.unity.transport` API to: +1. The client connects to the server. +2. The client sends a number to the server. +3. The server receives the number and adds it to another number. +4. The server sends the sum of the two numbers to the client. +5. The client receives the sum. +6. The client disconnects from the server and quits. -* Configure -* Connect -* Send data -* Receive data -* Close a connection -* Disconnect -* Timeout a connection +It demonstrates using the Unity Transport API to: -The goal is to make a remote `add` function. The flow will be: a client connects to the server, and sends a number, this number is then received by the server that adds another number to it and sends it back to the client. The client, upon receiving the number, disconnects and quits. +- Configure +- Connect +- Send data +- Receive data +- Close a connection +- Disconnect +- Timeout a connection -Using the `NetworkDriver` to write client and server code is similar between clients and servers; there are a few subtle differences demonstrated in this guide. +The client-server workflow in this guide demonstrates the subtle differences between using the `NetworkDriver` for clients and servers. -## Creating a Server +## Create a server -A server is an endpoint that listens for incoming connection requests and sends and receives messages. +A server is an endpoint that listens for incoming connection requests and sends and receives messages. This section demonstrates creating a simple server with UTP 2.0. -Start by creating a C# script in the Unity Editor. +Start by creating a C# script in the Unity Editor. Name the script ServerBehaviour.cs. -Filename: [_Assets\Scripts\ServerBehaviour.cs_](samples/serverbehaviour.cs.md) +**Filename**: [`ServerBehaviour.cs`](samples/serverbehaviour.cs.md) ```csharp using System.Collections; @@ -48,17 +51,15 @@ public class ServerBehaviour : MonoBehaviour { } ``` -### Boilerplate code - -As the `com.unity.transport` package is a low level API, there is a bit of boiler plate code you might want to setup. This is an architecture design Unity chose to make sure that you always have full control. +The `com.unity.transport` package is a low-level API, and, as a result, there is a bit of boilerplate code you should set up. The necessity of the boilerplate code is due to an architecture design to ensure you always have full control. :::note -As development on the `com.unity.transport` package evolves, more abstractions may be created to reduce your workload on a day-to-day basis. +As development on the com.unity.transport package evolves, Unity might create more abstractions to reduce your workload on a day-to-day basis. ::: -The next step is to clean up the dependencies and add our boilerplate code: +In the `ServerBehaviour.cs` script, clean up the dependencies and add the boilerplate code: -**Filename**: [_Assets\Scripts\ServerBehaviour.cs_](samples/serverbehaviour.cs.md) +**Filename**: [`ServerBehaviour.cs`](samples/serverbehaviour.cs.md) ```csharp using UnityEngine; @@ -70,13 +71,9 @@ using Unity.Networking.Transport; ... ``` -#### Code walkthrough - -### ServerBehaviour.cs +The following code demonstrates the necessary boilerplate code and creates empty bodies for the `Start`, `OnDestroy`, and `Update` methods. It also declares a `NetworkDriver` and creates a `NativeList` to hold all connections between the client and server. -Adding the members we need the following code: - -**Filename**: [_Assets\Scripts\ServerBehaviour.cs_](samples/serverbehaviour.cs.md) +**Filename**: [`ServerBehaviour.cs`](samples/serverbehaviour.cs.md) ```csharp using ... @@ -95,20 +92,17 @@ public class ServerBehaviour : MonoBehaviour { void Update () { } -``` - -#### Code walkthrough - -``` public NetworkDriver m_Driver; private NativeList m_Connections; ``` -You need to declare a `NetworkDriver`. You also need to create a NativeList to hold our connections. +Next, expand the `Start`, `OnDestroy`, and `Update` methods. + +### `Start` method -### Start method +First, define the logic in the [`MonoBehaviour.Start` method](https://docs.unity3d.com/ScriptReference/MonoBehaviour.Start.html). -**Filename**: [_Assets\Scripts\ServerBehaviour.cs_](samples/serverbehaviour.cs.md) +**Filename**: [`ServerBehaviour.cs`](samples/serverbehaviour.cs.md) ```csharp void Start () @@ -125,34 +119,34 @@ void Start () } ``` -#### Code walkthrough +The first line of code, `m_Driver = NetworkDriver.Create()`, creates a `NetworkDriver` instance without any parameters. -The first line of code, `m_Driver = NetworkDriver.Create();` , just makes sure you are creating your driver without any parameters. +Next, `m_Driver.Bind` binds the `NetworkDriver` instance to a specific network address and port, and if that doesn't fail, it calls the `Listen` method. ```csharp - if (m_Driver.Bind(endpoint) != 0) + if (m_Driver.Bind(endpoint) != 0) Debug.Log("Failed to bind to port 9000"); else m_Driver.Listen(); ``` -Then we try to bind our driver to a specific network address and port, and if that does not fail, we call the `Listen` method. - :::important -the call to the `Listen` method sets the `NetworkDriver` to the `Listen` state. This means that the `NetworkDriver` will now actively listen for incoming connections. +The call to the `Listen` method sets the `NetworkDriver` to the `Listen` state, which means the `NetworkDriver` actively listens for incoming connections. ::: -` m_Connections = new NativeList(16, Allocator.Persistent);` +`m_Connections` creates a `NativeList` to hold all the connections. -Finally we create a `NativeList` to hold all the connections. +```csharp +m_Connections = new NativeList(16, Allocator.Persistent); +``` -### OnDestroy method +### `OnDestroy` method -Both `NetworkDriver` and `NativeList` allocate unmanaged memory and need to be disposed. To make sure this happens we can simply call the `Dispose` method when we are done with both of them. +You must dispose of both `NetworkDriver` and `NativeList` because they allocate unmanaged memory. To ensure proper disposal, call the `Dispose` method when you no longer need them. -Add the following code to the `OnDestroy` method on your [MonoBehaviour](https://docs.unity3d.com/ScriptReference/MonoBehaviour.html): +Add the following code to the OnDestroy method on [`MonoBehaviour`](https://docs.unity3d.com/ScriptReference/MonoBehaviour.html): -**Filename**: [_Assets\Scripts\ServerBehaviour.cs_](samples/serverbehaviour.cs.md) +**Filename**: [`ServerBehaviour.cs`](samples/serverbehaviour.cs.md) ```csharp public void OnDestroy() @@ -165,11 +159,11 @@ public void OnDestroy() } ``` -The check for `m_Driver.IsCreated` ensures we don't dispose of the memory if it hasn't been allocated (e.g. if the component is disabled). +The check for `m_Driver.IsCreated` ensures you don't dispose of unallocated memory. For example, UTP doesn’t allocate memory for disabled components. -### Server Update loop +### Server `Update` loop -As the `com.unity.transport` package uses the [Unity C# Job System](https://docs.unity3d.com/Manual/JobSystem.html) internally, the `m_Driver` has a `ScheduleUpdate` method call. Inside our `Update` loop you need to make sure to call the `Complete` method on the [JobHandle](https://docs.unity3d.com/Manual/JobSystemJobDependencies.html) that is returned, in order to know when you are ready to process any updates. +The `com.unity.transport` package uses the [Unity C# Job System](https://docs.unity3d.com/Manual/JobSystem.html) internally. As a result, the `m_Driver` has a `ScheduleUpdate` method call. Call the `Complete` method on the returned [JobHandle](https://docs.unity3d.com/Manual/JobSystemJobDependencies.html) inside the `Update` loop to ensure you know when to process updates. ```csharp void Update () { @@ -178,16 +172,15 @@ void Update () { ``` :::note -In this example, we are forcing a synchronization on the main thread in order to update and handle our data later in the `MonoBehaviour::Update` call. The workflow [Creating a jobified client and server](workflow-client-server-jobs.md) shows you how to use the Transport package with the C# Job System. +This example forces synchronization on the main thread to update and handle the data later in the `MonoBehaviour::Update` call. The workflow [Create a jobified client and server](workflow-client-server-jobs.md) shows how to use the Transport package with the C# Job System. ::: +After updating `m_Driver`, the first thing you must do is handle the connections. Start by cleaning up any stale connections from the list before processing new ones. Cleaning up stale connections ensures you don't have any old connections lying around when you iterate through the list to check for new events. -The first thing we want to do, after you have updated your `m_Driver`, is to handle your connections. Start by cleaning up any old stale connections from the list before processing any new ones. This cleanup ensures that, when we iterate through the list to check what new events we have gotten, we dont have any old connections laying around. - -Inside the "Clean up connections" block below, we iterate through our connection list and just simply remove any stale connections. +The following code iterates through the connection list and removes any stale connections. ```csharp - // Clean up connections + // Clean up connections for (int i = 0; i < m_Connections.Length; i++) { if (!m_Connections[i].IsCreated) @@ -198,10 +191,10 @@ Inside the "Clean up connections" block below, we iterate through our connection } ``` -Under "Accept new connections" below, we add a connection while there are new connections to accept. +The following code adds a connection while there are new connections to accept. ```csharp - // Accept new connections + // Accept new connections NetworkConnection c; while ((c = m_Driver.Accept()) != default(NetworkConnection)) { @@ -210,50 +203,50 @@ Under "Accept new connections" below, we add a connection while there are new co } ``` -Now we have an up-to-date connection list. You can now start querying the driver for events that might have happened since the last update. +You now have an up-to-date connection list and can start querying the driver for events that might have happened since the last update. ```csharp - DataStreamReader stream; + DataStreamReader stream; for (int i = 0; i < m_Connections.Length; i++) { if (!m_Connections[i].IsCreated) continue; ``` -Begin by defining a `DataStreamReader`. This will be used in case any `Data` event was received. Then we just start looping through all our connections. +Begin by defining a `DataStreamReader`, which you’ll use to process received Data events. Next, loop through the connections. -For each connection we want to call `PopEventForConnection` while there are more events still needing to get processed. +Call `PopEventForConnection` for each connection while unprocessed events exist. ```csharp - NetworkEvent.Type cmd; + NetworkEvent.Type cmd; while ((cmd = m_Driver.PopEventForConnection(m_Connections[i], out stream)) != NetworkEvent.Type.Empty) { ``` :::note -There is also the `NetworkEvent.Type PopEvent(out NetworkConnection con, out DataStreamReader slice)` method call, that returns the first available event, the `NetworkConnection` that its for and possibly a `DataStreamReader`. +You can also use the `NetworkEvent.Type PopEvent(out NetworkConnection con, out DataStreamReader slice)` method call, which returns the first available event, the NetworkConnection that it's for, and possibly a `DataStreamReader`. ::: -We are now ready to process events. Lets start with the `Data` event. +Now it’s time to process events. Start with the `Data` event. ```csharp - if (cmd == NetworkEvent.Type.Data) + if (cmd == NetworkEvent.Type.Data) { ``` -Next, we try to read a `uint` from the stream and output what we have received: +Next, try to read a `uint` from the stream and output the received data: ```csharp - uint number = stream.ReadUInt(); + uint number = stream.ReadUInt(); Debug.Log("Got " + number + " from the Client adding + 2 to it."); ``` -When this is done we simply add two to the number we received and send it back. To send anything with the `NetworkDriver` we need a instance of a `DataStreamWriter`. A `DataStreamWriter` is a new type that comes with the `com.unity.transport` package. You get a `DataStreamWriter` when you start sending a message by calling `BeginSend`. +After outputting the received data, add the received numbers and send the sum back to the client. To send anything with the `NetworkDriver`, you need an instance of a `DataStreamWriter`. A `DataStreamWriter` is a new type that comes with the `com.unity.transport` package. You get a `DataStreamWriter` when you start sending a message by calling `BeginSend`. -After you have written your updated number to your stream, you call the `EndSend` method on the driver and off it goes: +After you’ve written the sum of the two numbers to the stream, call the `EndSend` method on the driver. Off it goes! ```csharp - number +=2; + number +=2; m_Driver.BeginSend(NetworkPipeline.Null, m_Connections[i], out var writer); writer.WriteUInt(number); @@ -262,13 +255,13 @@ After you have written your updated number to your stream, you call the `EndSend ``` :::note -We are passing `NetworkPipeline.Null` to the `BeginSend` function. This way we say to the driver to use the unreliable pipeline to send our data. It is also possible to not specify a pipeline. +This example passes `NetworkPipeline.Null` to the `BeginSend` function to tell the driver to use the unreliable pipeline to send the data. However, it’s also possible to choose not to specify a pipeline. ::: -Finally, you need to handle the disconnect case. This is pretty straight forward, if you receive a disconnect message you need to reset that connection to a `default(NetworkConnection)`. As you might remember, the next time the `Update` loop runs you will clean up after yourself. +You must handle the disconnect case. Handling the disconnect case is pretty straightforward: if you receive a disconnect message, reset that connection to a `default(NetworkConnection)`. The next time the `Update` loop runs, you should clean up the stale connections.. ```csharp - else if (cmd == NetworkEvent.Type.Disconnect) + else if (cmd == NetworkEvent.Type.Disconnect) { Debug.Log("Client disconnected from server"); m_Connections[i] = default(NetworkConnection); @@ -276,20 +269,26 @@ Finally, you need to handle the disconnect case. This is pretty straight forward } } } - ``` -That is the whole server. See [_ServerBehaviour.cs_](samples/serverbehaviour.cs.md) for the full source code. +You’ve now created the server, and you’re ready to create a client. Here’s a summary of the server logic: -## Creating a Client +1. Add any necessary boilerplate code. +2. Define the `Start` method logic, which includes declaring (and binding to) a `NetworkDriver` and `creating` a NativeList to hold the connections. +3. Define the `OnDestroy` method logic, which includes disposing of the `NetworkDriver` and the NativeList that holds the connections. +4. Define the `Update` loop logic, which includes listening for connections, adding connections, processing data, handling disconnections, and cleaning up stale connections. -The client code looks pretty similar to the server code at first glance, but there are a few subtle differences. This part of the workflow covers the differences between them, and not so much the similarities. +See [`ServerBehaviour.cs`](samples/serverbehaviour.cs.md) for the full source code. -### ClientBehaviour.cs +## Create a Client -You still define a `NetworkDriver` but instead of having a list of connections we now only have one. There is a `Done` flag to indicate when we are done, or in case you have issues with a connection, you can exit quickly. +This section demonstrates creating a simple client with UTP 2.0. The client code looks pretty similar to the server code at first glance, but there are subtle differences. This part of the workflow covers the differences between them and not so much the similarities. -**Filename**: [_Assets\Scripts\ClientBehaviour.cs_](samples/clientbehaviour.cs.md) +Start by creating a C# script in the Unity Editor. Name the script `ClientBehaviour.cs`. + +Similar to the server behavior, you still need to define a `NetworkDriver`. However, the client only has one instead of a list of connections. There’s also a Done flag to indicate when the client is finished with the connection. You can also use the Done flag to exit if you have connection issues. + +**Filename**: [`Assets\Scripts\ClientBehaviour.cs`](samples/clientbehaviour.cs.md) ```csharp using ... @@ -306,9 +305,9 @@ public class ClientBehaviour : MonoBehaviour { } ``` -### Creating and Connecting a Client +### Create and connect a client -Start by creating a driver for the client and an address for the server. +Start by creating a `NetworkDriver` for the client and an address for the server. ```csharp void Start () { @@ -321,9 +320,9 @@ void Start () { } ``` -Then call the `Connect` method on your driver. +Then call the `Connect` method on the `NetworkDriver` you created. -Cleaning up this time is a bit easier because you don’t need a `NativeList` to hold your connections, so it simply just becomes: +Cleaning up the client is easier than cleaning up the server because you don’t need a `NativeList` to hold the connections. You only need to dispose of the `NetworkDriver`. ```csharp public void OnDestroy() @@ -332,9 +331,9 @@ public void OnDestroy() } ``` -### Client Update loop +### Client `Update` loop -You start the same way as you did in the server by calling `m_Driver.ScheduleUpdate().Complete();` and make sure that the connection worked. +You start the client Update loop the same way as the server: by calling `m_Driver.ScheduleUpdate().Complete()`, then ensuring the connection succeeded. ```csharp void Update() @@ -349,24 +348,23 @@ void Update() } ``` -You should recognize the code below, but if you look closely you can see that the call to `m_Driver.PopEventForConnection` was switched out with a call to `m_Connection.PopEvent`. This is technically the same method, it just makes it a bit clearer that you are handling a single connection. +The following code is similar to the server Update loop code. However, if you look closely, you can see the call to `m_Driver.PopEventForConnection` is replaced with a call to `m_Connection.PopEvent`. This is technically the same method; it just makes it clearer that you are handling a single connection. ```csharp - DataStreamReader stream; + DataStreamReader stream; NetworkEvent.Type cmd; while ((cmd = m_Connection.PopEvent(m_Driver, out stream)) != NetworkEvent.Type.Empty) { ``` -Now you encounter a new event you have not seen yet: a `NetworkEvent.Type.Connect` event. -This event tells you that you have received a `ConnectionAccept` message and you are now connected to the remote peer. +Now you encounter a new event you haven't seen yet: a `NetworkEvent.Type.Connect` event. The `NetworkEvent.Type.Connect` event tells you that you received a `ConnectionAccept` message and are now connected to the remote peer. :::note -In this case, the server that is listening on port `9000` on `NetworkEndPoint.LoopbackIpv4` is more commonly known as `127.0.0.1`. +In this case, the server listens on port 9000 on `NetworkEndPoint.LoopbackIpv4` (more commonly known as 127.0.0.1). ::: ```csharp - if (cmd == NetworkEvent.Type.Connect) + if (cmd == NetworkEvent.Type.Connect) { Debug.Log("We are now connected to the server"); @@ -377,16 +375,16 @@ In this case, the server that is listening on port `9000` on `NetworkEndPoint.Lo } ``` -When you establish a connection between the client and the server, you send a number (that you want the server to increment by two). The use of the `BeginSend` / `EndSend` pattern together with the `DataStreamWriter`, where we set `value` to one, write it into the stream, and finally send it out on the network. +Upon establishing a connection between the client and the server, the client sends a number to the server (that the server increments by two). Using the `BeginSend` / `EndSend` pattern with the `DataStreamWriter`, set value to one, write it into the stream, and send it out on the network. -When the `NetworkEvent` type is `Data`, as below, you read the `value` back that you received from the server and then call the `Disconnect` method. +When the `NetworkEvent` type is Data, read the value you received back from the server, then call the `Disconnect` method. :::note -A good pattern is to always set your `NetworkConnection` to `default(NetworkConnection)` to avoid stale references. +The recommended best practice is to set `NetworkConnection` to `default(NetworkConnection)` to avoid stale references. ::: ```csharp - else if (cmd == NetworkEvent.Type.Data) + else if (cmd == NetworkEvent.Type.Data) { uint value = stream.ReadUInt(); Debug.Log("Got the value = " + value + " back from the server"); @@ -394,13 +392,11 @@ A good pattern is to always set your `NetworkConnection` to `default(NetworkConn m_Connection.Disconnect(m_Driver); m_Connection = default(NetworkConnection); } - ``` -Lastly, we need to handle potential server disconnects: +You must handle potential server disconnects: ```csharp - else if (cmd == NetworkEvent.Type.Disconnect) { Debug.Log("Client got disconnected from server"); @@ -410,18 +406,30 @@ Lastly, we need to handle potential server disconnects: } ``` -See [_ClientBehaviour.cs_](samples/clientbehaviour.cs.md) for the full source code. +You’ve now created the server and client, and you’re ready to put it all together. Here’s a summary of the client logic: + +1. Define the `Start` method logic, which includes declaring (and binding to) a `NetworkDriver`. +2. Define the `OnDestroy` method logic, which includes disposing of the `NetworkDriver`. +3. Define the `Update` loop logic, which includes connecting to the server, handling the Connect event, sending data, receiving data, and handling disconnections. + +See [`ClientBehaviour.cs`](samples/clientbehaviour.cs.md) for the full source code. + +## Test the server and client + +If you’ve been following along with the tutorial and using the sample code, you now have a functional server and client. This section shows how to put it together and test it in the Unity Editor. + +Add a new empty [GameObject](https://docs.unity3d.com/ScriptReference/GameObject.html) to your **Scene**. -## Putting it all together + -To take this for a test run, you can add a new empty [GameObject](https://docs.unity3d.com/ScriptReference/GameObject.html) to our **Scene**. +Add both the `ServerBehaviour` and the `ClientBehaviour` scripts to the GameObject. -![GameObject Added](/img/transport/game-object.PNG) + -Add add both of our behaviours to it: +Select **Play** to enter Play mode. You should see five log messages in the **Console** window: -![Inspector](/img/transport/inspector.PNG) + -Click **Play**. Five log messages should load in your **Console** window: +## WebSocket -![Console](/img/transport/console-view.PNG) + See [Client and server over WebSocket](workflow-client-server-ws.md). \ No newline at end of file diff --git a/transport_versioned_docs/version-2.0.0/workflow-client-server-ws.md b/transport_versioned_docs/version-2.0.0/workflow-client-server-ws.md index 3a31b029a..24363db07 100644 --- a/transport_versioned_docs/version-2.0.0/workflow-client-server-ws.md +++ b/transport_versioned_docs/version-2.0.0/workflow-client-server-ws.md @@ -1,427 +1,38 @@ --- id: minimal-workflow-ws -title: Client and Server over Websocket +title: Client and server over WebSocket --- -:::note -Need an update before releasing UTP 2.0.0 -::: - -This Transport workflow covers all aspects of the `Unity.Networking.Transport` package and helps you create a sample project that highlights how to use the `com.unity.transport` API to: - -* Configure -* Connect -* Send data -* Receive data -* Close a connection -* Disconnect -* Timeout a connection - -The goal is to make a remote `add` function. The flow will be: a client connects to the server, and sends a number, this number is then received by the server that adds another number to it and sends it back to the client. The client, upon receiving the number, disconnects and quits. - -Using the `NetworkDriver` to write client and server code is similar between clients and servers; there are a few subtle differences demonstrated in this guide. - -## Creating a Server - -A server is an endpoint that listens for incoming connection requests and sends and receives messages. - -Start by creating a C# script in the Unity Editor. - -Filename: [_Assets\Scripts\ServerBehaviour.cs_](samples/serverbehaviour.cs.md) - -```csharp -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -public class ServerBehaviour : MonoBehaviour { - - // Use this for initialization - void Start () { - - } - - // Update is called once per frame - void Update () { - - } -} -``` - -### Boilerplate code - -As the `com.unity.transport` package is a low level API, there is a bit of boiler plate code you might want to setup. This is an architecture design Unity chose to make sure that you always have full control. - -:::note -As development on the `com.unity.transport` package evolves, more abstractions may be created to reduce your workload on a day-to-day basis. -::: - -The next step is to clean up the dependencies and add our boilerplate code: - -**Filename**: [_Assets\Scripts\ServerBehaviour.cs_](samples/serverbehaviour.cs.md) - -```csharp -using UnityEngine; -using UnityEngine.Assertions; - -using Unity.Collections; -using Unity.Networking.Transport; - -... -``` - -#### Code walkthrough - -### ServerBehaviour.cs - -Adding the members we need the following code: - -**Filename**: [_Assets\Scripts\ServerBehaviour.cs_](samples/serverbehaviour.cs.md) - -```csharp -using ... - -public class ServerBehaviour : MonoBehaviour { - - public NetworkDriver m_Driver; - private NativeList m_Connections; - - void Start () { - } - - void OnDestroy() { - } - - void Update () { - } - -``` - -#### Code walkthrough - -``` -public NetworkDriver m_Driver; -private NativeList m_Connections; -``` - -You need to declare a `NetworkDriver`. You also need to create a NativeList to hold our connections. - -### Start method - -**Filename**: [_Assets\Scripts\ServerBehaviour.cs_](samples/serverbehaviour.cs.md) - -```csharp -void Start () -{ - m_Driver = NetworkDriver.Create(); - var endpoint = NetworkEndPoint.AnyIpv4; - endpoint.Port = 9000; - if (m_Driver.Bind(endpoint) != 0) - Debug.Log("Failed to bind to port 9000"); - else - m_Driver.Listen(); - - m_Connections = new NativeList(16, Allocator.Persistent); -} -``` - -#### Code walkthrough - -The first line of code, `m_Driver = NetworkDriver.Create();` , just makes sure you are creating your driver without any parameters. - -```csharp - if (m_Driver.Bind(endpoint) != 0) - Debug.Log("Failed to bind to port 9000"); - else - m_Driver.Listen(); -``` - -Then we try to bind our driver to a specific network address and port, and if that does not fail, we call the `Listen` method. - -:::important -the call to the `Listen` method sets the `NetworkDriver` to the `Listen` state. This means that the `NetworkDriver` will now actively listen for incoming connections. -::: - -` m_Connections = new NativeList(16, Allocator.Persistent);` - -Finally we create a `NativeList` to hold all the connections. - -### OnDestroy method - -Both `NetworkDriver` and `NativeList` allocate unmanaged memory and need to be disposed. To make sure this happens we can simply call the `Dispose` method when we are done with both of them. - -Add the following code to the `OnDestroy` method on your [MonoBehaviour](https://docs.unity3d.com/ScriptReference/MonoBehaviour.html): - -**Filename**: [_Assets\Scripts\ServerBehaviour.cs_](samples/serverbehaviour.cs.md) - -```csharp -public void OnDestroy() -{ - if (m_Driver.IsCreated) - { - m_Driver.Dispose(); - m_Connections.Dispose(); - } -} -``` - -The check for `m_Driver.IsCreated` ensures we don't dispose of the memory if it hasn't been allocated (e.g. if the component is disabled). - -### Server Update loop - -As the `com.unity.transport` package uses the [Unity C# Job System](https://docs.unity3d.com/Manual/JobSystem.html) internally, the `m_Driver` has a `ScheduleUpdate` method call. Inside our `Update` loop you need to make sure to call the `Complete` method on the [JobHandle](https://docs.unity3d.com/Manual/JobSystemJobDependencies.html) that is returned, in order to know when you are ready to process any updates. - -```csharp -void Update () { - - m_Driver.ScheduleUpdate().Complete(); -``` - -:::note -In this example, we are forcing a synchronization on the main thread in order to update and handle our data later in the `MonoBehaviour::Update` call. The workflow [Creating a jobified client and server](workflow-client-server-jobs.md) shows you how to use the Transport package with the C# Job System. -::: - - -The first thing we want to do, after you have updated your `m_Driver`, is to handle your connections. Start by cleaning up any old stale connections from the list before processing any new ones. This cleanup ensures that, when we iterate through the list to check what new events we have gotten, we dont have any old connections laying around. - -Inside the "Clean up connections" block below, we iterate through our connection list and just simply remove any stale connections. - -```csharp - // Clean up connections - for (int i = 0; i < m_Connections.Length; i++) - { - if (!m_Connections[i].IsCreated) - { - m_Connections.RemoveAtSwapBack(i); - --i; - } - } -``` - -Under "Accept new connections" below, we add a connection while there are new connections to accept. - -```csharp - // Accept new connections - NetworkConnection c; - while ((c = m_Driver.Accept()) != default(NetworkConnection)) - { - m_Connections.Add(c); - Debug.Log("Accepted a connection"); - } -``` - -Now we have an up-to-date connection list. You can now start querying the driver for events that might have happened since the last update. - -```csharp - DataStreamReader stream; - for (int i = 0; i < m_Connections.Length; i++) - { - if (!m_Connections[i].IsCreated) - continue; -``` - -Begin by defining a `DataStreamReader`. This will be used in case any `Data` event was received. Then we just start looping through all our connections. - -For each connection we want to call `PopEventForConnection` while there are more events still needing to get processed. - -```csharp - NetworkEvent.Type cmd; - while ((cmd = m_Driver.PopEventForConnection(m_Connections[i], out stream)) != NetworkEvent.Type.Empty) - { -``` - -:::note -There is also the `NetworkEvent.Type PopEvent(out NetworkConnection con, out DataStreamReader slice)` method call, that returns the first available event, the `NetworkConnection` that its for and possibly a `DataStreamReader`. -::: - -We are now ready to process events. Lets start with the `Data` event. - -```csharp - if (cmd == NetworkEvent.Type.Data) - { -``` - -Next, we try to read a `uint` from the stream and output what we have received: - -```csharp - uint number = stream.ReadUInt(); - Debug.Log("Got " + number + " from the Client adding + 2 to it."); -``` - -When this is done we simply add two to the number we received and send it back. To send anything with the `NetworkDriver` we need a instance of a `DataStreamWriter`. A `DataStreamWriter` is a new type that comes with the `com.unity.transport` package. You get a `DataStreamWriter` when you start sending a message by calling `BeginSend`. - -After you have written your updated number to your stream, you call the `EndSend` method on the driver and off it goes: - -```csharp - number +=2; - - m_Driver.BeginSend(NetworkPipeline.Null, m_Connections[i], out var writer); - writer.WriteUInt(number); - m_Driver.EndSend(writer); - } -``` - -:::note -We are passing `NetworkPipeline.Null` to the `BeginSend` function. This way we say to the driver to use the unreliable pipeline to send our data. It is also possible to not specify a pipeline. -::: - -Finally, you need to handle the disconnect case. This is pretty straight forward, if you receive a disconnect message you need to reset that connection to a `default(NetworkConnection)`. As you might remember, the next time the `Update` loop runs you will clean up after yourself. - -```csharp - else if (cmd == NetworkEvent.Type.Disconnect) - { - Debug.Log("Client disconnected from server"); - m_Connections[i] = default(NetworkConnection); - } - } - } - } - -``` - -That is the whole server. See [_ServerBehaviour.cs_](samples/serverbehaviour.cs.md) for the full source code. - -## Creating a Client - -The client code looks pretty similar to the server code at first glance, but there are a few subtle differences. This part of the workflow covers the differences between them, and not so much the similarities. - -### ClientBehaviour.cs +One thing that isn’t evident in the [simple client-serve example](workflow-client-server-udp.md) is that the `NetworkDriver` instantiates a `NetworkInterface` object internally. However, you might still need to request a particular `NetworkInterface` object. -You still define a `NetworkDriver` but instead of having a list of connections we now only have one. There is a `Done` flag to indicate when we are done, or in case you have issues with a connection, you can exit quickly. +The `NetworkInterface` defines the operations a `NetworkDriver` requires to establish and coordinate connections. By default, in most platforms, the `NetworkInterface` object is an instance of the `UDPNetworkInterface`, which, as implied by the name, encapsulates a UDP socket. However, you can't normally open a UDP socket in a Web browser. As a result, the default network interface in the WebGL player is the `WebSocketNetworkInterface`, which encapsulates a TCP socket using the WebSocket protocol. -**Filename**: [_Assets\Scripts\ClientBehaviour.cs_](samples/clientbehaviour.cs.md) +The distinction between the UDPNetworkInterface and the `WebSocketNetworkInterface` is important because of the fundamental network constraint that a client can only directly connect to a server with the same underlying socket type. In other words, a TCP socket can only connect to another TCP socket, and the same applies to UDP. If you plan to create a server for WebGL players to connect to, you have to tell the network driver to use the `WebSocketNetworInterface` explicitly: ```csharp -using ... - -public class ClientBehaviour : MonoBehaviour { - - public NetworkDriver m_Driver; - public NetworkConnection m_Connection; - public bool Done; - - void Start () { ... } - public void OnDestroy() { ... } - void Update() { ... } -} -``` - -### Creating and Connecting a Client - -Start by creating a driver for the client and an address for the server. - -```csharp -void Start () { - m_Driver = NetworkDriver.Create(); - m_Connection = default(NetworkConnection); - - var endpoint = NetworkEndPoint.LoopbackIpv4; - endpoint.Port = 9000; - m_Connection = m_Driver.Connect(endpoint); -} -``` - -Then call the `Connect` method on your driver. - -Cleaning up this time is a bit easier because you don’t need a `NativeList` to hold your connections, so it simply just becomes: - -```csharp -public void OnDestroy() -{ - m_Driver.Dispose(); -} + m_Driver = NetworkDriver.Create(new WebSocketNetworkInterface()); ``` -### Client Update loop +If you plan to share networking code between clients for multiple platforms, including WebGL, you might opt to have a WebSocket server for all platforms. In this case, ensure you assign the `WebSocketNetworkInterface` to the non-WebGL clients. -You start the same way as you did in the server by calling `m_Driver.ScheduleUpdate().Complete();` and make sure that the connection worked. +Alternatively, suppose you plan to have a server dedicated to browsers and another for other platforms. In that case, you can specify a different `NetworkDriver` instantiation with [compiler definitions](https://docs.unity3d.com/Manual/PlatformDependentCompilation.html) that depend on the platforms your project supports. ```csharp -void Update() -{ - m_Driver.ScheduleUpdate().Complete(); - - if (!m_Connection.IsCreated) - { - if (!Done) - Debug.Log("Something went wrong during connect"); - return; - } + #if UNITY_WEBGL + m_Driver = NetworkDriver.Create(new WebSocketNetworkInterface()); + #else + m_Driver = NetworkDriver.Create(new UDPNetworkInterface()); + #endif ``` -You should recognize the code below, but if you look closely you can see that the call to `m_Driver.PopEventForConnection` was switched out with a call to `m_Connection.PopEvent`. This is technically the same method, it just makes it a bit clearer that you are handling a single connection. - -```csharp - DataStreamReader stream; - NetworkEvent.Type cmd; - while ((cmd = m_Connection.PopEvent(m_Driver, out stream)) != NetworkEvent.Type.Empty) - { -``` - -Now you encounter a new event you have not seen yet: a `NetworkEvent.Type.Connect` event. -This event tells you that you have received a `ConnectionAccept` message and you are now connected to the remote peer. - :::note -In this case, the server that is listening on port `9000` on `NetworkEndPoint.LoopbackIpv4` is more commonly known as `127.0.0.1`. +Because the WebGL player is constrained by browser capabilities, it’s currently impossible to start a server in a WebGL player (even with the `WebSocketNetworkInterface`). Web browsers (to date) don't permit applications to open sockets for incoming connections, and trying to do so results in an exception. On the other hand, creating a server while playing in the Unity Editor is still perfectly valid. In some cases, you might want to use the [UNITY_EDITOR compiler definition](https://docs.unity3d.com/Manual/PlatformDependentCompilation.html) to create a `NetworkDriver` with the `WebSocketNetworkInterface` only when using the Unity Editor. ::: ```csharp - if (cmd == NetworkEvent.Type.Connect) - { - Debug.Log("We are now connected to the server"); - - uint value = 1; - m_Driver.BeginSend(m_Connection, out var writer); - writer.WriteUInt(value); - m_Driver.EndSend(writer); - } + #if UNITY_WEBGL && !UNITY_EDITOR + m_Driver = NetworkDriver.Create(new WebSocketNetworkInterface()); + #else + m_Driver = NetworkDriver.Create(new UDPNetworkInterface()); + #endif ``` - -When you establish a connection between the client and the server, you send a number (that you want the server to increment by two). The use of the `BeginSend` / `EndSend` pattern together with the `DataStreamWriter`, where we set `value` to one, write it into the stream, and finally send it out on the network. - -When the `NetworkEvent` type is `Data`, as below, you read the `value` back that you received from the server and then call the `Disconnect` method. - -:::note -A good pattern is to always set your `NetworkConnection` to `default(NetworkConnection)` to avoid stale references. -::: - -```csharp - else if (cmd == NetworkEvent.Type.Data) - { - uint value = stream.ReadUInt(); - Debug.Log("Got the value = " + value + " back from the server"); - Done = true; - m_Connection.Disconnect(m_Driver); - m_Connection = default(NetworkConnection); - } - -``` - -Lastly, we need to handle potential server disconnects: - -```csharp - - else if (cmd == NetworkEvent.Type.Disconnect) - { - Debug.Log("Client got disconnected from server"); - m_Connection = default(NetworkConnection); - } - } - } -``` - -See [_ClientBehaviour.cs_](samples/clientbehaviour.cs.md) for the full source code. - -## Putting it all together - -To take this for a test run, you can add a new empty [GameObject](https://docs.unity3d.com/ScriptReference/GameObject.html) to our **Scene**. - -![GameObject Added](/img/transport/game-object.PNG) - -Add add both of our behaviours to it: - -![Inspector](/img/transport/inspector.PNG) - -Click **Play**. Five log messages should load in your **Console** window: - -![Console](/img/transport/console-view.PNG) diff --git a/transport_versioned_sidebars/version-2.0.0-sidebars.json b/transport_versioned_sidebars/version-2.0.0-sidebars.json index 9f2d06083..ff71fe775 100644 --- a/transport_versioned_sidebars/version-2.0.0-sidebars.json +++ b/transport_versioned_sidebars/version-2.0.0-sidebars.json @@ -15,8 +15,12 @@ "items": [ { "type": "doc", - "id": "version-2.0.0/install" + "id": "version-2.0.0/getting-started" }, + { + "type": "doc", + "id": "version-2.0.0/install" + }, { "type": "doc", "id": "version-2.0.0/using-sample" @@ -59,26 +63,12 @@ { "type": "doc", "id": "version-2.0.0/secure-connection" - }] - } - ] - }, - { - "collapsed": true, - "type": "category", - "label": "Playing across platforms", - "items": [ - { - "type": "doc", - "id": "version-2.0.0/supported-platforms" - }, - { - "type": "doc", - "id": "version-2.0.0/cross-play-without-relay" - }, - { - "type": "doc", - "id": "version-2.0.0/cross-play-relay" + }, + { + "type": "doc", + "id": "version-2.0.0/integrate-logging" + } + ] } ] }, @@ -87,14 +77,6 @@ "type": "category", "label": "Extending functionalities", "items": [ - { - "type": "doc", - "id": "version-2.0.0/custom-pipeline" - }, - { - "type": "doc", - "id": "version-2.0.0/custom-networkinterface" - }, { "type": "doc", "id": "version-2.0.0/network-settings" From 80f9d4b7cf7a70477097a24d9d59c3755d1393b8 Mon Sep 17 00:00:00 2001 From: Larah Armstrong <29762984+armstrongl@users.noreply.github.com> Date: Thu, 8 Dec 2022 15:02:49 -0600 Subject: [PATCH 2/4] Add images --- static/img/transport/console-2.png | Bin 0 -> 25251 bytes static/img/transport/fragmentation-2.png | Bin 0 -> 144413 bytes static/img/transport/gameobject-2.png | Bin 0 -> 4973 bytes static/img/transport/inspector-2.png | Bin 0 -> 24018 bytes static/img/transport/layercake-2.png | Bin 0 -> 55760 bytes static/img/transport/pipeline-stages-2.png | Bin 0 -> 21506 bytes .../version-2.0.0/about.md | 2 +- .../version-2.0.0/pipelines-usage.md | 4 ++-- .../workflow-client-server-udp.md | 8 ++++---- 9 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 static/img/transport/console-2.png create mode 100644 static/img/transport/fragmentation-2.png create mode 100644 static/img/transport/gameobject-2.png create mode 100644 static/img/transport/inspector-2.png create mode 100644 static/img/transport/layercake-2.png create mode 100644 static/img/transport/pipeline-stages-2.png diff --git a/static/img/transport/console-2.png b/static/img/transport/console-2.png new file mode 100644 index 0000000000000000000000000000000000000000..407d5759bb4db6bd4295f65e1293d433bd1b0703 GIT binary patch literal 25251 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 literal 0 HcmV?d00001 diff --git a/static/img/transport/fragmentation-2.png b/static/img/transport/fragmentation-2.png new file mode 100644 index 0000000000000000000000000000000000000000..04422bf5cf0da8fc830dee65fb3571a22aa3b3f1 GIT binary patch literal 144413 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%0AO0x#wtE#=XF*c(1ZK0ZE9 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 POU@XWp2|OQ@y`DP6fI}G literal 0 HcmV?d00001 diff --git a/static/img/transport/gameobject-2.png b/static/img/transport/gameobject-2.png new file mode 100644 index 0000000000000000000000000000000000000000..032b4d70b5bd6062daa62d575fb8b6abc1c44901 GIT binary patch literal 4973 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 LrcO?-7S3c<=({t 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%0DS2h40v^8hL0$(n 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

q{ocgMMQP91x!Qeaz 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 literal 0 HcmV?d00001 diff --git a/static/img/transport/pipeline-stages-2.png b/static/img/transport/pipeline-stages-2.png new file mode 100644 index 0000000000000000000000000000000000000000..892e5ea546889dbacc9fa56f42a5c04599e66ff4 GIT binary patch literal 21506 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

rU+hb0Q5KyBS0Ej+9i6}yjeI94{=Gd@`Kb_0 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 E0ZKzWjsO4v literal 0 HcmV?d00001 diff --git a/transport_versioned_docs/version-2.0.0/about.md b/transport_versioned_docs/version-2.0.0/about.md index 9c9a4e395..1f1af52df 100644 --- a/transport_versioned_docs/version-2.0.0/about.md +++ b/transport_versioned_docs/version-2.0.0/about.md @@ -11,7 +11,7 @@ Unity Transport seamlessly supports all platforms the Unity Engine supports than You can set up both UDP and WebSockets with or without encryption. The following illustration shows encrypted connections with a closed padlock and unencrypted connections with an open padlock. - +![Block diagram](../../static/img/transport/layercake-2.png) You can also use [pipelines](pipelines-usage.md) to leverage additional functionality, such as reliability, packet ordering, and packet fragmentation. diff --git a/transport_versioned_docs/version-2.0.0/pipelines-usage.md b/transport_versioned_docs/version-2.0.0/pipelines-usage.md index 169ad1448..d5d17ab87 100644 --- a/transport_versioned_docs/version-2.0.0/pipelines-usage.md +++ b/transport_versioned_docs/version-2.0.0/pipelines-usage.md @@ -9,7 +9,7 @@ You can use pipelines to add sequencing, reliability, and fragmentation features Pipelines are a sequence of one or more stages. When you **send** a message through a pipeline, Unity Transport runs through the stages in order, piping the output of the first stage into the second stage. As a result, if the first stage adds a header to the packet, the second stage processes the entire packet, including the header added by the first stage. When you **receive** a message, it goes through the same chain of stages in reverse order. - +![Block diagram](../../static/img/transport/layercake-2.png) `FragmentationPipelineStage` allows breaking large messages into smaller pieces, and `ReliableSequencedPipelineStage` allows sending messages with guaranteed order and delivery. The following example shows how to create a pipeline with both functionalities: @@ -21,7 +21,7 @@ var myPipeline = driver.CreatePipeline( This creates a pipeline where Unity Transport first fragments messages into smaller pieces (that each fit in a packet), then delivers the individual packets reliably and in the correct order. - +![Pipeline stages](../../static/img/transport/pipeline-stages-2.png) This illustration shows the process of fragmentation and delivering packets in order. The small orange pieces on the fragments represent sequence numbers and other information added by the reliable stage. diff --git a/transport_versioned_docs/version-2.0.0/workflow-client-server-udp.md b/transport_versioned_docs/version-2.0.0/workflow-client-server-udp.md index 7a619a7b3..08f7b930a 100644 --- a/transport_versioned_docs/version-2.0.0/workflow-client-server-udp.md +++ b/transport_versioned_docs/version-2.0.0/workflow-client-server-udp.md @@ -420,16 +420,16 @@ If you’ve been following along with the tutorial and using the sample code, yo Add a new empty [GameObject](https://docs.unity3d.com/ScriptReference/GameObject.html) to your **Scene**. - +![GameObject](../../static/img/transport/gameobject-2.png) Add both the `ServerBehaviour` and the `ClientBehaviour` scripts to the GameObject. - +![Inspector](../../static/img/transport/inspector-2.png) Select **Play** to enter Play mode. You should see five log messages in the **Console** window: - +![Console output](../../static/img/transport/console-2.png) ## WebSocket - See [Client and server over WebSocket](workflow-client-server-ws.md). \ No newline at end of file + See [Client and server over WebSocket](workflow-client-server-ws.md). From a7638943185c7ef4ad3133b08377d58a4693420d Mon Sep 17 00:00:00 2001 From: Larah Armstrong <29762984+armstrongl@users.noreply.github.com> Date: Thu, 8 Dec 2022 15:04:17 -0600 Subject: [PATCH 3/4] Fix pipeline image --- transport_versioned_docs/version-2.0.0/pipelines-usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/transport_versioned_docs/version-2.0.0/pipelines-usage.md b/transport_versioned_docs/version-2.0.0/pipelines-usage.md index d5d17ab87..e0af9c946 100644 --- a/transport_versioned_docs/version-2.0.0/pipelines-usage.md +++ b/transport_versioned_docs/version-2.0.0/pipelines-usage.md @@ -9,7 +9,7 @@ You can use pipelines to add sequencing, reliability, and fragmentation features Pipelines are a sequence of one or more stages. When you **send** a message through a pipeline, Unity Transport runs through the stages in order, piping the output of the first stage into the second stage. As a result, if the first stage adds a header to the packet, the second stage processes the entire packet, including the header added by the first stage. When you **receive** a message, it goes through the same chain of stages in reverse order. -![Block diagram](../../static/img/transport/layercake-2.png) +![Block diagram](../../static/img/transport/fragmentation-2.png) `FragmentationPipelineStage` allows breaking large messages into smaller pieces, and `ReliableSequencedPipelineStage` allows sending messages with guaranteed order and delivery. The following example shows how to create a pipeline with both functionalities: From 2462189585713265be4a550d30d2700d806bed91 Mon Sep 17 00:00:00 2001 From: Larah Armstrong <29762984+armstrongl@users.noreply.github.com> Date: Thu, 8 Dec 2022 15:05:42 -0600 Subject: [PATCH 4/4] Swap pipeline image order --- transport_versioned_docs/version-2.0.0/pipelines-usage.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/transport_versioned_docs/version-2.0.0/pipelines-usage.md b/transport_versioned_docs/version-2.0.0/pipelines-usage.md index e0af9c946..d26285357 100644 --- a/transport_versioned_docs/version-2.0.0/pipelines-usage.md +++ b/transport_versioned_docs/version-2.0.0/pipelines-usage.md @@ -9,7 +9,7 @@ You can use pipelines to add sequencing, reliability, and fragmentation features Pipelines are a sequence of one or more stages. When you **send** a message through a pipeline, Unity Transport runs through the stages in order, piping the output of the first stage into the second stage. As a result, if the first stage adds a header to the packet, the second stage processes the entire packet, including the header added by the first stage. When you **receive** a message, it goes through the same chain of stages in reverse order. -![Block diagram](../../static/img/transport/fragmentation-2.png) +![Pipeline stages](../../static/img/transport/pipeline-stages-2.png) `FragmentationPipelineStage` allows breaking large messages into smaller pieces, and `ReliableSequencedPipelineStage` allows sending messages with guaranteed order and delivery. The following example shows how to create a pipeline with both functionalities: @@ -21,7 +21,7 @@ var myPipeline = driver.CreatePipeline( This creates a pipeline where Unity Transport first fragments messages into smaller pieces (that each fit in a packet), then delivers the individual packets reliably and in the correct order. -![Pipeline stages](../../static/img/transport/pipeline-stages-2.png) +![Block diagram](../../static/img/transport/fragmentation-2.png) This illustration shows the process of fragmentation and delivering packets in order. The small orange pieces on the fragments represent sequence numbers and other information added by the reliable stage.