Godot-matcha is an addon that lets you use WebRTC for multiplayer games by handling matchmaking using WebTorrent trackers. Conceptually it’s quite an interesting, novel approach.
WebTorrent uses a modified BitTorrent protocol that allows it to work with WebSockets. A WebTorrent tracker is essentially a directory service that keeps track of torrents offered by users. A torrent is uniquely identified by its info_hash, so if you have the torrent information, you can look up who is offering a file for download.
Rather than tracking a specific torrent file, godot-matcha generates a random identifier, which it uses as a room (or lobby). If another player has the same identifier they exchange the WebRTC’s SDP details to establish a connection.
Connecting players this way is essentially free. This is a suitable approach for mobile games, for example, where you start a game, and share an identifier with someone else to join in. Mobile party games, for example, use such an approach: One player starts a game, and others join by using some random id such as “FJRLE”.
While godot-matcha is a great proof of concept, I’ve done some testing that showed that the various clients disagree on their unique IDs. This results in challenges when setting the multiplayer authority, a key part of making the high-level multiplayer abstraction work well. The reason for the mismatch is how godot-matcha creates offers, which sets a random id as peer ID before the peers are even connected.
Here’s a collection of tutorials that are helpful if you’re new to using Control and Container nodes to create UIs in Godot 4. The Game Dev Artisan video covers creating a simple UI with a reload indicator for a simple 2D tank game: Clear Code’s 11+ hour Ultimate Introduction to Godot 4 has a chapter …
Godot Engine 4 has a bug (#50824) that causes particle jitter when the game is paused. It does look quite distracting. The Bug in Action This is a proof-of-concept wave shooter running in Godot Engine 4.0.2. Pausing the game was initially just a simple process_mode toggle. But as shown in the video clip above, there …
I had a setup with nested CanvasLayer nodes. Toggling the visibility of the root CanvasLayer doesn’t hide any nested CanvasLayer nodes. My solution was to listen to the visibility_changed signal, find any CanvasLayer child nodes, and apply the same visibility to them.
A little while ago, I created a type of AudioManager to make it easier to work with sound files in bulk: Rather than assigning audio streams by hand, I was doing it programmatically; reading the contents of a directory and using load() to get the resources. It worked great and saved a lot of time …
godot-matcha: Free multiplayer without a server
Godot-matcha is an addon that lets you use WebRTC for multiplayer games by handling matchmaking using WebTorrent trackers. Conceptually it’s quite an interesting, novel approach.
WebTorrent uses a modified BitTorrent protocol that allows it to work with WebSockets. A WebTorrent tracker is essentially a directory service that keeps track of torrents offered by users. A torrent is uniquely identified by its info_hash, so if you have the torrent information, you can look up who is offering a file for download.
Rather than tracking a specific torrent file, godot-matcha generates a random identifier, which it uses as a room (or lobby). If another player has the same identifier they exchange the WebRTC’s SDP details to establish a connection.
Connecting players this way is essentially free. This is a suitable approach for mobile games, for example, where you start a game, and share an identifier with someone else to join in. Mobile party games, for example, use such an approach: One player starts a game, and others join by using some random id such as “FJRLE”.
While godot-matcha is a great proof of concept, I’ve done some testing that showed that the various clients disagree on their unique IDs. This results in challenges when setting the multiplayer authority, a key part of making the high-level multiplayer abstraction work well. The reason for the mismatch is how godot-matcha creates offers, which sets a random id as peer ID before the peers are even connected.
In contrast, the godot-demo-projects repository has a webrtc_signaling demo, which uses the lobby/signaling server to tell the clients their ID, so that all clients (including the one acting as the server) add the same peer ID.
Related Posts
Building UIs in Godot 4
Here’s a collection of tutorials that are helpful if you’re new to using Control and Container nodes to create UIs in Godot 4. The Game Dev Artisan video covers creating a simple UI with a reload indicator for a simple 2D tank game: Clear Code’s 11+ hour Ultimate Introduction to Godot 4 has a chapter …
The Pause Handler: Working around Godot 4’s particle jitter bug
Godot Engine 4 has a bug (#50824) that causes particle jitter when the game is paused. It does look quite distracting. The Bug in Action This is a proof-of-concept wave shooter running in Godot Engine 4.0.2. Pausing the game was initially just a simple process_mode toggle. But as shown in the video clip above, there …
Toggling Visibility of Nested CanvasLayers
I had a setup with nested CanvasLayer nodes. Toggling the visibility of the root CanvasLayer doesn’t hide any nested CanvasLayer nodes. My solution was to listen to the visibility_changed signal, find any CanvasLayer child nodes, and apply the same visibility to them.
Dynamically finding and loading resources from the Filesystem for Android and Web Exports
A little while ago, I created a type of AudioManager to make it easier to work with sound files in bulk: Rather than assigning audio streams by hand, I was doing it programmatically; reading the contents of a directory and using load() to get the resources. It worked great and saved a lot of time …