Lessons learned from our first Steam release
We recently released our first game on Steam! This game was released as free to play, but the efforts to release it were well spent. I learned a ton throughout this process that will certainly help us out when we go to release actual commercial projects down the road.
We wanted to provide some of those learnings for y’all in hopes that it will help you get over the hump and release your side projects for the world to enjoy! So here is a quick retrospective on our recent release, Slice of Life.
What went well
It always feels good to kick off a retro with what went well, so let’s start there!
Assets and Add-ons
Whether you’re a game developer or a terminally online gamer, you’ve probably heard the term “asset flip” (derogatory) kicked around in the past few years. This generally refers to the understanding that when you don’t lovingly craft each pixel of your indie game experience, you are polluting the space with samey, uncreative junk. At least that’s what a niche community of folks in the comments section would have you believe.
My opinion is that assets make development more accessible to everyone, whether you’re a hobby developer or this is your 9 to 5. I don’t know about y’all but my 9 to 5 leaves me with very little energy at the end of the day! Lots of folks have an interesting story to tell or experience to share, but they don’t have the time to become Blender power-users in the few hours of life they have after work. That’s where assets come in.
We purchased the cityscape (which I subsequently edited heavily) and soundtrack used in Slice of Life as part of various Humble Bundle sales. I grabbed a few meshes I liked from the Base Mesh or Kenney. The entire premise of the game was sparked by playing around with a free Godot 4 add-on. Truly this game exists because I stood on the shoulders of folks who pour their time into enabling people to create games.
So if you’re worried about folks judging your game for being an asset flip, I encourage you to ship it anyway! Not all game devs have one single idea and want to spend forever honing it. Anything ethical that speeds up your development and leads to a release should be celebrated. You can always add little details to make it yours, like the cake material I created in Material Maker. Despite a little incongruity in art style among meshes, it’s the only reason this game was ever released.
Blender to Godot Workflow Trick
The next thing that went well was a trick that I will almost certainly be taking into future small releases, game jams, etc. By being very intentional with how you name your meshes in Blender, you can dictate the behavior of that mesh in your game engine of choice (here I’ll demo with Godot, our go-to engine for games at the time of writing).
For example, in Slice of Life, once all of my objects were placed in my environment, I followed this handy workflow to ensure I didn’t have to mess with export variables or painstakingly assign values to hundreds of individual meshes in the Godot editor:
In my case, objects in different buildings may be different in some way, so I named items based on where they are (e.g., objects in the Hotel were called “HotelObject”)
Once all the meshes are placed in your 3D scene in Blender, use the Select Pattern method to select everything in a certain building based on its name - you can just use a regex like *Hotel* to grab them all
Then with your meshes highlighted, go back into the Select menu and choose Select Random. Set it to Deselect and set the proportion of meshes you want to behave a certain way
With the random meshes selected, hit ctrl+f2 to batch rename, set the Type to Set Name and add a prefix or suffix based on your desired behavior. For me, I used “is_cake_” to determine if an object was going to be a cake vs. a random non-cake object
Once you’ve set up what you need, export as a gltf and head over to Godot
Pull the gltf object into your scene. I made this one local for a little more granular control, but that shouldn’t be necessary
In the script attached to your scene, use if “{prefix or suffix}” in name: to set the behavior, like I do in the example below. You can do this many times, which probably doesn’t look the prettiest but is easy to follow if you ever want to make changes!
When you load up your scene, you can have all of your meshes behaving the way you want without needing to do anything in the editor!
It’s not necessarily the cleanest or most scalable way to solve this problem, but it’s a straightforward solution for a small project like this! Plus, production-quality code can be overrated, just ask Balatro creator LocalThunk, whose codebase went viral for being super dense. That said, games are executables run on strangers’ computers, so while you may not need to stress too much about lengthy switch statements, you should do your best to ensure that your code is written to run safely.
The Game Was Really Fun To Make
I had a blast making Slice of Life. From the first time I pulled up the demo project for the concave mesh slicer linked above, I was like “... I must make a game where everything is cake.” And it took almost a year of production amidst work, life, and other projects, but it was easy to work through the “valley of despair” because the game itself was so goofy.
I spent weeks animating the cut scenes in the game. I still get a kick out of them when I see them or when I watch someone else experience them for the first time. I spent a ton of time making sure you could pick up objects and slice ‘em where you wanna slice ‘em. The “outline objects you can pick up” logic is not perfect, but it improves the overall experience and I think it adds a lot to the player experience.
Learning to overcome challenges will certainly help our next projects, and in this case the theming of the game was so absurd to me that it was hard to get mad at the hurdles. Making games can be as fun as playing them, and this project was no exception.
What Could Have Gone Better?
“Stop talking about how fun and easy this is and make me feel better about how hard my game project is!” - you, maybe.
I hear you! Here are some things I struggled with and things we could improve for next time.
My Character Gets Stuck on Stuff
There are a handful of corners in Slice of Life that cause the player to get stuck. The problem was so frustrating to try to solve I eventually had to bake in a “get unstuck” button to “solve” it… It’s a bit embarrassing to be like “hit the unbug button” but here we are! Godot 4.x seems to have this issue with CharacterBody3D that I have not yet found a great fix for. Maybe future versions will fix this! In a perfect world I would solve this and PR the engine, but again… Time and energy…
My Cool Blender to Godot Workflow Creates Fragile Systems
The thing with hard string matching based on blender names is that if I am not paying close attention when building my environment, it can create bugs. One such bug got pointed out by a Steam user: I had copied an outdoor item and moved it into an indoor space (retaining its original name that indicated it belonged outdoors). Specifically, I had some trash cans that I copied from outside and moved into the Hotel, and based on my naming scheme you couldn’t cut them unless you were outside… So it didn’t break the game but was certainly not the desired behavior.
Marketing!
We’re not going to do it! It’s a free to play game, so any ad spend would be a net loss for our tiny studio. As a result, 30 or so people have played it to date, many of whom are close friends or coworkers. Industry wisdom suggests creating a store page as soon as you have any playable footage to share, and this is another of probably hundreds of games released every week that could have benefitted from applying that technique. Thankfully this project was scoped as more of a portfolio project, and we learned what we set out to learn: how to get a game on Steam. So despite the fact that the conversion rate was negligible, Slice of Life feels like a big win!
And The Winner For Things To Improve For Next Time… I… MAY… Have Shipped a Broken Game…
Spoilers incoming! If you haven’t checked out the game yet and you want to, go do that before reading on. It’s quick, I’ll wait!
Okay, now that you’ve finished it and left a positive review, imagine getting this comment to your first ever Steam release:
It turns out that there was a bug that only seemed to be present on some Windows 10 setups, but not the machines we playtested on… It totally broke the game and stopped players from seeing the “cut” scene (heh) at the end of the game! It took a few days and some back and forth with the community to get it fixed, and now the game appears to be mostly un-broken for most users.
This serves as another reminder to playtest early and often. Playtest on multiple machines, different OS’s, with people who aren’t your close friends and family (shock!), and do your best to limit shipping a busted game as your first release…
Thanks for reading!
We hope you enjoyed learning along with us as we shipped our first Steam game. This is normally where we would put a call to action to wishlist our next one, but we’re going to wait until it actually has a Steam page first. In the meantime, we hope you picked up some helpful information that you can use to ship your first Steam release!