For reasons some of you may be familiar with, September was a hell of a month. Along with many other independent game developers I was knocked significantly off-track by Unity’s antics, and it’s something of an open question exactly how big of a problem that will continue to be. I’ll dive more into that a bit later on – let’s start at the beginning.
At the end of last month I was wrapping up an extensive and annoying rework of the dialogue system. This whole process was very frustrating and tedious, but I wanted to follow through on that work and build the Notebook – an inventory item the player could use to track progress and dialogue, an entry point back into the game for players who hadn’t played for a while and a way to communicate some non-obvious details about how the game systems work. This all adds up to a not-insignificant challenge: How does all this information get displayed? Where do I store the information? How do I format it?
One of the trickier features I had to tackle was a way to display enemy attack hitboxes and damage. This is made particularly tricky by this information changing with each enemy movement and attack. Unity’s UI elements have completely different display properties than the sprite renderers used in gameplay, adding another layer of challenge to getting this display working. I built out the UI and an enemy sandbox room with its own camera that just gets rendered out to an image for the enemy display to use. I also figured out how to copy out enemy hitbox information into a SpriteShape display so the collision data can be visible in real time.
This is a pretty solid start, but there’s a fair bit left to do. Everything so far is partially implemented and untested, and I still need to hammer out some of the specifics of how old dialogues will get displayed and how the journal will be implemented. However, all of my efforts to figure this out were interrupted when Unity, the game engine I’ve been building the project in, decided to ruin everything for everyone.
For those of you fortunate enough to be unfamiliar with these events: A couple of weeks into September, Unity announced their new pricing plan. Under this plan, after a game reached certain thresholds Unity would begin charging game developers per game installation. The exact amount charged varied based on license, but the following facts were true regardless: First, there is no plausible way to track the number of times a game has been installed by users, and suggesting otherwise raises Questions. Second, there is no way for a game developer to account for these hypothetically unbounded expenses, putting every developer at unknown levels of financial risk, particularly if these numbers can be manipulated by malicious actors. Third, they’re asking us to place our financial futures entirely in the hands of their opaque black box algorithm and abide by whatever number it spits out. Fourth, declaring that these changes can happen retroactively and affect everyone who developed in the engine in the past, who had no opportunity to disagree to the terms or account for them, establishes a, let’s say, worrying precedent.
Now: They have since amended their proposition to cap the fee at 2.5% of gross revenue and to require devs who cross a sales threshold to pay a $2000/y subscription to Unity Pro. This is unequivocally better, in that it is an expense that one can realistically plan for, that there’s now no scenario where they can simply claim a game’s entire revenue because of some behind the scenes numbers. It’s still simply not very good: While these terms only apply if you update to the newer engine versions, they have not to my knowledge added anything preventing them from trying the same retroactively applied abuses as they proposed before, or from changing these cuts to be even worse down the road. Additionally, these sorts of revenue shares are an egregious pricing model in the first place, particularly coming on top of an exorbitant subscription fee. However, this is at least enough of a compromise that I can countenance finishing the project in this engine, which I was otherwise having serious doubts about.
I mention all of this for two purposes: First because I’m still mad about it and wanted to vent a little, and second because development of the notebook feature got completely derailed by all this. The couple of weeks following this announcement were mostly occupied by shock and anxiety, then explorations into what would be needed to port the game to another engine such as Godot. The answer I arrived at, after a fair amount of exploration and experimentation, was: A Lot. Many of the game’s systems and rendering solutions are tied pretty intimately into Unity’s architecture, and these would need to be painstakingly reproduced. That being said, it wouldn’t necessarily be a completely ground-up effort: It would probably be possible to export and reimport the basic levels, though scripting and lighting might be trickier, and the sound systems could probably be rebuilt relatively quickly. Still, if there’s any way to avoid these months of additional tedious and depressing effort, I would prefer that.
All of this, of course, was terrible for morale. I still haven’t resumed work on the notebook feature – not least because this is one element that would need to be rebuilt more-or-less completely to port it into another environment – and have instead focused my efforts on level-building. This should be relatively satisfying – it is one of the most direct and active tasks I can do on the project! To some extent it is satisfying, but I am still so tired from all of the Unity issues and from various other life events that my energy and enthusiasm are at a notable low point.
Still, even if I’m tired and frustrated, the problems presented by this project are fun and interesting ones. In particular, I have been building this with more of an eye towards verisimilitude, towards building an environment that feels plausible and lived in, than most games seem to be interested in – particularly action games, and particularly 2d platformers. This results in some pretty odd circumstances! For instance, in building a parking garage, what does one expect to be there? Perhaps a staircase and elevator for people to go up and down on their way to and from parking, and perhaps a ramp for the cars to drive up or down to change levels. But: What does that mean in a 2d platfomer? Most of the stairs in the game are non-interactive background elements placed behind one-way platforms.
This creates something that serves the same purpose as stairs, and are interacted with in a similar way, but which in practice the player jumps up an entire flight at a time. What’s so remarkable is how invisible this arrangement quickly becomes: The stairs read as stairs, the platforms read as platforms, they both seem in place, and the player doesn’t even notice how odd the specifics of the interaction are. However, I’m not sure how far I can push this dynamic before it starts to get weird. Returning to the parking garage, the specific example that prompted this line of thought, let’s look at what the ramp looks like:
It’s the same theory as the stairs. Make something that looks like a ramp, make a set of platforms that can be used in the same way and fit into the art, and hope the player never thinks about the bizarre non-sequitur logic of using a ramp this way. Will it work? I don’t know! This seems to really push the boundaries of visual plausibility, but it also looks kind of fun and interesting. Whether it works or not is something that will probably require some testing and feedback to determine. If it doesn’t, well, there are always alternative solutions.
Anyway, as the project lurches unevenly along I’ll be continuing to build out these levels. There’s still much to be done even on that front alone — I’m maybe a third of the way into level-building for the next demo, and of course there is much to be done aside from that basic construction work, so I have my work cut out for me. Let’s hope there are no more announcements like this recent one any time soon.