Community Guides

Unity Multiplayer Services with PurrNet

by DevBookOfArray (youngwoocho02)

Introduction

This guide covers how to integrate Unity 6's Multiplayer Services (Lobby, Relay, Matchmaker) with PurrNet using two community packages:

  • Purrnity Transport - A transport adapter bridging PurrNet with Unity's Transport Package
  • PurrNet Multiplayer Services Handler - A session management layer connecting Unity's Multiplayer Services to PurrNet

Together, these packages let you use Unity's matchmaking and relay infrastructure while keeping PurrNet as your networking framework.

Requirements

  • Unity 6.0+
  • PurrNet
  • Unity Transport 2.0+ (com.unity.transport)
  • Multiplayer Services 1.1.0+ (com.unity.services.multiplayer)

Installation

Install the packages via Unity Package Manager using Git URLs:

  1. Purrnity Transport:
https://github.com/youngwoocho02/PurrnityTransport.git
  1. PurrNet Multiplayer Services Handler:
https://github.com/youngwoocho02/PurrNetMultiplayerServicesHandler.git

Setting Up the Transport

Add the PurrnityTransport component to your NetworkManager GameObject and assign it as the transport.

Basic Connection (Direct UDP)

// Server
transport.Listen(7777);

// Client
transport.Connect("127.0.0.1", 7777);

Using Unity Relay

For NAT traversal, you can configure the transport to use Unity Relay:

// Host - set relay server data before listening
transport.SetRelayServerData(relayServerData);
transport.Listen(0);

// Client - set relay join data before connecting
transport.SetRelayServerData(relayJoinData);
transport.Connect("0.0.0.0", 0);

Encryption

Enable DTLS encryption for UDP or TLS for WebSocket connections:

transport.SetServerSecrets(serverCertificate, serverPrivateKey);

Session Management with Multiplayer Services Handler

The handler provides a high-level API for session-based multiplayer using Unity's services.

Initializing

using PurrNet.MultiplayerServices;

// Initialize Unity Services first
await UnityServices.InitializeAsync();
await AuthenticationService.Instance.SignInAnonymouslyAsync();

Creating a Session

var options = new SessionOptions()
    .WithPurrRelay()   // Use relay-based connection
    .WithMaxPlayers(4);

var session = await MultiplayerService.Instance.CreateSessionAsync(options);

Joining a Session

// Join by session ID
var session = await MultiplayerService.Instance.JoinSessionByIdAsync(sessionId);

// Join by code
var session = await MultiplayerService.Instance.JoinSessionByCodeAsync(sessionCode);

// Quick match
var options = new QuickJoinOptions();
var session = await MultiplayerService.Instance.QuickJoinSessionAsync(options);

Direct P2P Connection

var options = new SessionOptions()
    .WithPurrDirect()   // Use direct P2P connection
    .WithMaxPlayers(4);

var session = await MultiplayerService.Instance.CreateSessionAsync(options);

Resources