Hey y’all~! ^,,^
Hope everyone had a fantastic Halloween, and October overall! As always, I was kept plenty busy~ I kept-up with my work on Pokéstudy for Radioactive Magic (some new videos out there!), I spoke to PCPowerPlay about NieR:Cogito (little spotlight coming out later this year!), and made a little future progress with some side-projects (which won’t come up for a while but hey, nothing like keeping hyper busy haha~).
Inflorescent Games also spoke with PCPowerPlay about our up-coming game UfoTofU:Hex, and everyone is working hard towards that goal! While I was brought into the co-operative a little bit later, and as such am not as heavily involved in the dev-side of this project, we are all contributing and pushing to get this game out later this year, so I’ll keep everyone posted on that as we get closer!
On my solo end, I’ve continued to work hard on roll, both with content and optimisations. I also spoke further with our musician (Duncan Latto, the composer behind Cogito, is returning to work with me on this project!) about some very interesting concepts approaching the musical side behind roll. There’s a music-idea I’ve long had and wanted to try and implement into a game, and between my improved skills and Duncan’s talents, I believe I can finally pull it off, though of-course for now it shall remain a secret~ However I’d still like to talk more about some of the specific progress and updates I have made!
- World Generation: roll is a game about endless exploration, where a world is built around the player based upon a seed-generation system. I actually wrote the seed functions myself from scratch, as I found both the in-built Unity seed functions and the seed functions talked about online were either not up to the specific level of control I was seeking, or could not guarantee a permanent reliability across devices and updates. However today I will not be going into the seed funcs, but instead the world generation specifically. As I’ve said previously, building for mobile comes with a plethora of optimisation issues that I have never had to manage before, and one of these is the spawning (instantiation, cloning) of objects.
Every time you spawn in an object, whether cloning a current object or generating an object from a stored prefab, the game has to power through a lot of little functions to get that object up-and-running. Even completely empty objects still require positional and hierarchical data. On computers, this isn’t as much of an issue (though is still one to consider), but on mobile devices these little functions can stack-up. In the case of roll, every ‘Tile’ of the game that is spawned in is a copy of the respective ‘Master Tile’, which contains all the objects of that tile from the walls to the item spawners. Now, previously, I had set-up a system to stagger the activation of these objects; walls would all spawn inactive and be activated one-after-the-other which would set then physics data (something I spoke about last post), and each item spawner would tell the game to prepare an item to be spawned in when able. However, I realised this month that the initial spawning of the wall objects, and even the blank item spawners themselves, were resulting in countless little functions to stack-up and occasionally causing little processing spikes!
So, how’d I fix this? Well, I was already optimising all the game’s co-routines (little looping functions that run adjacent to the game’s processing) so I decided to rewrite tile generation. While the game is running it’s initial load, it now creates a skeletal copy of each ‘Master Tile’ that converts all the objects to stored data. Every wall, item spawner, and maybe a few other little things all get saved to these skeletal copies called ‘Blank Tiles’ as minimalist variables and their original objects deleted, while complex objects remain (for now). When the game runs and needs to render the world, it instead makes a copy of the ‘Blank Tile’ and checks the stored data, and then slowly runs through the data over time spawning in these objects before the player even arrives. Overall, the game still has to run roughly the same amount of processing, but it’s spread across multiple ticks while the player is still far away, as opposed to spiking on a single frame and potentially lagging the game! This isn’t a new idea by any means, it was a concept I was well aware of previously, but I am glad I have been able to rebuild that concept myself within my own skills, and that it helps the game run just that little bit better.
- Story, Collectibles, and UI: When I first started working on roll many months ago, the idea was very intentionally simple; “Make a game, ball go roll.” That’s it, quick turn-around, nothing fancy. I mentioned last post that I have since decided to expand the production of roll slightly, and while some of this culminates in better mechanics and finer visuals, a lot of that expansion comes in the form of content. roll was always meant to be a zen and meditative game, you are meant to feel calm while playing it, with the only possible stress coming from wall that follows you, and even then resetting isn’t meant to feel painful, just a new beginning. But I digress…
Something that I was not expecting to include in this project was lore. It’s a game about a rolling through a maze, where is the story there? But the more I explored the meditative side, the idea of the calm and zen engagement with the players, the more a story evolved alongside. An ethereal, almost spiritual, world began to grow. In-game collectibles weren’t just for buying upgrades now, but for unlocking stories and secrets. Special Tiles have been designed to give the players a break to stop and appreciate the world, and even learn something about it. I won’t go into depth here about the story, spoilers and all~, but I will discuss some little technical work that came-about because of this.
The game now contains a collectible called ‘Petals’ which unlock story cards throughout the game. I needed a way to represent the collection of these ‘Petals’ and the progress the player has made to the next unlock, while also both sticking to the game’s aesthetic and making something that is as optimised as possible to run on mobile. I settled with the design of a minimalist floral decorative growing as the player collected more, but there existed a pretty big issue; how?! I could render a line, but that might be frustrating trying to set-up a fancy vector formula, and making changes in the future would be annoying. I could animate it across multiple frames, but with a progress bar of 0 to 100 percent would require about 100 images at UI quality…
Previously for Cogito I had been studying ShaderGraph, a Unity function in HDR projects that allow you to build your own shader rendering functions with ease (or just… easier than it used to be hahaha, it still requires a fair bit of thought). In that game, I wrote a custom shader that drew the background transition between the console screen and the game screen that was done with a transition image, calculating the colour value from Black (0) to White (1) and animating through those values to simulate a full animation from a single image! I took the same concept I had built previously and rebuilt it here; as the player collects ‘Petals’, the game transitions through the image according to the player’s progress, giving the illusion of the vine growing. In addition, I also added a second image, the leaves, at interval stages (10%, 20%…) to add both a visual aide and a more attractive aesthetic. This is instead of having a dozen or so leaf objects that all need to individually render. In total, there are 4 images stored and 2 shaders running, and even then only at a low framerate to save that little bit more on processing~
Fun little side note which is evident in the screenshot; the UI display will always render on the side opposite to where the player is touching (you can see the joystick on the right and the ‘Petal’ and ‘Shard’ UI on the left). I wrote the joystick myself, and it allows the player to touch anywhere on the screen to control the direction of the roll. To prevent the player’s own interaction from blocking UI information, the UI transitions to the side opposite of the joystick. Just a small ease-of-life mechanic that no-one will probably ever notice, but will make a world of difference to the overall experience.
Anyways, that’s my little update! I like these little sections where I can talk about some of my work in high-detail! I don’t think I’ll be doing it consistently, but if there’s something I can talk about without giving away spoilers, and that gives a fun little dive into my game-dev processes, I think I might keep this up sometimes~
That’s me for the month, time to go back to my massive to-do list hahaha… I want take a moment to thank everyone for their continued support of my work and projects over the months, even years. I know I went through a long period of still trying to find my feet when I returned to game-dev, and as such I have a handful of projects on the shelf (though I swear upon my duty that many will return), but between everyone’s wonderful reception to my continued work and generally their supportive messages and kindness, I feel I am making actual progress and that one-day I can support myself entirely with this work. I hope I can continue to dedicate my life to telling the world stories and entertaining everyone~!
Till next time all the best, and remember to be kind and supportive to one-another, that Black and Asian lives still matter, that trans people are people, and to get vaxxed!