Publish Your Unity Games in the Snap Store

We often feature and promote applications and games in the Snap Store and via our social media channels. Perhaps unsurprisingly, games are popular among our followers, and our users. There are a few great games already in the Snap Store, but there’s always room for more!

Snap lends itself well to packaging and distributing free games to Linux users. Snap support is available for over 40 Linux distributions, so with one build of a snap, you can reach millions of Linux gamers. The same snap will work across all those distributions without you needing to test on each one.

Snaps are pretty straightforward to create, easy to publish and come with interesting Snap Store metrics. It’s also a really simple way to just share your creations with friends, no matter which of the major Linux distributions they use.

In this article we’ll go through the steps required to publish a game in the Snap Store. We’ll focus on games built using the Unity Editor, but the principles are largely the same, no matter what engine is used. So long as the engine supports creating Linux binaries, you’re good. We will be using snapcraft, a tool we created to build snaps.

Pre-requisites

In addition to your game binaries you’ll also need a computer or Virtual Machine (VM) running Linux. You may already be developing on Linux, which is great, but we know many game developers initially build on Windows or macOS, so may not have a Linux machine to hand.

Any distribution listed on the installing snapd page will work fine on bare metal.

If using a VM, use an up to date installation of Ubuntu 18.04 as the guest OS. While it may be possible to use another distribution in a VM, I’d recommend using Ubuntu 18.04. By default, snapcraft launches a VM (managed by multipass) which likely won’t work when ‘nested’ inside another VM. So when running snapcraft in a VM we will pass it a parameter to build directly, and not use multipass. This ensures we don’t build against, or incorporate libraries from the foreign Linux distribution in the build, which will compromise the ability to run the snap anywhere.

So your two options are:-

  • Install a supported Linux distribution on bare metal
  • Install Ubuntu 18.04 in a VM

Sign up for a store account

Signing up for a Snap Store account is just like registering for any service. It will give you secure access to manage your snaps, update the description, screenshots, icon and other metadata. It also will give access to release the snap when you’re ready, and access weekly active device metrics.

Follow the guide to setting up your developer account in the Snap Store.

Register the name of your game

Each application name is unique in the Snap Store. Registering the name of your game will reserve it for you. Some common names have been per-registered to prevent name-squatting. If the store says your game name is already taken, there is a dispute process you’re liked to, in order to request the name be assigned to you. Alternatively choose a different name, or be creative with hypens – e.g. register “space-trek” rather than “spacetrek”. The dispute process enables you to discuss the registration with a human Snap Store admin.

The process for registering is covered in more detail in the documentation.

Install snap support

Snapcraft, the tool used to build snaps, is provided as a snap itself. As such you’ll need to have access to a Linux machine which has snap support to build your game snap.

Ubuntu 16.04 and above, and some other Linux distributions ship with snap support out of the box. If you’re using something which may not, you can add support via the instructions in the documentation.

Install snapcraft & multipass

Once you have snap support, install snapcraft and (if you’re not running Linux inside a VM), multipass. If you’re already running Linux in a VM, simply skip installing multipass for now.

sudo snap install snapcraft
sudo snap install multipass --beta

Setup working directory

On the Linux machine, create a directory in which we’ll build the snap and incorporate the binary build of your game. I’ve named the folder “MyGame” but you can of course change that to whatever your game is called.

mkdir -p ~/SnapGames/MyGame/snap/local

Note: Don’t be tempted to create a folder called snap in your home directory and build in there. The snap folder in your home is reserved for snap applications themselves, and things get horribly confusing if it’s misused.

Export game from Unity3D to ~/SnapGames/MyGame/snap/local

Within the Unity Editor, choose File -> Build Settings. Select Linux as the Target Platform and x86_64 as the Architecture. Hit the Build button, then select the previously created ~/SnapGames/MyGame/snap/local directory, named “MyGame” for example.

Test the game on Linux

As a quick sanity check, run the game outside of the Unity Editor by running the binary you exported in the previous step. This is a good way to make sure everything exported correctly.

Run the executable located at:

~/SnapGames/MyGame/snap/local/MyGame.x86_64

Create a snpacraft.yaml

Snapcraft uses a simple yaml file to drive the build of a snap. I’ve provided a template below, which shouldn’t need much modification. Save it as ~/SnapGames/MyGame/snap/snapcraft.yaml

Replace content of name, version, summary, description and command at the minimum.

name should match the lowercase name you registered in the store. summary, version and description are all human readable text.

The command should match the exported binary name from Unity. Consult the reference documentation for snapcraft to learn in detail what each entry does.

Finally, modify the LD_LIBRARY_PATH entry in the apps: section which points to the folder inside the snap where the supplied Unity run-time libraries reside. Specifically modify the /MyGame_Data/ section of the path to match the data directory exported by the Unity Editor. This will typically be the name of your game, followed by “_Data”.

name: mygame
version: "1.0"
summary: My Awesome Game
description: |
This is my amazing game which will clearly win awards.
Shoot the bad guys.
Collect the coins.
Avoid the traps.
base: core18
confinement: strict
parts:
mygame:
after: [desktop-gtk2]
plugin: dump
source: snap/local
stage-packages:
- libgl1-mesa-dri
- libglu1-mesa
- libgl1-mesa-glx
- libgles2-mesa
- libflac8
- libxcursor1
- libxi6
- libxinerama1
- libxrandr2
- libxrender1
- libasound2
- libasyncns0
- libogg0
- libpulse0
- libsndfile1
- libtheora0
- libvorbis0a
- libvorbisenc2
- libvorbisfile3
- libwebp6
desktop-gtk2:
build-packages:
- build-essential
- libgtk2.0-dev
make-parameters:
- FLAVOR=gtk2
plugin: make
source: https://github.com/ubuntu/snapcraft-desktop-helpers.git
source-subdir: gtk
stage-packages:
- libxkbcommon0
- ttf-ubuntu-font-family
- dmz-cursor-theme
- light-themes
- adwaita-icon-theme
- gnome-themes-standard
- shared-mime-info
- libgtk2.0-0
- libgdk-pixbuf2.0-0
- libglib2.0-bin
- libgtk2.0-bin
- unity-gtk2-module
- locales-all
- libappindicator1
- xdg-user-dirs
- ibus-gtk
- libibus-1.0-5
apps:
mygame:
command: desktop-launch $SNAP/MyGame.x86_64
environment:
LD_LIBRARY_PATH: "$SNAP/MyGame_Data/Plugins/x86_64:$SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/pulseaudio:$LD_LIBRARY_PATH"
plugs:
- x11
- opengl
- network
- network-bind
- desktop
- desktop-legacy
- pulseaudio
- joystick

Create a desktop file

On Linux distributions a standard .desktop file and an icon is required. The desktop file is used to add a menu item to the players’ Linux desktop environment, so the game can be found and launched from the graphical desktop. The icon will be displayed in the menu.

Create a directory ~/SnapGames/MyGame/snap/gui

Drop a .desktop file and icon in called mygame.desktop and mygame.png in the new folder.

Change the value of exec to match the registered snap name in lower case. This should also match the line below apps: in the snapcraft.yaml.

Note: mygame.desktop and mygame.png should both match the registered name of the snap.

[Desktop Entry]
Name=MyGame
Comment=My Awesome Game
Exec=mygame
Icon=${SNAP}/meta/gui/mygame.png
Type=Application
Terminal=false
Categories=Game;

Build the snap

If running on bare metal, run snapcraft, which will spawn multipass and build the snap inside it, and copy the result out to your working directory.

When running Ubuntu 18.04 inside a Virtual Machine, launch snapcraft in ‘destructive mode’ which will build natively on the machine, and not attempt to further launch any VMs.

Note: ‘destructive mode’ is intended for use in CI systems, where the VM or container running snapcraft is likely to be thrown away after the build. You should consider this VM dedicated for use in building these snaps. Adding further packages, PPAs and other software to the VM may compromise the ability for the resulting snap to run everywhere.

cd ~/SnapGames/MyGame
snapcraft --destructive-mode

Here’s an abbreviated view of what you should see while it’s building:

$ snapcraft 
Using 'snap/snapcraft.yaml': Project assets will be searched for from the 'snap' directory.
Launching a VM.
Launched: snapcraft-mygame                                                      
2019-03-20T10:06:08Z INFO Waiting for restart...
core 16-2.37.4 from Canonical✓ installed
snapcraft 3.2+git14.ge1bb1c5 from Canonical✓ installed
core18 18 from Canonical✓ installed
Pulling mygame 
Building mygame 
Staging mygame 
Priming mygame 
The execstacks are going to be cleared for the following files:
- /root/prime/MyGame.x86_64
To disable this behavior set `build-attributes: [keep-execstack]` for the part.
'grade' property not specified: defaulting to 'stable'
Snapping 'mygame'                                                                                                                                     
Snapped mygame_1.0_amd64.snap

If all goes well, you should end up with a snap in the current directory.

Note: You may get warnings (in yellow) about “execstacks”. This can usually be ignored, and is simply a standard feature of snapcraft to increase security of applications published in the Snap Store.

Install the snap

Before you publish your shiny new snap and share with the world, it’s worth testing it locally. Install the snap you just created with snap install.

snap install mygame_1.0_amd64.snap --dangerous

Note: The --dangerous parameter is required to indicate you’re accepting the risk that this snap didn’t come from, and wasn’t digitally signed by the Snap Store.

Look in the desktop menu/launcher to ensure the icon appears correctly and the name of the game appears. Launch the game and check it functions as expected.

Note: If you have installed the game via some other means, you may have two icons, one for the snap you installed, and one for the non-snap install of the game.

If the game fails to launch, try running from a terminal to see if any further output hints at why.

snap run mygame

We have a friendly snapcraft forum where developers and the wider community can assist in debugging snap builds.

Push the snap to the store

Once you’re happy with your snap, you can push it to the store using snapcraft.

snapcraft push mygame_1.0_amd64.snap

The Snap Store will run an automated scan of the snap, to ensure it’s a valid snap package and is not corrupted or malformed.

Update store listing page

Now the snap is in the Snap Store, it’s time to spruce up the store page. Visit https://snapcraft.io/snaps to get a list of your snaps. From there you can manage the metadata for each one, add an icon, screenshots and a more comprehensive description. Users are more likely to install snaps which have videos, screenshots and detailed descriptions. We’ve created a guide detailing some of the ways to improve your store page.

Release the game

Once you’re ready to make the game available to the public, release it to the “stable” channel in the Snap Store. The Snap Store “releases” tab enables you to publish a revision to a channel. Once that’s done, users can find and install your snap from the store.

Promote it

Now it’s time to get the word out. Update your project web site to link to your store page. Promote your snapped game on social media using pre-made buttons, or links. Use the “Publicise” tab at https://snapcraft.io/snaps to grab the code for those buttons and embeddable cards.

Next steps

The Snap Store provides metrics so you can see how popular your new creation is, and how effective your promotion is.

The Snap Advocacy Team at Canonical love to hear about your experiences in building snaps. We take your feedback to the snapcraft and snapd teams to improve the process for yourself and the next developer. We’d also love to hear about the snaps you publish, and may even promote them on our social media channels, or feature them prominently in the store! Let us know what you make.

Photo by Reina Kousaka on Unsplash

Posted in: