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:
- Purrnity Transport:
https://github.com/youngwoocho02/PurrnityTransport.git
- 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);