Play Stranger Cubes on itch.io here.
Stranger Cubes is an adaptation of the design of Blob Catcher, so I recommend reading about that first.
Project Origin
In early 2019, I became aware of AppLovin and Lion Studios’ annual hyper-casual game contest. The idea is that developers can submit a game to the contest, AppLovin will give it a bunch of free promotion in their ad network, and then collect data about engagement and retention. The game with the best KPI’s wins the contest and its developer wins cash and a publishing deal. Pretty cool, right?
This seemed like a good opportunity to flesh out the gameplay idea of Blob Catcher, but with 3D graphics. Stranger Things Season 3 had just come out, the retro-80s-neon aesthetic was in full swing, and I was curious to try out Unity’s new Lightweight Render Pipeline tech… thus, Stranger Cubes was born.
The Pitch
The basic idea was to take the gameplay of Blob Catcher and tilt the camera to make it feel 3D. This would completely change the feel of gameplay, making it feel like the player was moving forward through space rather than catching falling objects. It also provides a much longer horizon for objects to appear, which allows the player to better anticipate objects and makes the game playable at higher speeds. Lots of advantages!
And, of course, there’s the overuse of bloom with simple shape outlines and neon colors. As a non-artist developing this solo, I felt like this was a good way to make something look passable for very little effort. That’s art direction, baby!
Level Editor
Having worked on Color Switch, I spent a lot of time thinking about games with bespoke levels and an endless mode, and felt that a series of levels could help players ease into the game mechanics. That meant one thing: I needed to build a level editor!
I settled on a pretty simple approach: Write a custom editor that used keyboard controls. I could then build levels really fast with just arrow keys and a few hotkeys on the left side of the keyboard – the editor controlled like a game! This is actually very easy to do!
[CustomEditor(typeof(LevelEditor))]
class LevelEditorCustomEditor : Editor
{
private void OnSceneGUI()
{
if (Event.current.type == EventType.KeyDown)
{
LevelEditor levelEditor = (LevelEditor)target;
levelEditor.Initialize();
switch (Event.current.keyCode)
{
case KeyCode.LeftArrow:
levelEditor.CursorX--;
levelEditor.UpdateCursorPosition();
Event.current.Use();
break;
case KeyCode.RightArrow:
levelEditor.CursorX++;
levelEditor.UpdateCursorPosition();
Event.current.Use();
break;
case KeyCode.UpArrow:
levelEditor.CursorY++;
levelEditor.UpdateCursorPosition();
Event.current.Use();
break;
case KeyCode.DownArrow:
levelEditor.CursorY--;
levelEditor.UpdateCursorPosition();
Event.current.Use();
break;
case KeyCode.Z:
levelEditor.SpawnAtCurrentPosition(LevelItemType.Spike);
Event.current.Use();
break;
case KeyCode.X: levelEditor.SpawnAtCurrentPosition(LevelItemType.BasicCube);
Event.current.Use();
break;
case KeyCode.C: levelEditor.SpawnAtCurrentPosition(LevelItemType.Collector);
Event.current.Use();
break;
case KeyCode.V:
levelEditor.CycleCubeAtCurrentPosition();
Event.current.Use();
break;
case KeyCode.E: levelEditor.SpawnAtCurrentPosition(LevelItemType.EndOfLevel);
Event.current.Use();
break;
case KeyCode.Delete:
levelEditor.DeleteAtCurrentPosition();
Event.current.Use();
break;
case KeyCode.W:
levelEditor.EditorCamera.transform.position += Vector3.up * 4f;
Event.current.Use();
break;
case KeyCode.S:
levelEditor.EditorCamera.transform.position += Vector3.down * 4f;
Event.current.Use();
break;
case KeyCode.R:
levelEditor.ResetCursorAndCamera();
Event.current.Use();
break;
}
}
}
All levels would be represented by ScriptableObjects that contained an array of items. Since the player always spawns at 0, 0 and the level spawns relative to the player, I could just store all the item positions in the level directly and then spawn them from there. This also made loading and saving extremely easy.
I built 20 levels with increasing difficulty. Some levels were basically like endless mode, but a few had specific moments of challenge that forced the player to pick up a specific powerup, or even to avoid banking their items to score so they could save them as lives for later.
After beating all 20 levels, Endless mode unlocked… and the real fun would begin!
Contest Results
A week after submitting the game to the contest, I got some bad news: The game was performing… terribly. So badly, in fact, that the publishing rep assigned to be my contact was actually surprised!
While there’s no way to know why the usual audience for hyper-casual games didn’t respond, I have two theories:
- The art style is dark. This may not seem like a big deal at first, but I think there’s a reason that so many of the goofy hyper-casual games use light color schemes – they’re supposed to look friendly to people who don’t normally play games. The game’s color scheme probably implies “hardcore gamer game” rather than “casual gamer game” so that audience steers clear.
- The core gameplay concept is unintuitive. The game is about collecting and ‘banking’ something to increase a score. This is far less intuitive than many hyper-casual games, and I have (since the game came out) noticed a number of ads for games with similar mechanics that revolve around collecting stuff, but in a way that plays out more intuitively over the course of the experience. A prime example is a game where the player controls a bunch of little guys running around who can beat up enemies – in this case, the utility of having more is obvious.
The Final Verdict
In the end, Stranger Cubes was a failure for its original intended audience… but as far as my goals for the game, it was still a success. I was able to build exactly what I set out to, and it’s fun (and hypnotic!) in a unique and unusual way.
Where I did mess up was not pursuing it further – I didn’t port it to WebGL until recently, and I suspect that it can still find a (small) audience if / when I finally do find some time to promote it.