{"id":591,"date":"2025-05-15T02:54:28","date_gmt":"2025-05-15T01:54:28","guid":{"rendered":"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/?p=591"},"modified":"2025-05-15T03:31:13","modified_gmt":"2025-05-15T02:31:13","slug":"bsc3b-global-game-jam-2025-bubbles","status":"publish","type":"post","link":"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/2025\/05\/15\/bsc3b-global-game-jam-2025-bubbles\/","title":{"rendered":"BSc3b &#8211; Global Game Jam 2025 &#8216;Bubbles&#8217;"},"content":{"rendered":"\n<p>These are more like a splurt of all my thoughts during and after briefing.<\/p>\n\n\n\n<p>The theme: Bubbles.<\/p>\n\n\n\n<p>Bubbles is a pretty open to interpretation theme.<\/p>\n\n\n\n<p>An often-used metaphor is \u2018living in a bubble\u2019 meaning to live in your own world isolated from what is happening around. Tying into themes around separation of thoughts and ideas from reality.<\/p>\n\n\n\n<p>Financial bubbles, or economic \/ asset bubbles, are cycles characterized by rapidly increasing prices of an asset to a point that is unsustainable, causing the asset to burst or contact in value. Financial bubbles follow five stages: displacement, boom, euphoria, profit taking and bust. [ I think this is a curious branch of where the theme can go getting into very literal terms, though it&#8217;ll be harder to translate into a game idea that&#8217;s obvious to the player how bubbles come in].<\/p>\n\n\n\n<p>Bubbles go through a process of transformation from being cast to vanishing in an instant.<\/p>\n\n\n\n<p>They\u2019re delicate, the slightest damage to their surface tension shatters it,<\/p>\n\n\n\n<p>One unique interaction I like is how they can freeze, in cold temperatures their surface crystalises which can form beautiful patterns especially when captured in slow motion.<\/p>\n\n\n\n<p>Bubbles can often be found underwater as \u2018pockets of air\u2019 and in underwater games is often used as a pickup to restore oxygen like in Ty the Tasmanian tiger(2002).<\/p>\n\n\n\n<p>One unique critter that uses bubbles is \u2018The diving bell spider\u2019 which creates an underwater bubble to store oxygen and live underwater with the bubble acting as a form of \u2018gill\u2019, arachnophobes will HATE this though which cuts off a good portion of the audience unlesss it&#8217;s a visually really cute spider like jumping spiders.<\/p>\n\n\n\n<p>I find bubbles are frequently used as a theme for safety, they\u2019re an isolator separating the contents within from the outside word, in video games and movies they\u2019re often the shape of shields meant to protect the caster and their allies in proximity such as dome shields in Halo, Frost\u2019s bubble in Warframe, Titan\u2019s bubble in Destiny 2.<\/p>\n\n\n\n<p>(Halo promotion \u2013 dome shield repelling mortar assault)<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"555\" height=\"416\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image.jpeg\" alt=\"\" class=\"wp-image-592\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image.jpeg 555w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-300x225.jpeg 300w\" sizes=\"auto, (max-width: 555px) 100vw, 555px\" \/><\/figure>\n\n\n\n<p>(Waframe, frost bubble)<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"577\" height=\"325\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-1.jpeg\" alt=\"\" class=\"wp-image-593\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-1.jpeg 577w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-1-300x169.jpeg 300w\" sizes=\"auto, (max-width: 577px) 100vw, 577px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"601\" height=\"339\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-2.jpeg\" alt=\"\" class=\"wp-image-594\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-2.jpeg 601w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-2-300x169.jpeg 300w\" sizes=\"auto, (max-width: 601px) 100vw, 601px\" \/><\/figure>\n\n\n\n<p>A frequent bubble theme as well is dome-barriers over cities, In Marvel Avengers: Infinity War we see a dome shield over Wakanda which slowed down an assault from Thanos\u2019 army, in Borderlands 2 we see our only safe location Sanctuary protected by a dome shield which repelled orbital assaults from the Hyperion space station (our early campaign goals revolve around securing batteries for it, and later fails due to a compromised battery opening the city to attack).<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"310\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image.png\" alt=\"\" class=\"wp-image-595\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image.png 602w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-300x154.png 300w\" sizes=\"auto, (max-width: 602px) 100vw, 602px\" \/><\/figure>\n\n\n\n<p>There\u2019s themes of corruption contained in bubbles in a few games too, such as the void in Risk of Rain 2 which holds dangerous enemies from the void, void mites which latch onto normal enemies and corrupts them, and standing with a void bubble damages you with exponential scaling.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"602\" height=\"252\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-4.jpeg\" alt=\"\" class=\"wp-image-596\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-4.jpeg 602w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-4-300x126.jpeg 300w\" sizes=\"auto, (max-width: 602px) 100vw, 602px\" \/><\/figure>\n\n\n\n<p>In Zenless Zone Zero we see \u2018bubbles\u2019 as supernatural disasters called \u2018Hollows\u2019 which are dark disordered dimensions which appear out of thin air swallowing the physical world, contents are subjected to dark ether corruption. In the game world we get to see an interpretation of how society adapts a threat such as hollows.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"277\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-1.png\" alt=\"\" class=\"wp-image-599\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-1.png 500w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-1-300x166.png 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"550\" height=\"275\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-3.jpeg\" alt=\"\" class=\"wp-image-597\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-3.jpeg 550w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-3-300x150.jpeg 300w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/figure>\n\n\n\n<p>I\u2019m personally a really really big fan of the corrupt bubble dimensions, I like the premise of briefly entering dangerous areas for brief exploration almost like hardmode underwater (maybe I just love hazardous environments).<\/p>\n\n\n\n<p>I quite like the sound of exploring corrupt bubble dimensions,<\/p>\n\n\n\n<p>We need to think about a style of gameplay that will fit the theme\/setting that we set out,<\/p>\n\n\n\n<p>I just watched Loki season 1 and love the idea of using late 90s \/ early 2000s theme, I really like retro themes and it was a favourite that the team seemed to be a fan of as well.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"367\" height=\"220\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-5.jpeg\" alt=\"\" class=\"wp-image-598\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-5.jpeg 367w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-5-300x180.jpeg 300w\" sizes=\"auto, (max-width: 367px) 100vw, 367px\" \/><\/figure>\n\n\n\n<p>Bearing in mind diversifiers:<\/p>\n\n\n\n<p>Audio \u2013 Soundscape, create an immersive atmosphere through use of ambient sounds rather than music. I love the idea of this, it creates a much more believable world.<\/p>\n\n\n\n<p>Code \u2013 Ingested: story evolves based on real-world data feeds creating a unique experience that changes with current events. We can replicate a table of data to feed into our gameplay loop, depending on what setting we go off of. The game could parody recent events like Trump parading about banning tiktok 4 years ago and now being thanked for unbanning it.<\/p>\n\n\n\n<p>Design \u2013 Heading Cats: Controlling 5 characters \u2013 could be a real time strategy game, right click to highlight\/control an npc and command them to clean up an area. They have to be monitored and maintained to keep them alive and serve functions in the game world.<\/p>\n\n\n\n<p>Design &#8211; Liminal space: Game is set in some kind of eerie empty space, like an abandoned mall or vacant hotel. I LOVE the idea of going into abandoned areas which could be desolate and horrifying, and scattered throughout could be these safety bubbles, which could be glimpses into the past full of colour and life. The bubbles are only temporary and vanish after staying inside for a few moments. This could work well as a horror game.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>I had the idea of having the player explore an abandoned mall that has since corrupted, they can&#8217;t stand in the corruption for too long due to either being hunted by a monster or simply succumbing to corruption, bubbles throughout the mall provide safety for the player by repelling corruption. The bubbles are gaps in spacetime where its contents are actually glimpses of their past versions completely undecayed and functioning &#8211; the goal is for the player to find a series of monitor displaying part a number sequence they need to input to a final door so they can escape.<\/p>\n\n\n\n<p>The idea took a lot of changes when it came to talking about it with the team I joined, they liked my idea but after a lot of discussion ideas got mixed up as to what we were committing to<\/p>\n\n\n\n<p>We put it to a vote if we&#8217;ll have an underwater or corrupted theme<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"526\" height=\"270\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-2.png\" alt=\"\" class=\"wp-image-600\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-2.png 526w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-2-300x154.png 300w\" sizes=\"auto, (max-width: 526px) 100vw, 526px\" \/><\/figure>\n\n\n\n<p>The team opted for a concept where we&#8217;re navigating through the euro tunnel, except it&#8217;s flooded to due a section collapsing.<\/p>\n\n\n\n<p>We had an idea of what we all needed to work on and what was needed.<br>For dev, I was in charge of making bubble mechanic, swimming and changing states when entering bubbles and later working on a key-pad mechanic while the other indie dev worked on making a moving train system.<\/p>\n\n\n\n<p>For bubbles, I needed to figure out a way to make it so that anything within the bubble would change appearance to a fixed &#8216;past&#8217; version of itself. I&#8217;m still new to making advanced materials like this where they need to change what is rendered based on other actors or parameters.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"894\" height=\"479\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-3.png\" alt=\"\" class=\"wp-image-601\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-3.png 894w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-3-300x161.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-3-768x411.png 768w\" sizes=\"auto, (max-width: 894px) 100vw, 894px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"505\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-4-1024x505.png\" alt=\"\" class=\"wp-image-602\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-4-1024x505.png 1024w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-4-300x148.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-4-768x379.png 768w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-4.png 1218w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"445\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-5-1024x445.png\" alt=\"\" class=\"wp-image-603\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-5-1024x445.png 1024w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-5-300x130.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-5-768x333.png 768w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-5.png 1239w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Day 2:<\/p>\n\n\n\n<p>Indie dev requested I make a flashing lights puzzles where lights flash in an order which you have to repeat through a set of buttons so they see them flash in the present and have to repeat them in the past.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"222\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-6-1024x222.png\" alt=\"\" class=\"wp-image-604\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-6-1024x222.png 1024w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-6-300x65.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-6-768x167.png 768w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-6.png 1231w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"720\" style=\"aspect-ratio: 1280 \/ 720;\" width=\"1280\" controls src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/Unreal_Engine_5_2025.01.22_-_21.36.10.04-Trim2.mp4\"><\/video><\/figure>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"720\" style=\"aspect-ratio: 1280 \/ 720;\" width=\"1280\" controls src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/Unreal_Engine_5_2025.01.22_-_21.51.59.05-Trim.mp4\"><\/video><\/figure>\n\n\n\n<p>I tweaked the bubble to expand and contract smoothly to make it look a lot cleaner to the player, seeing it gradually expand and contract means the player can see all items enveloped gradually change.<\/p>\n\n\n\n<p>Day 3:<\/p>\n\n\n\n<p>Indie finished work on the underwater material, flashlight and oxygen meter. I had to work on making the player swim underwater, toggle to walking in bubbles, replenish oxygen in bubbles and apply the material outside bubbles.<\/p>\n\n\n\n<p>I used &#8216;flying&#8217; as the swimming mode as if the entire level is underwater then they&#8217;ll always be underwater unless in bubbles, a cheap way to quickly implement it.<\/p>\n\n\n\n<p>For toggle between the modes, I initially set it up so that the player toggles modes when they collide with the bubble though I noticed it was a little jarring since their head would still be poking out of the bubble when the water filter is removed and oxygen replenished. <\/p>\n\n\n\n<p>I wanted the underwater visual to be removed and oxygen restored only when the player head is not underwater, the solution I found was to check if the player&#8217;s camera was overlapping with a bubble instead.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"282\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-7-1024x282.png\" alt=\"\" class=\"wp-image-608\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-7-1024x282.png 1024w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-7-300x83.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-7-768x212.png 768w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-7-1536x423.png 1536w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-7-1568x432.png 1568w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-7.png 1912w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Looking back at this code, there technically should be a loop to check if any overlapping actors are a bubble and if not then resume decreasing oxygen etc.<\/p>\n\n\n\n<p>I was really happy with how this effect turned out.<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"720\" style=\"aspect-ratio: 1280 \/ 720;\" width=\"1280\" controls src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/Unreal_Engine_5_2025.01.23_-_16.21.42.02-Trim.mp4\"><\/video><\/figure>\n\n\n\n<p>Another element needed was the sequence puzzle. I had a plan to create a blueprint each for button, keypad and light. Keypad would be the &#8216;manager&#8217; for the buttons and lights, each would be given a &#8216;setID&#8217; integer so the manager can find all buttons and lights in run-time and store them in an array.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"740\" height=\"916\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-22.png\" alt=\"\" class=\"wp-image-628\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-22.png 740w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-22-242x300.png 242w\" sizes=\"auto, (max-width: 740px) 100vw, 740px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"991\" height=\"219\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-13.png\" alt=\"\" class=\"wp-image-615\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-13.png 991w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-13-300x66.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-13-768x170.png 768w\" sizes=\"auto, (max-width: 991px) 100vw, 991px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"488\" height=\"288\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-14.png\" alt=\"\" class=\"wp-image-616\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-14.png 488w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-14-300x177.png 300w\" sizes=\"auto, (max-width: 488px) 100vw, 488px\" \/><\/figure>\n\n\n\n<p>The manager has an integer array for the answer sequence and the input sequence, on a timer it would &#8216;pulse&#8217; the lights by finding the correct light actor in the array for the sequence and trigger its pulse with its own delay based on it&#8217;s array index.<\/p>\n\n\n\n<p>The lights and buttons have an instance editable float &#8216;number&#8217; which will be the number used for sequence input\/output. The manager will pulse the lights based on their number given, and button will feed the number float to the keypad for the &#8216;input sequence&#8217; array. When the input sequence is updated, it&#8217;ll update its display text, check if the input sequence index is correct, if not it&#8217;ll reset the sequence but if true it&#8217;ll check if the input and answer arrays are equal length to determine if the puzzle is done or not.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"295\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-15-1024x295.png\" alt=\"\" class=\"wp-image-617\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-15-1024x295.png 1024w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-15-300x86.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-15-768x221.png 768w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-15.png 1074w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>In hindsight for the lights pulse function, I think it would have been wiser to set up the lights-array to contain the lights in numerical order rather than have a for loop each loop within a for each loop. The original solution was because i was using &#8216;get all actors of class&#8217; with a SetID check to populate the array which doesn&#8217;t guarantee that the lights within the array will be in the same order as their set numbers. <\/p>\n\n\n\n<p>Why not manually set up a reference to each light for the manager? Indie dev wanted it to be scalable so they could add any number of lights\/buttons, with the &#8216;get all actors&#8217; and add to array method I used, they could create a sequence as long as their heart desired (though the text would appear off). <\/p>\n\n\n\n<p>One highly-silly error I also ran into was the keypad only seemed to work a third of the time which confused me for a long while of testing, it took me too long to realise I had already placed another keypad manager with the same set-id which conflicted with this one. The solution I could add in future is to check beforehand if there are any other keypads with the same setID number, and relay a message to the dev warning them about the error at hand.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"810\" height=\"530\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-12.png\" alt=\"\" class=\"wp-image-614\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-12.png 810w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-12-300x196.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-12-768x503.png 768w\" sizes=\"auto, (max-width: 810px) 100vw, 810px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"488\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-11-1024x488.png\" alt=\"\" class=\"wp-image-613\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-11-1024x488.png 1024w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-11-300x143.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-11-768x366.png 768w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-11.png 1205w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>I gave them a distinct colour and a glow to help the numbers stand out, especially helpful if there are any dark areas in the tunnel. <\/p>\n\n\n\n<p>Back onto the bubble, I wasn&#8217;t quite satisfied with how the bubble affected the past\/present look of items. I made a graphic to illustrate the problem and the solution i was looking for.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"817\" height=\"652\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-8.png\" alt=\"\" class=\"wp-image-610\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-8.png 817w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-8-300x239.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-8-768x613.png 768w\" sizes=\"auto, (max-width: 817px) 100vw, 817px\" \/><\/figure>\n\n\n\n<p>Overlapping actors are changed to their past(yellow) states rather than only the set areas.<\/p>\n\n\n\n<p>After a while of trial and error looking online, I found a solution through sphere masks and a reference to the bubble actor.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"775\" height=\"443\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-9.png\" alt=\"\" class=\"wp-image-611\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-9.png 775w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-9-300x171.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-9-768x439.png 768w\" sizes=\"auto, (max-width: 775px) 100vw, 775px\" \/><\/figure>\n\n\n\n<p>This solution was exactly what I was looking for, though it&#8217;s only a solution for just the material rather than mesh so far, I still think it has more than enough effect for the jam, on top of that having 2 meshes per actor was not viable for the 5 day jam as well.<\/p>\n\n\n\n<p>ONE PROBLEM HOWEVER, is that we were planning on having multiple bubbles which are pre-placed throughout the level which doesn&#8217;t work with this bubble material.<br>[Future note, the indie dev didn&#8217;t even end up pre-placing any bubbles meaning I could have used this material in the end which I&#8217;m mildly gutted about].<\/p>\n\n\n\n<p>This material worked by using a &#8216;dissolve area&#8217; method, taking the location of the bubble, its own location and a sphere mask to lerp between two materials (past and present).<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"609\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-10-1024x609.png\" alt=\"\" class=\"wp-image-612\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-10-1024x609.png 1024w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-10-300x178.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-10-768x456.png 768w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-10.png 1139w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Using material instances, we could have set up a past and present state for every object in the game (this could have potentially been horrific for performance, I don&#8217;t understand materials too well but I see a lot of math being used solely for the visual part and if it&#8217;s on every material and ran every tick I imagine it&#8217;ll be a lot).<\/p>\n\n\n\n<p>Due to the plan of having multiple bubbles, I put this solution aside and attempted to look further into how to set it up with multiple bubbles but I couldn&#8217;t figure out a way in the end so I went back to the old over-lap method.<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"720\" style=\"aspect-ratio: 1280 \/ 720;\" width=\"1280\" controls src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/Unreal_Engine_5_2025.01.23_-_17.05.11.09-Trim.mp4\"><\/video><\/figure>\n\n\n\n<p>Finally, one of the last bits I needed to prepare was bubbles triggering past-states with the puzzles. I simply only needed to add the &#8216;past&#8217; BPI so the bubbles could trigger a function on the puzzle actors, which in this case can just toggle visibility on the lights, pauses the manager&#8217;s timers and stops the player from interacting with the buttons.<\/p>\n\n\n\n<p>On the night before the showcase, the indie dev opted to stay up all night to sort out the level before preparing the project, I gave him instructions on how to set up decorations to use with the bubble and how to set up the keypads.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"909\" height=\"755\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-17.png\" alt=\"\" class=\"wp-image-621\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-17.png 909w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-17-300x249.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-17-768x638.png 768w\" sizes=\"auto, (max-width: 909px) 100vw, 909px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"320\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-18-1024x320.png\" alt=\"\" class=\"wp-image-622\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-18-1024x320.png 1024w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-18-300x94.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-18-768x240.png 768w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-18.png 1207w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>In the morning when i woke, the dev found issues where bubbles werent spawning in the tunels. <br>I didn&#8217;t understand the blueprints he had used at the time which were splines, after a while of digging around I found the issue was the spline mesh components had a collision present that did not collide with linetraces so they needed a different setting.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"830\" height=\"661\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-16.png\" alt=\"\" class=\"wp-image-620\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-16.png 830w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-16-300x239.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-16-768x612.png 768w\" sizes=\"auto, (max-width: 830px) 100vw, 830px\" \/><\/figure>\n\n\n\n<p>ben has requested for me to work on the oxygen mechanic. Oxygen decreases overtime as the player while the player is underwater. Currently it was set up to run off a branch running off of a tick event, then update oxygen in the UI, then another branch to test if oxygen was equal to or lower than 0. 2 branches being tested per frame is NOT recommended and should be on a looping function that occurs on a short interval like a second or half second. We can eliminate the need to test IF the player is underwater altogether by clearing the function timer when they\u2019re not underwater and starting it again when they re-enter the water.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"940\" height=\"327\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-23.png\" alt=\"\" class=\"wp-image-629\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-23.png 940w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-23-300x104.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-23-768x267.png 768w\" sizes=\"auto, (max-width: 940px) 100vw, 940px\" \/><\/figure>\n\n\n\n<p>Another part I wanted to tidy up was UI being coded on the player blueprint, I instead set the gas tank, oxygen meter and O2 UI to have a visibility binding with the same function &#8211; I tried grouping them together under the same parent and setting the visibility on that instead but it broke their UI position and scale too much with not enough time to solve it.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"940\" height=\"484\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-19.png\" alt=\"\" class=\"wp-image-625\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-19.png 940w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-19-300x154.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-19-768x395.png 768w\" sizes=\"auto, (max-width: 940px) 100vw, 940px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"940\" height=\"260\" src=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-20.png\" alt=\"\" class=\"wp-image-626\" srcset=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-20.png 940w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-20-300x83.png 300w, https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-content\/uploads\/2025\/05\/image-20-768x212.png 768w\" sizes=\"auto, (max-width: 940px) 100vw, 940px\" \/><\/figure>\n\n\n\n<p>Bit of work was spent just tidying up bens code, like a lot of the UI changes were hard coded by the player blueprint, I\u2019ve updated the UI to use bindings such as oxygen\/maxoxygen for progress bar and a select with bool for oxygen tank visibility when the player head is underwater or not<\/p>\n\n\n\n<p>While he recorded a video, I used my better PC to cook and build the project.<\/p>\n\n\n\n<p>All in all, it went okay for a jam with 2 devs. I do feel like we had some gaps in communication and split ideas on what we wanted in the game or how we wanted things set up but that feels pretty typical in these short sprints.<\/p>\n\n\n\n<p>I feel pretty good about the work I managed to put in even though I spent a good portion of my time struggling to find a solution for the bubble masking, still though I found a good solution in the end. I was also happy with how I set up the numberpad system.<\/p>\n\n\n\n<p>I don&#8217;t think the tunnel level worked out as well as we&#8217;d hoped, it was a mildly limited environment to create any form of puzzle out of especially one underwater that you can swim around &#8211; I&#8217;m still quite attached to my original idea of the corrupted mall and I would love to re-approach it someday.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>These are more like a splurt of all my thoughts during and after briefing. The theme: Bubbles. Bubbles is a pretty open to interpretation theme. An often-used metaphor is \u2018living in a bubble\u2019 meaning to live in your own world isolated from what is happening around. Tying into themes around separation of thoughts and ideas&hellip; <a class=\"more-link\" href=\"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/2025\/05\/15\/bsc3b-global-game-jam-2025-bubbles\/\">Continue reading <span class=\"screen-reader-text\">BSc3b &#8211; Global Game Jam 2025 &#8216;Bubbles&#8217;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-591","post","type-post","status-publish","format-standard","hentry","category-uncategorised","entry"],"_links":{"self":[{"href":"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/posts\/591","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/comments?post=591"}],"version-history":[{"count":5,"href":"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/posts\/591\/revisions"}],"predecessor-version":[{"id":631,"href":"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/posts\/591\/revisions\/631"}],"wp:attachment":[{"href":"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/media?parent=591"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/categories?post=591"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lloydmills.nuacomputerscience.co.uk\/blog\/wp-json\/wp\/v2\/tags?post=591"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}