Pinball
A game about a table, a ball and flippers
A game about a table, a ball and flippers
I think this is going to be an interesting assignment for me to complete, because although this should be fun to make, so far, I have a very small idea of what proper pinball machines actually include. I believe I have all the skills and experience necessary to make a basic game of pinball, but I'll definitely have to do quite a bit of research into the various games that are available to influence my outcome. My initial thoughts are to continue the Minecraft-themed games by making a Minecraft pinball, but that may depend on whether I find better themes while doing my research.
Pinball machines are physical games that include a specific table full of mechanical pieces and a ball that gets thrown around, hitting certain markers. The player also has some flippers, which they control by pressing a button, which are used to move these flippers to hit the ball. This will then push it upwards as the players look for the ball to make contact with the bumpers and ramps, which increases the overall score of each run. Although getting the highest score by hitting targets is the main objective, the player also has to do this by trying to keep the ball from leaving the table through the drain. Most of the time, it's relatively easy; however, if you're unlucky, it'll go between the two flippers at the bottom. As the player, you must try to avoid this, since you only have 3 balls per game. With those three balls, the player must try to score the most amount of points by hitting certain things. Every pinball machine is different with regard to themes and features, but overall, the basic mechanics are all the same.
The first pinball game dates all the way back to 1931, called Bingo. Bingo Novelty Company released it, and they contracted David Gottlieb & Company to make it, which was their first of many pinball machines. However, there were some games with similar gameplay mechanics before this, such as Bagatelle, by Montague Redgrave. After some relative success, manufacturers quickly moved to create better pinball machines. Ballyhoo was created and was an instant hit, commonly referred to as the game sensation of 1932.
Original Pinball like game, "Bagatelle"
First Pinball Game, "Bingo"
First Coin-Operated Game, "Ballyhoo"
Now, although we see these games as "pinball", this term wasn't actually used until 1936, which was after a very important game mechanic was created. That mechanic was called the tilt, and it was a way to stop players from cheating by lifting and shaking the machine to get the ball to move to specific places. In 1962, the first Pinball game to include a drop target was created, and it was called Vagabond. This was important since it gave creators something new to add to their games, which would reward the more skilled players for hitting them. It's also useful for adding more content to the story games, since this effect could be used in many different ways. In 1966, Rally Girl was released, and it was the first machine to have digital scoring. Although this sounds quite impressive, it was only the beginning of tracking scores, and machines would improve from this massively in the future. From what I've found, the first machine with a video screen was Williams' Pinball 2000 Series, and it appears to be this Star Wars machine; however, I am not completely sure. Nonetheless, this was one of the company's last machines, but it was certainly one to remember and take inspiration from.
First Game with Drop Targets, "Vagabond"
First Digital Scoring, "Rally Girl"
First (?) Game with Video Screen, "Pinball 2000 Series"
Nowadays, these machines seen below are more what you'd expect from pinball machines seen in casinos or pubs. On the Pinball Database website, the OXO machine is currently rated as the number one machine of the Electro-Mechanical Game Era. These were machines that relied on electromechanical components like motors and scoring wheels. In a way, this is more impressive to gaze upon the interesting architecture within, but it's outdated now due to the rise of Solid-State Games. These SS machines have computer software controlling the electronics, such as integrated circuits and microcontrollers, which are a lot more sophisticated and harder to break. Again, on the Pinball Database website, the Twilight Zone game is rated number one under SS machines, and looks a lot like basically any pinball machine that you'll find nowadays, even considering it was made in 1993. Today, most of the machines, such as this Jaws one, all have a very similar look, apart from the obvious theme and art differences.
Rated #1 EM Machine, "OXO"
Rated #1 SS Machine, "Twilight Zone"
One of the Latest Machines Made, "Jaws 50th Anniversary"
Inside of Vagabond
Under Playfield of Twilight Zone
Here, we have the inside of two different pinball machines. Regarding their creation, there's a significant time gap, and I think it's obvious since the mechanics of them appear different. Additionally, the Vagabond is an EM game, whereas the Twilight Zone is an SS game, which clearly would affect the inside contents of the pinball machine.
One of the most clear things to me is that the Twilight Zone machine only appears to have the mechanics under the playfield of the machine. However, older EM games appear to have everything spaced out also on the bottom of the inside. Although this may not be like it for every SS game, in this case, there is a significantly smaller amount of space used.
Additionally, the varying use of technology is clear here. There may be some similar-looking pieces of technology, but if you take a while to look and compare, you'll notice that nothing is really the same, which is interesting and shows how much we've evolved technology. However, I am not very knowledgeable within this sector, so everything could be more similar than I think.
In my pinball machine game, I want to consider designing the inside of the table. Now, I probably won't do it, since it seems like it's just a load of unnecessary models, but it would be a cool idea to model, texture and give the player a way to look into the inside of the machine. Again, though, I am not knowledgeable, so it most likely wouldn't be right or have anywhere near enough, so I'll stick to the bare-bones, basic game.
In the old pinball game for Windows (Space Cadet), missions were a thing. Now, from my research, it seems that these are usually referred to as modes and goals, but that's basically a "mission". In Space Cadet, there were the basic missions where you had to hit certain targets or enter a specific area, but they went a lot further than just hit this and that. There were a few different modes, all of which had multiple goals that you had to reach. For example, you will have to hit something a certain number of times, as well as pass by a lane a certain number of times, and more.
To give some more examples, you have the more common modes in pinball machine games such as Hurry Up, Multiball and Combos. Hurry Up requires the player to hit one or more shots within a certain timeframe. Multiball drops in more balls to the play area, which the player can use to get more score - this is usually 3 balls in most modern games of pinball. Finally, Combos mean that the player must hit a certain number of shots in a particular order to progress through the level. All of these more "common" modes may sound quite basic and easy, but if you're someone who is trying to 100% the game in one run, it's going to be significantly more difficult the more content there is. Therefore, I think for the average player, it's a nice alternative compared to just aiming for the best score, but for some, it means a lot more.
Diving a bit more into strategy for the games, you can always find YouTube videos online for a lot of them, but there are also websites. As far as I can tell from my research, there is a large selection of pinball machines that you can be given to play in pro games. Therefore, learning at least some basic skills that are transferable across multiple areas is quite helpful. For example, something that is well known is that any light that you can see probably means it's worth a decent amount. Another is that you should always at least try to find out how to activate multiball on a machine before you play. That is one of the best ways to get a higher score, and therefore should be your main objective, especially since most other things can be found out while you play. Overall, these different objectives you can activate while playing give you a large amount of score, so if you know what you're doing and want more score, you should focus on trying to complete them.
Old Windows Pinball Game - Space Cadet
YouTube Video Thumbnail, How to Play Jaws Pinball
There are many reasons pinball is still so popular to this day. From nostalgia for older players to a great community sharing ideas and experiences, there are many ways that pinball games still thrive and succeed in today's world.
Diving a little deeper into the reasons they're still so popular, you'll realise how far they've come in development. They're no longer extremely basic machines with limited technology included; they're a hybrid between arcade and console gaming. I think one of the most impressive features is actually how they can connect to the internet to get real-time leaderboard updates and give valuable debugging information to the owner. Aside from this, they, of course, have very nice animated screens, which is a great step up from the static backgrounds, and allows for more info to be relayed to the player. Not only this, but you can also use your phone to connect to them, giving you even more possibilities, and with that, there's even more unique tech that designers will try to implement, like voice control and more. It may sound a bit over the top, but this is what gives the pinball machines a meaning and a reason to keep going back and buying new ones, especially for arcades.
I think one of the most important factors contributing to the continued popularity of anything is competitive tournaments. Within the pinball community, this leads to physical games still being bought and played all the time, but also a growing interest in digital games like Pinball FX on Steam, which are a lot easier to play on the go for practice.
For my pinball machine, I thought I'd go for a Minecraft theme again, keeping with the original theme that I used for the clicker game project in my first year, which I think went well. Going off of that project, there are a few things I already know that I want to try and improve upon. One of these is the sound design. In my clicker game, it was basically silent if you muted the background music. The majority of interactions had no sound effects added; the actual clicking and earning money had nothing, so in that way, it was a very barebones, basic game. Because the theme is Minecraft, luckily, I don't have to do much or any sound design, since I can just get the sounds used in the main game, just like how I got the music. Additionally, I will be using the regular Minecraft assets again, but I may consider using the Minecraft Dungeons and Legends stuff if I can find some kind of assets, since I think they would fit the pinball machine idea a bit better. Nevertheless, I'm going to have a look around for some references, since there seems to be a mini Minecraft pinball machine in real life, but it doesn't look that great. Other than that, it seems that the only other ones are ones that people have made inside of Minecraft, so I'll research more into that for ideas. Due to there being a limited amount to reference, I think I'll have one or two separate pinball machines that I'll use for the base idea, and alter the design to be Minecraft-related.
After doing a bit of research, I found that the only real-life pinball games inspired by Minecraft were these three small games. Although they look a little strange and are not exactly like what a normal pinball machine looks like, I'm only going to use some of the designs as reference, especially since there isn't much gameplay to be had, since they're just small, simple machines which do about as much as the first pinball machine ever made.
Minecraft Arcade Pinball - Mini Series
Minecraft Arcade Pinball Mini Series
Minecraft Arcade Pinball - Overworld - Premium Series
After the disappointment of there not being a good Minecraft pinball machine for real life, I decided it would be best to look around the rest of the internet to find any digital copies of a Minecraft-themed pinball machine. In my search for the real copies, I remembered seeing mostly stuff on pinball games being made inside of Minecraft; however, another thing I saw was games on itch.io. Therefore, I thought I'd check out some of the small games that people created.
The first game was called Mineball and was quite poor. I know I still have to make a game, but it's going to be difficult to make something worse than this. Straight away, there's basically no UI except a couple of buttons to start the game. As soon as you start the game, the apple (which is the ball) is dropped, and it seems like it's in low gravity. It's affected massively by the obstacles, bouncing around the screen suddenly. However, once it finally gets below the grass slopes at the bottom, you have your two sword flippers, which do as much as the walls. For some reason, you could do nothing and the apple would never touch the bottom, but it also hardly gets affected by the swords, so it's nearly impossible to get it out of the bottom area. I couldn't do it, but if you somehow got enough momentum, it must be possible. Unfortunately, this was all the game had to offer. Once you finally let the ball touch the floor at the bottom (where sometimes nothing would happen and you could continue playing), the game would end, and you could choose to restart or quit. The only idea I liked that the game had to offer was that swords were the flippers. Other than that, I'll probably just use this as a base game that I don't want to create. It sounds a bit harsh, but it's incredibly basic and was probably put together in an hour, if that.
After that somewhat failure, I went on a search and found another Minecraft-themed pinball game. This game is definitely an improvement from the last, but it still isn't great. The reason for this is that again, there is basically no UI, but at least this time, you do fire the ball, which is an ender pearl, instead of it dropping in from the same place every time. However, it would've probably been better dropping it in, since the first one just wastes your time since it moves amount 5 millimetres upward before just stopping and doing nothing, and I need to click out of the game and click back in it to do the next round. The second and third ball both get fired up, but it isn't guaranteed that it'll start, since it needs to move over to the left slightly, hit the redstone lamp, get knocked into the wall and then start bouncing around. If it misses the lamp, it'll fall and you'll lose the ball. I had one game where they all fell, and I didn't get a chance. Once you finally get going, what I realised is that you can just hold down the keys to move the flippers (which are D and K by the way), and they move at Mach 10 speed. I found that if I timed it right, I could have them both moving at the same time, meaning that it was basically impossible to lose, unless the ball went around and out of play. The other major bug I found was an infinite loop which would seemingly never end. The ball just had to bounce into the right spot, and it would get stuck. It bounced from the right lamp to the top, then the left lamp and the stair below, back to the left lamp, which hit it back over to the right, starting the loop again. After playing the game a few times, it was incredibly easy to do, and as far as I know, it could go on forever. Overall, this game is certainly more playable than the other, but again, it lacks gameplay, and you can just get stuck at certain points. The graphics are pretty terrible again, too, so another game I don't want to replicate.
After playing the two, and seemingly the only Minecraft pinball machines on itch that I could play in my browser (there was another, but I had to download and it looked trash again), I thought that I should look into some proper pinball games that I could play. One of the first games I found was Pinballpoly. Although it doesn't look the best, it's certainly the best to play thus far. For one, you can actually fire the ball into the level. Although it's just from the press of a key, it's still better than the other two and resembles pinball well. The flippers are a bit glitchy, and the ball gets a bit stuck on the colliders sometimes, but it still always works well enough, and there isn't any way of getting stuck as far as I know. As you can see, it does look like quite a basic game, but it has some unique features that I would like to include in my game. Firstly, there are the orangey squares which you can hit with your ball. I'm not 100% sure, but I believe that gives you a score, or in this game's case, money. It's quite simple, but I like the idea. Also, the game has these circles all over the floor, which you can go over to make a random colour. Again, something I don't really know what it does, but it's a cool feature. Unfortunately, I couldn't get the last grey one, which is towards the top, so I don't know if something happens, but it's a cool thing to include in my game, where I could put my own spin on things. Lastly, this game is meant to be played by two different people, since you have two separate amounts of money, and every time one player loses the ball, the other player gets to go. I don't quite understand how you win, since I had that really long game where I unlocked most of the circles, but then another, which only lasted a few rounds. It would've been nice to have an information/help screen so I knew what did what, but I still like the idea. I know that you can play 2-player and more on some pinball machines, so if I look into that a bit, I may understand it. Overall, this game was just a game for ideas, but even if I make something as simple as this, at least I know it'll be more enjoyable than the other games.
Mineball by EllieiHeart
Minecraft Pinball by dm390257
Pinballpoly by puzzud
After doing a good amount of research into roughly what I want the game to look like, I have some good ideas. One of the first things I need to do is get the actual model for the machine complete so I can start adding everything in. Once I have the machine up and working with very basic stuff, I can begin making it unique, creating the menus and everything else. I will, of course, be using 3DS Max for any 3D models and Substance Painter to texture. Photoshop will probably be used a fair amount, too, for any 2D artwork I may need, and Unity will be the program I use to put everything together. I will probably end up using the same website as before for any of the Minecraft stuff - McIcons by ccLeaf. I may also use Blockbench again for creating a Minecraft-themed title, as well as getting any models, because they have the game's models already made with textures, which would be very helpful to export if I want any of the game's mobs in 3D.
For the dimensions of the machine, I wanted to make sure it would be as realistic as possible. Because of this, I went online and found a website that gave me this very useful diagram of the average dimensions, as well as the angle of the slope, which is very helpful. I began by creating a cube primitive and giving it the parameters shown in the image, which seems to be the best compared to the dimensions guide.
Below both of these, I found a nice reference image of a pinball machine model that I will be using as a rough guide as to how it should look complete. Obviously, mine won't look quite as good, but it's a nice base image to base mine off of.
Pinball Machine Dimensions and Drawings
Starting Cube Primitive and Parameters
Pinball Machine Model Reference Image
After a bit of time, I have my finished base model of the machine. Obviously, I'll still be adding the legs, screen, and other additional details, but I think this is a good starting point. I'm really happy with how it turned out, and I'm accomplishing one of my main objectives, which is to have a relatively easy unwrap. One you may notice is that I have attached two copies of the table below. The first one is the original design, which isn't too different to the other, except for the part where the flooring inside the table is at a different incline. What I've done in the more recent one is just bring all of the sides up slightly, especially at the back, because it did look a little weird with such a different decline from the top to bottom, even though the average guide I was following said that the main playfield is around 6.5° and the top of the machine has about a 12.375° slope. However, this big of a difference didn't look quite right, and at least now with the extra incline, the ball will roll quicker in the game.
Original, weird incline design
Improved, more similar incline design
After starting the legs for the machine, Joe told me I should make sure it works properly inside Unity first, before I continue modelling, because I could waste my time if it doesn't work properly and I have to redo everything. Although this actually was a good idea, I don't think there's much of an issue. I know I don't have much in the scene yet, but after tinkering around with a physics material for the ball, I thought I found quite a good balance for what I want in the machine. When I add certain parts to the machine, I could give them a similar physics material, except I'll make the bounciness 1 instead of 0.5. Any other things in the scene that usually have a larger impact on the ball, I'll be pushing them away with some kind of force. I'm hoping that this now means I can go and continue modelling the base of the machine, which would be good to get it completed.
Sphere Rolling Around the Machine
Ball Physics Material
Now that I'd gotten the quick tests out of the way, it was time for me to complete the pinball machine model. The next thing I wanted to work on was making the legs for the table. I had an idea that I could probably copy and paste one leg three times, which would require less modelling, less unwrapping, and less texturing later on. However, I did want to consider making the back legs slightly bigger, since they seemed that way on other machines, as well as slightly on the dimensions drawing I was using as a reference.
To begin, I created a simple cube primitive and made some segments with the edge connect tool, after converting the cuboid to an editable poly.
Once I was happy with the sizes, I hid the cabinet model so I could clearly see the leg and continued to cut out parts, making it realistic. I first started by extruding the long, thick inner part of the leg that would phase through into the cabinet, and instead made the correct square, L-like shape. At the bottom, I was torn between a few various designs, but I thought having a large stump was probably best, and I thought I could probably use the chamfer tool to make it curved too, completing the basic shape.
After that, there were a few more design ideas I had in mind, but I couldn't decide whether I could be asked to do it. After a few minutes of contemplating, I gave in and started on the ideas. To begin, I made a segment that was roughly in the centre of where the leg overlapped the cabinet. I then just simply moved the top edge inward on both sides, which gave it this nice, triangular top, very similar to that of some of my gathered images so far. I then also noticed that the legs were ever so slightly slanted outward, probably to better support the weight of these things, so I wanted to add that. It took a minute to get my head around, but I realised that I needed to make some segments at the end of where it overlapped the cabinet, as well as segments placed just above the base of the leg. I then just moved the base outward and to the side a bit, and it angled it just right.
Cuboid with Specific Segments
Inner Part Cut Out & Curved Base
Triangulated Top & Slanted Leg
After finishing the shape I wanted it to be, I just selected a few specific edges and used the chamfer tool to make them smooth, just like what I did with the cabinet. Initially, I did this for all of the edges, but it wasn't needed on some of the more unnoticeable stuff, and it brought the poly count up by a lot - something I want to keep down if I'm going to add lots of models.
To fully complete this valuable part of my pinball machine, I wanted to add a couple of screws to bring it all together. I was a bit stuck on how I would do that, since although I used one primitive 3DS Max already provides, I thought I could do better, so I looked around for some tutorials. However, after realising it would take a lot more time than was needed for this, I just went and found the primitive - I believe it's an extended primitive called hose. I configured it a bit so it was right for what I wanted, before realising I don't really need much on show, so I can just delete any part that wasn't showing, since this model brought the poly count up by a lot. For the tip, I just inset the bottom face and moved the new vertices down a bit. For the head, I made the top face a little wider, and then connected two vertices across from either side to make a ⦶ shape. I remember when trying this before, I got a little stuck on how to connect the other vertices across each other, but all I had to do was insert a new vertex along the first line at the centre, and then I could connect the other ones to make the ⊕ shape. After that, I used the inset tool on the edges, which not only creates the other segments around it, but also can bring the original lines up or down. After everything, I have my screw that I'll probably end up using a few more times.
In the end, I sized the screw model down a bit and moved it into place on the leg. I was a bit unsure as to how I make the screws in the same place on both sides, since I couldn't find out how to rotate the copy around the leg instead of itself, but I think it's good enough. Later on, as long as I remember, I'll rotate them a little so I have some variation, but they look great nonetheless.
Smoothened Edges
Screw Model Created Using Hose Primitive
Screws Placed onto leg
Since I had one leg complete, now, I thought I would copy and paste them around to see what the whole thing would look like. Overall, I'm happy with the outcome of the same leg, so I decided to keep it, especially since it will save a lot of time altering one leg, as well as unwrapping and texturing another. Talking of unwrapping and texturing, after having the model complete inside of 3DS Max, I thought it was a good idea to have a look at what it would look like if I just used the model I had now. So, I quickly gave the UVW Unwrap modifier to the original leg, and used the quick map tool inside the editor to get a quickly unwrapped leg. Lucky for me, it did carry everything across to the other three legs, so I had no reason to unwrap them as well. I also did a quick unwrap of the cabinet, so I could roughly see what it would all look like. I then went to the material editor, created two new materials called Cabinet and Legs. I assigned the cabinet to its material, and then I found that I was able to assign each of the legs to that one material, so I hoped that it would texture all the same in Substance Painter.
After exporting and moving into Substance, I baked the maps, and they were looking good. I then applied the Steel Scratched material to the cabinet and legs, and it looked nice. I wanted a different texture for the screws, so I used Steel Painted Clearcoat, and that also looked nice. There were a couple of things I thought about while doing this, though. Although I attached the screws to the leg model, Substance still recognised them as separate objects, so I was able to easily paint them, which is always great, because I do not want to be clicking all the faces that make them. Additionally, it textured all of the legs at once; no need to texture everything separately. The few negatives I have about all this are, first, how the legs are probably going to have the same texture no matter what, so I cannot edit one leg's texture in particular and have it not affect the others. Additionally, the screw's textures are a bit lower quality compared to the other stuff because of how small they are. For this project at least, it doesn't really matter, but this would otherwise require me to make a group for the parts instead of attaching everything, since they'd want a proper unwrap of their own to be more detailed. Yes, maybe properly unwrapping would help, but I think it could be better again.
Completed Cabinet & Legs Model Inside of 3DS Max
Idea of Textured Cabinet & Legs Base Model Inside of Substance Painter
The last main part of the pinball machine is the back box. For me, this felt like the most annoying one to model, mostly because I didn't know what I wanted to include on it at all. However, while I went through it, I think the outcome of the model was pretty good.
To begin modelling it, I just started with a simple cube primitive again, like usual. I sized the proportions to how I wanted them, and shaped the cuboid a bit, so the back part was pretty much straight up. I then inset the front face a bit, extruded it inward and rotated it, which gave me the shape I wanted for the back box. I then used the connect tool to make the section between the backglass and panel, which I rounded off with the chamfer tool. The panel was a little difficult. It took me a while to find the best way to make the speaker parts, but in the end, I discovered a tool from a YouTube video that helped a lot, and then it was as simple as extruding them outward and chamfering the edges. For the centre part, I used the connect tool to get the rectangular shape, and just extruded it inward. This will become the small screen that displays the score, somehow, inside Unity. That is pretty much the end of the modelling for the back box, so it was time to make the parts that attach it to the cabinet.
Back Box Model with Speakers and Display Panels
When looking around for how the back box was attached, the only part I could see was holding it on was this little part that I don't even know the name of. The first thing I needed to do was get a close-up reference image that I could use as a rough idea as to what I needed to model.
After I found this reference image, I began the modelling phase, which was pretty simple. For starters, I just created a new cylinder primitive that I shaped to the right size for what I wanted. I then made it an editable poly, and then extruded one half of it to make a straight line, as shown below. Now, I was going to try a little harder and make it actually attached, but it was such a small and pointless part so I just had it phase into the bottom of the back box. After that, I simply added my screw model onto it, and it was complete. Not the best thing I have ever made, but it was good enough for this. I made an instance clone of the part, rotated it, and put it on the other side. This way, when I unwrapped the model, it would put the unwrap on the copy too.
Reference for Back Box Holder Part
Modelled Back Box Holder Thingy
After all of that was done, I think the current model of the machine looks pretty good. At least for the moment, I don't think it looks like quite the same high quality as the reference pinball machine I got, but it does look nice.
After considering the few choices of what to do next, I settled for the buttons on the side of the machine. Initially, I went for a more normal and recognisable design that you would expect to see on a pinball machine. I made two cylinders, one for the base and one for the button part, so I could export them as seperate models to move the button part as an animation in-game. However, after completing this, I thought that it was probably a better idea to make something game-related. So, that's exactly what I did. I found a basic reference image of the stone button from the game, and created a model that was a good size for it. For the animations, it can just phase into the machine like they do in Minecraft, so it's a little more simple, animation and unwrapping wise.
Finished Base Model for my Pinball Machine
Original Button Design
New Button Design Idea
After my idea for the button, I thought it would be smart to include more Minecraft-themed parts in the machine. For starters, when you launch the ball onto the playfield in the real game, there's some kind of spring plunger. I thought that a piston would be a good thing to use, which I will animate eventually.
Additionally, I needed to make the start chute that the ball travels up before entering the playfield. I put together a few pieces that work quite well together. Firstly, I just have a long wall which stops the ball from getting back in. At the top, I made a small part which will be textured and animated like a trapdoor, so the ball can get out but not back in. Lastly, there's another piston that will activate if ever the ball is on top of the starting chute. How this all works is that the red cubes are going to be textured as observers, which will activate either contraption when the ball is sensed.
Piston Designed Ball Plunger
Starting Chute Outlined
Finished Pinball Machine Model
After completing the starting chute, I was pretty much done with the base model of the machine. Obviously, I will be adding a fair few things to it yet, but this is a good start. I'm really pleased with how it looks so far, and I believe the texturing will improve it plenty more.
Before I brought the machine into Substance Painter to texture it, I needed to first sort out all of the materials and unwrap the model. To begin, I made all of the separate materials and assigned them to the specific parts. This will give me different maps to work with in Substance Painter, instead of them all being on one. I can also set unique colous to make sure everything has an assigned material.
Material List for Each Texture Map
The first model I unwrapped was the back box, and I think it went relatively well. I can't quite remember, but I believe I may have quick unwrapped the speaker circles on the front panel, but this was simply because they were such a small and unnoticeable detail. The main parts were all done by me. I don't think it looks too bad, and hopefully it will texture well.
I then also unwrapped the back box attachment parts, which were relatively simple. The main parts I unwrapped myself, but the screw I just selected and quick unwrapped, since it's a lot of detail on such a small part that doesn't need to be too precise, especially since it won't really be seen.
Back Box Unwrap
Back Box Attach Parts Unwrap
Another one of the unwraps I needed to do was the leg. The majority of the other stuff was quite self-explainitory, however, although I used the quick unwrap here, I did it strategically. This is because although the leg was easy to manually do, similar to the back box attach part, I was just going to quick unwrap the screw. However, this one in particular made it very small in comparision to the leg, probably because on the model they are a lot different in size. However, I didn't like this, since the texture would just be very pixelated if you looked close up, so I wanted it larger. So, I instead quick unwrapped the screw first so I had it all within the map. I then moved it aside, and made everything else fit in the mapping. I then resized the screw unwrap, moved it into some clear space, and it was way larger than the original.
Leg Unwrap with Small Screw Unwrap
Leg Unwrap with Big Screw Unwrap
After all of the unwrapping was finally finished, I exported my model and created a new Substance Painter file with it inside. After considering what part to texture first, I thought I'd try the starting piston to make sure I could texture the models how I wanted to. Luckily, after importing the image file of the piston that I wanted to use, it was as simple as lining the images up with the unwrap, which was just a bit tedious. Because I made the Minecraft models a specific size to account for the pixels, I should have no problems with texturing the unwraps.
Although this part was going well, it was actually at this point that I realised I had completely forgotten about the glass for the machine. At this point in time, I didn't really want to have to lose this progress, since the piston textures in particular took a decent amount of time to make. Although it wasn't the end of the world if I needed to, I still wanted to try to find a way around it. So, I went on the hunt to find out how I can add a part to my model and retain the texturing progress I had made so far. Luckily, it was as simple as exporting a new model file that had the unwrapped glass and then just opening it. I can't remember the exact way to do it, but Substance is smart enough to see what parts you already have included and just save your progress, as well as changing whatever you did with the new file.
First Model Getting Textured - Minecraft Piston
Textured Piston Mapped Unwrap
Textured Glass Object
After getting the glass into Substance Painter, I gave it the Glass Visor material, altered its settings a bit, and it looks awesome. The reflections look great, and I believe it's just the right amount of transparency. Now, I didn't know it yet, but this would later become a bit difficult, since it doesn't act like a normal texture for some reason due to being transparent. Either way, it looks good at the moment, and I get it looking pretty similar.
Plastic Grip
Next, I thought I should add another texture underneath the main layers for the piston and every other part that I add. This is mostly because, as you can see from the two images below, the original looks a lot smoother and shinier than it would realistically, so I changed it. To get this effect, I simply added a new material below all of the layers I added of images that made up the piston textures. The material I used, because I thought it looked the best, was the Plastic Grip material, which is found inside of Substance Painter by default.
After I had found the preset I liked, I copied and pasted this layer onto all of the other Minecraft-themed parts to give them the same texture.
Regular Piston Texture
Plastic Material Piston Texture
Wood Ship Hull Nordic, Aluminium Brushed Worn
After researching a bit more about the materials that make up the cabinet of a pinball machine, I found that it is primarily made of plywood. Substance, by default, doesn't have any plywood materials, and I couldn't find any good-looking free plywood materials online, except this one, which was close enough for what I wanted. However, although this is more accurate in terms of what they are made of, I know that there are usually quite a lot of metal parts found on a pinball machine, and some type of steel simply looked better on the machine. If I were to be making something quite old and not as modern, yes, I would've used a wood texture, but this time around, metal felt better than this Wood Ship Hull Nordic material shown here.
As well as the cabinet, I looked for a nice texture for the legs. In this scenario, I found a reference image that I thought looked best like what I had imagined the legs to look like. As suspected, everything was a shiny black metal material, so I had a look around for my favourite looking material for the leg by changing each one to black and seeing which one looked best. In the end, I chose the Aluminium Brushed Worn material, which I think looks pretty good.
Cabinet with Wood Texture
Reference Image for Legs
Legs with Metal Texture
After getting the legs textured, I wanted to focus a bit more on the cabinet and back box again. Instead of going for a wood texture, I had a look at the metal texture choices I had available to me, since that was going to look a lot better below my images I wanted displayed. So I had a look, and this painted metal texture was perfect since it was clearly a metal material, but it had a nice bit of green on it. Before adding my decals, I thought that anything not covered would at least have that nice green, but I think in the end I ended up covering everything, since it didn't look quite right. Also, for the panel which has the display and speakers, I thought of just having that a plain metal texture, as well as a nice, almost glass display. Overall, it looks pretty nice, but definitely in need of some detail.
In the end, after plenty of time thinking about what to do, I thought having a Minecraft panoramic shot around the base of the cabinet would be a cool idea. However, I was not prepared for how frustrating this would become. For starters, I needed to get my game into a perfect square and get all of my settings set up so each screenshot would seamlessly connect. I then had to take six screenshots from every angle, and I had my images. This took a lot longer because there were some settings I didn't know that were making it difficult, but in the end, it worked. Once I had an unwrapped image of them all stuck together, I started resizing the image and moving it so the image would seamlessly connect across all sides. I actually had to do this by eye since the unwrap had all of the sides apart from each other, but overall, once it was done, it looked pretty good. I then finished up texturing the main parts by adding an image to the back box that I got from the McIcons website and adding a creeper-like texture to everything else, and it was all but complete.
Now, before I move on to the final details, I want to say what I would change if I were to do this again. The first thing I would do is change the unwrap so every side is laid out next to each other, so I only need one image layer for the panoramic shot, and it would be perfectly lined up, especially since I had to avoid doing the back in this case, due to the image only just reaching around the front and two sides. Additionally, I would add some plain metal rails around the corners of the cabinet. Not only would this look a bit more realistic to real-life pinball machines, but it would also stop the change from the sides to the top of the cabinet from being so harsh. I think going from a nice background image to a large, green pixelated one looks a bit dumb, and is definitely something to have considered in the modelling stage. Either way, I think it still looks pretty good, and when the player comes to play, they will hardly be looking at the table, so it's not the main thing I need to be worrying about.
Textured Cabinet & Back Box
Minecraft-Themed Texture Additions
As we approach the end of the texturing phase, we reach the final little details. Firstly, the other Minecraft parts that I added, which were for the starting chute, I needed to make them look like they were actually meant to be there. I did this by, just like with the other piston, getting the images I needed and lining them up on each side. I think after they've been done, they look great; however, I did have one issue with the wall. Although you can't really see it here because I'm not close enough, and I changed what it looked like, the plastic texture I was giving everything looked quite bad, probably due to me using something to copy the texture across automatically, instead of adding loads of layers manually. Although it looks alright, it certainly wasn't my intended outcome, but I think it's fine for the little amount you may see in-game.
For the speakers, I just used some kind of glass mesh material of some kind. I was going to use one that looked a bit more 3D, but when I used it, it didn't keep a solid background, so I had to settle for this instead. I think it looks good enough, though, especially considering how much you'll actually be seeing.
Other Minecraft-Themed Objects Textured
Back Box Speakers Textures
In the middle of unwrapping and texturing the pinball table, I found that, for some reason, my 3DS Max at home was seemingly a different version from the one at college. I made sure it was updated, but it still wouldn't load. Instead of leaving it completely, I decided I would work on one of my favourite parts of making games: the UI. (This turned out to be because I still had 3DS Max 2025 at home, but 2026 at college)
Similar to the clicker game in year one at college, I was going to use sprites from Minecraft to make it look like a game made from it. I considered making my own, which in hindsight may have been better for the overall theme, but I still like how the buttons turned out. Not everything is the same since I had to make some variations for when you hover over them, when they're pressed/selected, and when they may become disabled. There's also a slider that I made (this took a lot of time again), and together, everything works really well. I thought I'd make the menus similar to those of the real game, so I booted Minecraft to get an idea as to how I would lay the menus out.
To get the slider properly working, it took a decent amount of code, where I used a mixture of YouTube tutorials, as well as ChatGPT, to help me out. I know I have basically done this already before in my first year, but I wanted the scripts to be really polished and as optimised as possible. I did this by simplifying certain parts of the code and removing unnecessary things.
I have left comments on my code, but I'll still briefly go over some things. For one, I needed IPointerUpHandler, since otherwise Unity could not test when my mouse button was released, and I also needed PointerEventData within the parentheses for the method OnPointerUp(), even though it isn't used. I don't know why, but it's all required to work properly. Additionally, at the beginning, I declare my variables as private, but also as a SerializeField. This simply means that the variable can still be seen and altered in the Unity inspector, but is not accessible through other scripts. It seems a bit pointless, but there must be a reason for it, since most tutorial YouTubers use it, so I will too. Diving into the variables, most are self-explanatory, but you may be confused about the string: typeName. I used this so I could just put this script on any of the other sliders I will use, meaning I don't need multiple scripts for every slider. In the Awake() method, I use ??= instead of just = because if I already apply a component in the editor, I don't want it to be overridden. Technically, it should do the same, but it's just in case. At the start, the text change method is called to update the text on the slider. If something is wrong, hopefully, nothing will happen, and it'll be left as N/A: ERROR. In the text change method, I use a strange-looking if/else statement. This is basically just a shortened version that ChatGPT gave me, and personally, I think this looks a lot better, so I will try to use this a bit more. Obviously, it only works (as far as I know) when you have a true and false outcome, so if I wanted it to change more, I may have to go back to my original ways. Lastly, I have a way to play the sound whenever you release your cursor from the slider. Usually, I would just do sound.Play(), but a ? was added so it won't throw an error and possibly crash if the variable wasn't assigned.
Collection of Buttons that I Made for the Menus
Script for Slider Text and Audio
Slider Script Save & Sound Changes
Although everything was working in my code, I felt like I was missing something. In the end, I realised it was the sound effect. Not only that, but I needed a way to save my settings, since this was something I haven't yet done, but I thought it was a great idea. So, I starting researching and getting everything together.
Although not a lot was changed, and I have added comments to all the new stuff, I'll still explain it now. For starters, I added the two new variables that were for controlling each parts of the audio mixer. This is the best way to get properly adjustable audio, and also allows me to easily add in a master audio controller. We will then have a look at the Start() method, where the other changes take place. I've added a couple of lines, one being PlayerPrefs loading the data for the specified slider so it will always show what you last saved. Additionally, a new method is called, which just sets the volume of the specific mixer group the slider controls, basically loading everything that was saved.
Inside the OnPointerUp() method, the PlayerPrefs save was added, which is where the saving of the slider takes place. After that you have the new ApplyVolume() method, which is what actually changes the volume of the specific mixer group. All this does is makes sure the mixer and string for specific mixer group name is assigned in the editor. If they are, the decibels for the mixer group is worked out from the slider value by doing some crazy mathematics, and it's set. After all of that code, I have a script that I can put on each of my sliders and have different adjustable groups for multiple audio sources, since I need to give each audio source a mixer group to be controlled by. For example, the button press audio for starting the game will probably be under SFX, and the UI clicks will be under UI, so everything is properly controlled.
Once I finished texturing the glass inside of Substance Painter, I needed to bring it into Unity and apply the textures properly. After a bit of tweaking the material's settings, I have a nice looking material, but one setting is one I didn't quite imagine using. First, I needed to obviously make the surface type transparent and apply all of the surface input maps (so the base map, normal map etc.). After that, it still wasn't looking quite right, so I tried changing the workflow mode from whatever it was to specular and it looked great. I don't think I changed much else, and I'm not 100% that I applied all of the maps correctly since the emmision map looked like it had some important details, but I couldn't figure out how to get it working.
Glass Model & Texture Imported to Unity
Material Settings for Glass Object
After the glass was looking sharp, I needed to make the start button actually do something, so you could play. Before making that, though, I made sure the UI was all working as expected. As you can see from the video, it was, and it looked pretty good. Additionally, you can see that as soon as I got to the music & sounds page, the UI slider was already set to OFF, since that was the save function working.
The first thing I needed to do for the button was the animation of it being pressed. To do this, I simply opened the animation window, selected the button object, and created a new animation file. After doing so, I began making the animation, which I believe I only made 0.02 seconds long or something after watching it over and over again, but it seemed right. Then it was time to assign that to a button OnClick() event, but how? Well, my immediate thought was to create a world space UI canvas, have it placed just in front of the 3D button, and create an invisible button that could be interacted with. In the end, before I even made it play the 3D button animation, I thought it would be a good idea to have it pulse a certain colour, since I didn't want to have text literally telling you what to do, but have something subtly showing you. After creating a short animation with code, I added the 3D button push animation to the UI button's OnClick(), and it worked great. I also hid the UI, since in game, you would not want that staying on your screen.
Working UI & Saving Sliders & Start Button
After looking at what I've done so far, I decided to display and give a quick walkthrough of each script I've made thus far. Although this is showing you what I'm making, which I'm sure is very helpful, this is more so that I can come back and see all the code in one place if ever I need it for this project or others. I will remember how I created certain things, and even now, I find it very useful looking back on previous scripts.
Loading in the Saved Slider Settings
This first script, although something simple, is still quite useful because it shows exactly how I need to call a coroutine method and why, if I'm going to have a second of waiting time played at the start, I need to do the full set of commands inside the coroutine. So, this script is simply used to load in certain things for my game. So far, it only needs to load in the PlayerPrefs saves for my Music & Sounds sliders, which just requires me to set the UI objects to active for a brief period. I found that doing it all in Start() does it too quickly, so I had to add some wait time. Since I thought a loading screen would be a good idea, this wouldn't matter too much. Originally, I had the game objects get activated and deactivated inside of Start(), along with the coroutine method call. However, I found out that Start() continues working without waiting for the 1 second that is declared inside the coroutine, so I moved everything into the IEnumerator method that I created.
At the start of the game, I needed music to begin playing, as well as starting another random track when the current one finished. This was relatively simple and just required me to grab the components for the audio source and audio clips.
In Start(), a random clip is selected and played on game start. Update() then plays every frame and listens for when the clip has reached the end. Once it has, it chooses a new random song and starts it. This is a simple but foolproof way of switching the song, and it doesn't really take much to run at all.
Playing Music on Start & End of Song
Pulsing Colour on UI Button
This next script is what was used to make the UI button pulse a colour to hint to the player that they should click on the 3D Minecraft button. Although it's quite a large script compared to the first two, it's still just as simple. For starters, I declare a lot of variables at the start, which will be used to adjust everything properly. At Start(), I just make sure everything is set to what it should be, by setting the time and opacity to 0, and the fading out boolean to false.
Inside of Update(), an if statement checks whether the pause timer is counting down, which, if it were, would stop Update() here and not allow any more code to run. However, at the start, this is 0, so it moves on. The fadingOut boolean is false, so it doesn't look in the if part of the next statement, so it gets filtered into the else. This means that the opacity is at its lowest, and needs to start being less transparent, so it begins changing the alpha according to deltaTime, which basically just does it gradually by using a gradient. Once it's as visible as I wanted it, fadingOut, becomes true, as well as the first part of the second if statement. This will then begin the fading out animation immediately, and once it fully fades to 0 again, the boolean is reset to false, and the duration is applied to the timer. This timer just ensures that (by default) 2 seconds pass before the colour starts becoming visible again, so it's not constant, which, to me, looks a lot better.
Finally, the custom method StopPulse() is called by a button's OnClick(), so when this is clicked, the script is disabled, and the opacity of the pulsing UI is set to 0, meaning nothing really works until it's enabled again.
After clicking the UI button from the script above, the 3D button also needs to get its animation, as well as a simple camera animation I made to make it seem as though the player is getting up from kneeling or something. This is a quick and simple script placed on the 3D start button, so the variable for it can be assigned automatically on game start, and it just everything nicely organised.
The PlayPressAnimation() method I created is simply to start the animations by activating a trigger in each of the animators, and the method can be called to by the UI button's OnClick().
Animator Triggering
Start Piston Controls & Animation & Rigidbody Forces
This next script is a big one, and it's a bit difficult to see, but I'm sure that's fine. This is the entire backbone behind the firing of the ball from the starting position. To begin, for me, the coolest part about this script is actually how the ball's rigidbody component is only grabbed when it's most needed. This is done so that when it enters the trigger collider area, it feeds its rigidbody component to the variable that needs it. When it exits the area, the rigidbody component is removed, so accidental forces are not applied to the ball. Strange how something like this is one of the most interesting parts of the whole script...
In Update(), it immediately checks that the ball is in the area, so the boolean should be true. Update() is exited, avoiding any accidental runs. If the key for launching the ball is clicked (this will be updated from space when I add a proper control scheme), it will begin charging a force according to deltaTime. This ensures a smooth increase, which will also coincide with the smooth pull-back animation. Due to needing to be the same time as the animation (2 seconds), I have to do some math when changing the values of the maxForce and chargeSpeed. Because I want it to happen across 2 seconds, I need to divide the max force by 2. This is because Time.deltaTime is adding a certain amount of force over the course of a second, so in this case, it needs to be half that of the maximum amount. The last thing in the if statement that needs to be run is setting the boolean for the pullback of the piston to true. This will then start the animation too, which gives the player a visual representation of what is happening. The last thing in Update() is another if statement that checks when the space key is lifted. This will simply call another method that I will now talk about.
The FireBall() method has only a little bit of code, and to put it simply, it stops the animation and adds force to the ball. It does this by first setting the boolean from earlier to false and the trigger to fire the ball to true. These two things with the animator will make it so that to the player, it looks like you're releasing the piston, so you expect it to generate force and shoot the ball upward. The animation for this is quick, just returning the piston to its original state, which looks good. After that, the rigidbody component for the ball gets a force applied to it. I add a negative of Vector3.forward, since forward adds it along the z axis, but the way I want the ball to travel is -z. I multiply it by the currentForce variable, which had its value gradually increase while the key was held down, and the force applied should be an impulse, so it happens straight away, not gradually increasing speed or anything else.
The next script is the one for the pushing piston, which keeps the ball off the top of the starting chute. For now, only two variables are declared in this script, and they're the Animator component for animating the piston and the rigidbody for the ball, which is where the force gets applied. Since this is applied to an empty object with a triggerable collider, I used the OnTriggerEnter and exit methods only. On the enter, it first triggers a parameter for the piston to animate it pushing. Next, the ball variable is grabbed through the collider entry, and as you can see in the OnTriggerExit() method, it's removed when the ball leaves, preventing accidental forces. Of course, I've already used this a few times, but it is very useful. The last part of the code is adding the force to the ball. Again, very similar to the starting pulling piston script above, just in this case, different parameters were used. In this case, even though to us, it looks like you want force to be added to the ball for the left, I actually wanted right-hand force, since (again, similar to the one above) just the direction of force I needed to apply was technically the opposite (Vector3.left does -x but I needed +x). 4 seemed to be a good amount of force to apply, and impulse, was again, great for what I needed.
Pushing Piston Animation & Ball Force
Open Trapdoor Animation
For now, the only piece of code in this last script is to open a trapdoor with an animator trigger. I'm not going to go into detail since I've already done that plenty of times so far, but it's pretty simple stuff, and all it does is open this trapdoor object when the ball goes over an observer to be let out of the starting chute.
After getting the majority of the core mechaincs down, it was time for the most important one: the flippers. For this, I was a bit torn about what to do for them, but I eventually chose a mini Minecraft stick. To make this, I first created a cuboid with equal length and width, then converted it to an editable poly. I then divided it up using the connect tool, and then removed most of the faces and bridged the holes together. I made a quick unwrap and material for them, and brought them into Substance Painter to texture. Instead of doing what I've done other times for the texturing, this time I just used a fill per face tool, and since I made all of the segments in 3DS Max, it gave me perfect squares to paint. I made them the Minecraft sticks, and it looked great.
After bringing the new model into Unity, I simply had to drag the new objects inside the old machine object group in the hierarchy, and set the values to what they were in the old. This made everything line up properly and look exactly as it should, as shown below. I later had to do this again since the flippers were too close to each other, but nevertheless, it looks great.
Textured Flippers in Substance Painter
Flippers Transferred onto Machine in Unity
After a fair amount of code tweaking, I finally have a finalised script which makes the flippers work. Not only does this utilise the hinge joint, which was confusing in itself, but it also marked the start of me using the latest Unity input system, compared to the old input manager. Although this has been around for a while, for most small projects, you can easily get away with using the old one, which uses GetKeyDown, etc. However, the newer one runs off of something you set up in the Unity editor, so no creating control schemes in code since you can do it all in this special editor thingy, as well as making it ridiculously easy to implement controller and touch screen controls. As I've said before, I'm not going to go into lots of details since I have left lots of comments, which makes it somewhat understandable, but I will explain some parts.
For starters, on the hinge joint component, the way I was making my flippers work was by changing the target velocity of the motor. Although this seems quite straightforward, for some reason, you cannot do something as simple as flipper.motor.targetVelocity, but you have to instead create a separate joint motor variable to change the target velocity data, and then apply the motor variable back to the hinge variable at the end. With regards to the new input system, it actually becomes quite simple once you get the idea; however, it's a bit confusing to get started. To begin, I have to select the input action I want to reference. It's a bit annoying that I can't just do something like action.nameOfAction("LeftFlipper"), and I have to create a variable for every action, but it helps in lots of other ways, so it's not the end of the world. To assign the action you want to use, you have to get a variable for the Input Action Asset you are using, the Action Map it's in, as well as the Action. It's a bit difficult to describe, but since the action map and action both require the named entry, you can easily change stuff in the inspector. You then also need to enable the action you have selected, because for some reason, it cannot be used otherwise. The way I will mostly be using these is by doing selectedAction.IsPressed(), which returns true when the keybind is pressed down, and false when it's not. After all of that, I had the new control scheme working, and it would be relatively simple to implement into other scripts.
Flipper Hinge Joint & New Unity Input System
Added Camera Animation
The majority of this script has already been gone over, but I just wanted to include the little change, which was the new animator component which is needed to set off a trigger that moves the camera into the main game position. The reason I don't have it straight away is that I want you to be able to see the pull back of the piston. I may also reset the camera position whenever you lose the ball later on, but it'll depend on whether I add a multi-ball feature, since I won't want it to always reset when you're actually still playing. However, this would be as simple as just giving the multi-ball balls a different tag, since then it won't play the animations.
While I was looking around as to how I could implement the new Unity input system, I found a great website that went through the main parts of how to use it. While most of it went over my head, and I wasn't looking to use the majority of the stuff included, I did screenshot the code to rebind a control, since I want to end up adding this to the settings.
There is one large issue I have with this though; so far I don't have a working settings menu, and I want to focus on other stuff a bit more first, so this will be one of the last things I add to the game, since I know I can do it due to me doing something quite similar in my Year 1 FMP.
Input System Key Rebind Example
After getting the base of the game complete (the pinball machine), I thought it was time I actually made a nice area around it. My first idea was to have this machine placed in a casino or some other place else and you just go up to it and play. However, my thoughts eventually shifted slightly into thinking about having your own mini room inside a casino-like place. This idea was also fueled by the fact that I had purchased a variety of asset packs from the Synty Asset Store a while back, and one of them was a casino, so it was the perfect chance to use it. Unfortunately, I found out that it would take a lot longer than I had to make a fully designed casino, so for now, I just have a room. Originally, I wanted there to be a bit of a cutscene at the beginning of the game that would walk you to your room through the casino, but I believe that'll be too much for me to do in the time I have. For now, though, I'm pleased with how this room design came out, and I can definitely do a good bit of animation with what I have.
Custom Room Desgin Created with Assets
Screen Display & Playspace Ideas
One thing you may see in my room design is a TV next to the pinball machine. This was included here because I wanted to make the game as realistic as possible, meaning I wanted as little screen-space UI as possible. My idea was to instead have this TV display most of the information that's important to you, as it seemed to be the best way. I didn't really think about where info is displayed on real-life pinball machines, but I still think this is better because it makes everything seem like they're linked up, and it makes more sense that you can interact with the TV rather than the pinball machine. Anyway, the reason I included this reference image is mostly for the info screen in the top left; however, I thought it was also good for game ideas since this game is very packed out and good looking.
After a long, long time typing and researching what to write, I finally have a mostly completed script for the TV screen. I say mostly completed because I am certain that I shall be adding something more before the end, but for now, it's at a mostly completed state. Due to the length of this script and, as per usual, having commented everything, I won't dive into too much detail, but I will brush over some parts. Now, before I start, I don't think I've really said it too much at the moment, but ChatGPT was asked quite a few questions and gave quite a bit of code in return. Obviously, due to the amount of commenting, I think it's clear I understand it, and for the most part, I am becoming a lot less reliant on AI for help. However, some things I am still a bit new to, so something like the name change part of the script, I did need a bit of help, but a lot of the rest was all me.
Anyway, let's begin. At the start, I make sure everything is reset. With regards to the camera animations for moving to and from the TV, it was all pretty simple stuff, however, I did have to add a timer for the main UI and TV UI buttons to become activated and deactivated, since I don't want the player to be able to interfere with the animator, and I am not smart enough to fix my issues properly as of yet. The main one is that the player could originally click on the TV UI close button during the animation moving toward the TV, which then just broke the immersion because, for some reason, the camera wouldn't finish the current one before immediately starting the next. Now, one thing I have just thought of in the middle of typing this is that I could see if there's a way to test if the animation is currently happening by using the script, but this is just too in-depth for what I need, and I may as well just disable it altogether.
The remaining parts of the script are mostly on the name change, which, long story short, is just when you click on the name, show the input field and update the name when complete. However, there is quite a bit else that goes into it. A few things that I will point out, though, are that I've included another save function with PlayerPrefs, just saving the name you type in from other play sessions. Additionally, I make sure to create a trimmed variable that stores a trimmed version of the name the user inputs, because I've made sure there is a maximum character count of 10. Therefore, if the player, for some reason, puts a space at the start or end, this will just trim it so that it isn't included. I believe I've thought of pretty much every scenario for this feature, so it's basically complete, and I don't need to touch this part of the script again.
The keen eye may also spot the method I've created but commented out for now, being the TVReset(). This is a function I may use at some point if I want the player to be able to reset their current run if they didn't like the first ball score that they got or something. This will just be a simple bit of code, triggered by a UI button, but I will have to get the score and ball count working first, since I want the player to be able to choose how many balls they start with.
TV Screen - Camera Animations & Name Change
After getting most of the TV screen completed, I wanted to start adding more features to the game, since, for the moment, I have very few features included. For now, my first idea is to have a chest that you can hit, and then it has a random loot table sort of thing. You could get lucky and get something very rare, giving you a large amount of points, or you could get unlucky and do something impressive for very little.
The first thing I needed to do was get some things modelled, textured and brought into my Unity project. One of the main objects was the chest, so I have some of the steps I took to create it. The first one was creating some cube primitives and making them look right. Initially, I couldn't find a texture image of the chest from the website I would usually use (McIcons). This led me to think the only way I was going to texture this was by making lots of squares on the cube, and then, in substance, I could basically do pixel art painting. However, the issue with this is that the chest alone came out to about 2000 polys, which is not only very unoptimised for no reason, but also meant 2000 squares to colour in. Instead, when I was at home, I thought I could probably get it from the Minecraft game files on my PC. Luckily, I found it, so I removed the segments from the original 3DS Max model and brought it back into Substance Painter. After I was done, it looked great, but I was a bit confused about the latch when I brought everything into Unity. In the end, I was trying to edit the gizmo's pivot point, and when changing that in 3DS Max, I found that I had forgotten to add the unwrap to the latch, meaning that although it was for some reason working in Substance, it didn't in Unity. After altering the files, though, it worked perfectly, and the pivot point would help a bunch to animate the chest opening.
Original Chest Model - Many Segments, 2000+ Polys
Final Textured Model in Substance Painter
Model in Unity Without Latch Unwrap
Finished Chest Part of the Game
After finishing the other models as well, I put everything together inside Unity, and I think it looks pretty good. I left some small gaps in the fences, which hopefully make it look like the holes are meant to be there, and the ball can fit through. For the moment, it's very difficult to get it into this area, but hopefully it should become easier once I add more things to the game, possibly another flipper close to this part.
#1) Breakout inspired, procedurally generated area of blocks (e.g. stone, coal ore, iron ore etc), ends with locked ball system
#2) Bumpers (redstone lamp, have multiple on = bonus)
#3) Respawning mobs, 2D? (zombie - static-1 tap-low, skeleton - slow-1 tap-medium, creeper - fast-2 tap-high-blow up if not quick enough)
#4) Growing amethyst on a budding block
#5) Cobblestone generator (little score but always available)
#6) Third flipper and/or updating the flipper model
#7) Command block (give ball, multiplier, speed, flipper power, score)
#8) Chest items (totem of undying)
Additional Gameplay Features Plan
Before I began bringing my quick gameplay ideas to life, I thought it was a good idea to first add a rolling ball sound to the ball and it's prefabs that spawn in. This was actually relatively simple, however, I didn't know how to go about it, especially with changing volume and pitch depending on the ball's speed, so ChatGPT helped out with that. Other than that, I found a ball rolling sound effect on FreeSound, shortened it so it wouldn't sound weird when looped, and brought it into Unity.
The code for this was relatively simple. All it really requires is the ball's speed which I grabbed every frame due to it being in Update(). Getting the velocity of the ball with the .magnitide converts it's speed into a more readable number compared to a vector, so I can relatively easily change the volume and pitch based on the speed. Then, as long as the ball is moving slightly, the audio is played. Using Mathf Lerp, I can smoothly change the volume and pitch based on the speed of the ball. The speed is clamped between 0 and 1, so it doesn't go under or over somehow, and the lerp just makes sure it happens smoothly, not completely linearly. I use lerp again to stop the sound playing smoothly, so it doesn't just cut out, and then the audio is completely stopped when it's quiet enough that the sudden cut-out won't be heard.
Ball Rolling Audio Controller
After quite a bit of work being done on the game, I finally have a somewhat finished model of the machine. Unfortunately, it's not exactly what it looks like in-game, since I've duplicated, moved and edited lots of the models, but this is technically what the base model looks like with most of the textures.
I think overall, the front side looks great. The model alone clearly shows what it's meant to be; however, the textures do really bring it together, the theme in particular. I really like the custom panoramic image I put together, getting wrapped around the main cabinet part of the machine, and the updated image from McIcons that I put on the back box. The rest of the design is just a mix of metals and paints, as well as the green pixelated texture that I put around everywhere. You also get quite a good view of most of the Minecraft-themed assets used, and I think they look pretty cool.
Front Side of the Finished Pinball Machine Model
The backside of the machine has a little less going on, however, I still wanted to at least look good enough. As you can see, I obviously sized the panoramic image incorrectly, so it didn't fully wrap around, so I just put the green pixelated texture on instead. I think that was a pretty good alternative though, and considering you don't see the back at all, it's plenty good enough. One thing I would say about the model as a whole is that I didn't really take into consideration the ball's chute or the out of bounds area at the bottom. As you can see from this image, I never really added anything, and to be fair, it works perfectly well, but it's not exactly perfect. I think ideally, I should've made something that had the ball automatically roll back into place which would be quite cool, instead of having to delete the ball object and spawn in a prefab. Either way, it works, and that's the main thing.
Rear Side of the Finished Pinball Machine Model
After all of the texturing that I've done, it's clear that there was going to be a lot going on. Although this looks like a lot, I'm pretty certain that ideally, you probably want lots of maps for each model, so each model has a decent amount of space for the textures. Overall, it became quite easy once I got into the flow, and you can sort of see what I had to do for each of the Minecraft-themed blocks from the second image showing the map and layers of the block model.
Finished Machine Substance Painter File:
Back Box Layers
Finished Machine Substance Painter File:
Block Layers & UV Map Example (Many Other Textures Were Replaced and Exported)
New Blocks & Procedurally Generated Area Hiding Command Block
After getting the core of the game completed, I needed to get some proper gameplay added. Up first on my ideas was a procedurally generated area that randomly selects a variety of blocks, and you are able to break them. This mostly became an idea through someone in my stream suggesting I add something similar to a breakout game, which are usually those arcade games that include a ball and multiple layers of blocks that you have to hit with the ball. I thought it was a great idea, and it easily aligns with the Minecraft theme, so I was absolutely going to do it. For this, I had to create a lot of different textures for a square, but this was quite easy since they could all use the same model, just putting different textures onto them. In my Substance, you should have already seen the block object's unwrapped UV map, and it was very simple to replace the textures since I just had to change the file that was shown, and since they were all the same size, I didn't have to do any resizing. Overall, this made my life significantly simpler, and I very quickly bashed out the textures.
The other feature I was going to include in this part of the game was a command block. Initially, I was given another idea to add to the game: a locked ball system. This is when your current ball is locked into place, and another gets dispensed somewhere. So, technically, this just gives you another life. This was good and all, but I needed something else, because for this game, I thought it was going to be relatively difficult to implement, so I replaced it with this, more Minecrafty idea. Basically, once you break the blocks around the command block, a pressure plate will be revealed. Once run over by the ball, it will "activate" the command block, and something will happen. I wrote down a few ideas for what could happen, and I'll probably make it randomly choose one when I get around to it.
The script for this was quite complicated at times, but I went through it, made sure I fully understood what it did, and wrote a bunch of comments all over it. One quite useful thing it does straight off the bat is it creates a struct that I can later declare as a variable. This basically gives one variable multiple pieces of data that can be used and assigned to one thing as a whole. What that means is that when you create an array of these variables, in the array, the first data block (in this case, blocks[0]) will have a material, weight (how likely it is to be chosen - used later) and the amount of score it gives. Adding multiple blocks to the array gives you many small pieces of data that can be used in a very optimal way. Now, I should say that again, ChatGPT was used to create this because I didn't know where to start, but I can already say that I will probably see myself using something very similar in the future. I do actually think I have used something similar in my Year 1 FMP, but instead of a struct on a script, I made a custom object that I could reference anywhere. Obviously, I could do that here, but that was probably more optimal in that scenario.
The rest of the script is fairly self-explanatory with the comments, but I do want to address a few things. One of which is the { get; private set; } at the end of a variable. Now, I don't fully know why ChatGPT told me to use this, but it simply avoids any other scripts from altering the value. In this game, I don't think it matters that much, but at least I've learnt something new. I could guess that stuff like this is quite commonly used on big AAA games, so the player cannot cheat their way around things, but as long as your scripts are working properly and as intended, nothing should happen, right?
The other thing is the method SetRandomBlock() that was created. This is quite smart, actually, but it basically takes all of the custom WeightedBlock structs that were created, adds up all of the weights that were included, and grabs a random number from the total amount. In a quick for loop, a simple test is made to determine which block was selected at random. Of course, each block has a different probability based on its weight, but this script as a whole is easily open to changes, since any additional data blocks added in the WeightedBlock array will be included without any change of code. This makes adding or removing content very simple, which is just what every developer loves. If you want to add more blocks, all you have to do is whack this script on the object, and the rest is done. Or, better yet, just duplicate a block you already have and move it into a new position.
Random Block Generator for Procedurally Generated Area
After I finished the randomly generated area, for now, I wanted to add the cobblestone generator and redstone lamp bumpers. The original design of the cobblestone generator was just like how I planned, and although it doesn't look too bad, it did have a few problems. Firstly, the ball would constantly get stuck up top, and since only the regenerating cobble would get destroyed, this would make my life a lot harder than it needed to be. Initially, I thought about adding small colliders on top that were slightly sloped so it would roll off, but it did kind of ruin the immersion, and on the lamps, too, it would probably miss some of the collisions that I would later add, so I scrapped that idea.
Later on, I came up with a new idea. Instead of having it flat on the base, I rotated everything by 45° so the ball could easily roll off. I did this for the lamps too, and I thought it would work pretty well. However, although it would, using the same block size that I have been all along just wasn't great because it took up way too much room, and made getting past the first part of the game very difficult, overall making the game a lot less enjoyable. In the end, I kept the redstone lamps, but decided to scrap the cobblestone generator idea. Although it was cool, and I technically would've needed this size anyway for the ball to fit through, it just wasn't good enough to keep in the game, and ruined my own play tester experience, so I knew it would be annoying for new players too. Also, it just left so little space to add things, since I don't want the entire board completely covered. Overall, I think this was a good change, nonetheless, especially since so much of the cobblestone generator wasn't even used, so it was a large blob just in the way, really.
Cobblestone Generator & Lamp Bumpers Design 1
Cobblestone Generator & Lamp Bumpers Design 2
Redstone Lamp Collision Activation Script
After scrapping the cobblestone generator idea, I decided to next get the redstone lamps working. This was going to be pretty easy, and I think that's shown through the script each lamp has. It simply changes the lamp material to an ON variant, and back to OFF after half a second. At Start(), it also makes sure that the OFF variant is selected, saving any user confusion if for some reason it started ON.
Now, at the moment, I didn't add anything else. However, later on, I added a new mechanic that adds a counter to the script which adds one value every time a lamp is hit. After the counter reaches a certain number on a lamp, it would reset the randomly generated area, making sure the game continues to have something interesting going on besides just trying to get the command block and chest. I also made it, so each lamp has its own counter, so you could try to do something strategical so every time you finish breaking every block, you then reset. Sometimes you might reset too early and lose a high score giving block.
After I got the lamps up and working, I also made a few other additional changes. To begin, I added a new flipper to the scene a little higher up in hopes to make getting the chest a little easier. Although I knew the chest was going to be quite an overpowered area, I thought I should make it a bit easier because it was near enough impossible for me, the creator, that had already been playing it quite a bit. Luckily, this flipper was very easy to make. You may think I just resized the old flippers, but I actually made a new model and texture that is pretty much the same, just smaller. For some reason, even though I picked the colours from the original flipper's map, it looked a bit darker, but I wasn't too worried. I just copied across the hinge joint and script components onto the model, and it worked perfectly after a bit of tweaking.
Unfortunately, the newly added flipper was still a bit difficult to get to, at least consistently, so I opted for a new design surrounding the chest in hopes to make it a bit easier again. The previous design basically made it impossible to get into, due to the fact that even if you got enough speed going up the wall, it would just hit the fence, since you needed to thread the needle into a very small hole. Not only this, but the new flipper was basically the only way, and for some reason, just wasn't throwing the ball where I wanted it. So, after reconsidering the design, I removed the fence from the two bottom corners, added a diagonal one if it were to run up the wall to bounce the ball off of, and I think it looks significantly better. Not only this, but it also looks a bit more relevant to regular Minecraft. The other fences looked quite weird, but now they're just rotated weirdly compared to what you'd usually see in the game. It also made it a bit easier to get into, but it still wasn't great, so I may have to consider changing this later on.
Redstone Lamps & Additional Flipper & Amethyst
Chest Area Design 2 - Fence Changes
#1) Lives/Balls remaining
#2) Creeper and Zombie Mobs
#3) Command Block Modifiers
#4) Chest Items
#5) Machine Shake
#6) Controls
#7) Leaderboard
#8) More Sounds
#9) Loading Screen
Once the lamps, flipper and chest were done, I took a moment to reconsider what I really wanted to add before the end of the project. At this moment in time, the days remaining were quickly counting down, and I still had some work to do on other projects, so I wanted to plan everything out again to help me. I added some of the most important pinball features like score at the top of the list, and stuff that I would most likely not get done to my full potential or at all towards the bottom. Obviously, I think all of it is possible if I put in enough time, but will I, can I...
For some reason, I think I forgot to add my other progress with the TV screen, but after a bit more work, I got a multiplier and balls remaining counter added, and was working on the score. As I said, I don't think I went through the rest of it before, but the main feature I added from this screen originally was a way to change your player name. Obviously, currently, it doesn't do anything, but later on, it would be used for the leaderboard if I ever get around to it.
The balls remaining was quite simple, just an integer variable that decreases in the ball kill area and increases in other ways. The multiplier is mostly controlled by the amethyst that gives a temporary boost depending on the growth level, but you can also get permanent increases.
Oh, yeah, I should probably talk about the amethyst that I added. I forgot just above to talk about it in the picture that was added, but you can clearly see a budding amethyst block below the chest area. This works very similarly to the Minecraft amethyst, so the shards gradually grow overtime from the budding block. When hit, the amethyst gives the player a temporary multiplier depending on the growth stage - more growth = larger multiplier.
TV Screen - Score, Multiplier & Ball Count
Mobs & Final Chest Area Design
The score and ball count was complete, which gave me a base game, but obviously lots more was needed. I haven't provided any progress images with them because it's a bit difficult to, but just know it all works and now the game is properly playable. Now, it was time to add the mobs that would be scattered all over the machine, becoming another constant source of more score. These were pretty easy to implement. For the zombies, I literally just made them static because I thought it fit their Minecraft style quite well, whereas the creepers would be moving around quite a bit, making them harder to hit. Nothing was random because I didn't have the time to make a proper AI, system, but I think this is a good compromise, as well as the 2D sprites. Obviously, modelling and animated the mobs would have been awesome, but that would've basically taken up all the remaining time, so I think my second idea worked perfectly for what they actually are. All mobs give a different amount of score and have a different respawn time, but all have the same concept: creepers move, zombies are static. Hit them, you get score. After a certain timeframe, they spawn back in, giving you infinite opportunities for more score.
Aside from this change, I also made some more changes to the chest area. Unfortunately, it was still proving to be way too difficult to get to, so I decided to change things up a bit and remove some of the spruce planks wall. Instead, I left just one block, added a fence against the back wall, so a hole was left. Overall, this design does make it significantly easier to get into, but I think it's a balanced change, especially considering I don't actually have a lot of gameplay in this, so I have to make something like this difficult, but not too much.
After the mobs were complete, I thought it would be a cool idea to make a quick chest animation for when you hit it, since I was in the animation mindset at this point in time. Unfortunately, I wanted to do a slightly different animation that included the totem of undying spinning when it pops out of the chest, but this is good enough. I still don't know what was happening, but it would just flip around a lot, which may have been because it was a child object, but I'm unsure. Either way, I think it looks nice and clean, and you may be able to guess what the chest is going to be for. Initially, I thought I could do something like swapping the sprite randomly, so you get a random assortment of items from the chest. However, this was after I had configured the command block in the other corner, and I already had a limited amount of outcomes, so I thought, with how rare it is, I'll just make it an extra life giver. Keeps it simple, and isn't something that'll confuse the player. One thing I would add is that I had to change the priority of the sprites since by default they're all the same which works with something like the amethyst, but the totem would initially show through the creeper, so I just made it lower and it works perfectly.
You also can see the sped up version of what the amethyst growing looks like. In game, this happens a lot slower, and when it gets hit, it disappears and stays hidden until the multiplier runs out, so the process starts again. Pretty cool stuff, but also pretty simple.
Video Example of Mobs, Amethyst & Chest Animation
One of the things I've been talking about for a while now is the controls for the game. By default, I've been taught the old ways of the Unity Input Manager. However, I wanted to implement the new Unity Input System. I've left this close to the end because I didn't know how long it would take to implement, since although it was quite simple, I didn't have a controls settings menu yet, so getting everything created and working was going to take a while. In the end, I decided against making a rebindable controls menu since I have already done that, so I'm confident about doing it again. However, I did want to change out the old input manager for the new system, so that's exactly what I did.
Below, you can see the input system I created for my game. It's pretty simple since there isn't a whole lot going on, and it's just a Keyboard & Mouse game. Basically, I have actions maps within this actions asset, one is GameControls and the other is NotInGame. NotInGame is used whenever you are around the UI and not actually playing so you can't accidentally or purposefully start playing basically blind. When you press the play button, it switches them to the GameControls, allowing you to actually play. A couple examples of this being used could either be when you pause a game and start using UI controls, or if you enter a vehicle. In games, especially one like GTA V, they have separate control schemes that you can rebind, and you can have overlapping keys because they switch the action map that is currently in use. Or that's at least how I interpret how this works. For my controls, I obviously have the flippers and the FireBall (firing the ball into the play area via the chute using the space bar), but you may have also noticed the left and right shake. These are some simple, new mechanics that I added just so you can make the ball move a bit sideways if you get stuck anywhere. It's a bug that's a bit annoying, but other than doing this, I don't know what else I can do. I move the ball by simply adding a very small amount of force in whichever direction the player presses. Clearly, this is also inspired by the real life mechanic of nudging the machine to move the ball. It doesn't affect the ball much anywhere else, which I feel like is mostly good, but you could spam it, so maybe you can use it as an advantage.
Input Actions Editor for the Game
After getting the input system working, I worked on implementing it into my code. This is an example of how I implemented it into my piston pullback script for firing the ball. In this instant, it's used for pulling the piston back, and it works by adding a reference to a key bind when it first gets activated. Basically, when the script gets enabled, a line of code gets the selected action and sets the started part to a method:
(e.g.) selectedAction.started += StartCharge;
This now plays the void called StartCharge() when the key bind is initially pressed. This method doesn't have much inside, but it does start a coroutine, specifically ChargeForce() (the one shown below).
Now, you may be wondering why I didn't just keep the Update() method and use something like selectedAction.IsPressed() or whatever the correct code for it is, but there's a reason I didn't. The main one is for optimisation, since using Update(), especially for something like this, is pointless. It gets used so little, it would just be playing constantly for no reason, like I originally had it. I have seen some tutorials that despise the use of Update() constantly, because, especially in a really large game, having an Update() method in every script is going to have a performance impact, especially on poor systems. Not only that, but this new input system was designed to be event driven, so it just makes sense not to. In some ways, it makes things more complicated by having more and larger methods, but overall, it is better. I should add that ChatGPT was used for this, because I didn't initially know how to add an event to an action, but now I do, and it's really easy to implement myself other times.
Adding Force to Piston Pullback Using Update()
Adding Force to Piston Pullback Using Input System & Events
Finally, I was onto the last stretch of work. I had finished the main gameplay aspects, and it was time to start finalising the game, before possibly building it, so anyone can play it. To begin, I really wanted to get a leaderboard added to the game so you could have your previous game's scores to keep track. I was hoping to try to get this implemented with the PlayerPrefs too so it would save whenever you closed and reopened the game. In the end, this was pretty simple, since I just needed to save the player name that was currently in use, as well as the current score. However, I did have to question ChatGPT again about this because I had no idea how to go about ordering the statistics, and it gave a pretty confusing answer initially, but I took the time to understand how it works, and it's quite smart really.
Adding a Score to the Leaderboard Via Script
This basically just goes through all of the current leaderboard scores and checks if your last game beats any of your saved 5 places. Once it does, it reorders the current leaderboard by basically copying and pasting the higher places downward, and then it just sets the new score and name into the correct place. My explanation is quite poor, and I struggled to find the right words with my comments, but I hope it's somewhat understandable.
In game, the leaderboard looks pretty basic, but it works. I made sure the number one place was a different colour to make it stand out, and this is also what the leaderboard would look like at first when there are no scores. Every time you play a game, you are pretty much guaranteed to get some score, so after any 5 games, you would have completely replaced the leaderboard positions and have a fresh leaderboard. After testing this, I also added a button to completely wipe your PlayerPrefs save because some people may want a fresh start after a bit, so I made an easy way to in the game.
After the leaderboard was complete, I thought that including a help menu would be smart, since if I were to release this game on itch like I did for my Year 1 FMP, players may want some context. I included three pages of some useful information that basically explained the game, which I think was really needed because I knew I wasn't going to get around to doing something like a control scheme settings menu, so people need a way to find out how to play. Moreover, the video play through that I have to make for the game also would be a bit of a tutorial for some people, since I basically show off everything the game has to offer, so if someone is confused, they can just watch that.
Empty Leaderboard in-game
Page 1 of the Help Menu in-game
As I was rounding up this project, I realised there were a few features I hadn't yet got around to including. The first was more sounds and the other was a proper loading screen. Unfortunately, I was quite low on time, but one of the things I wanted to do from near enough the start was create my own custom loading screen. Unfortunately, I didn't have the time frame for that, however, I thought I could just do a loading screen like Minecraft has. In the end, I decided not to go for one exactly like the regular game, but I did find a really cool animated one that I believe was from one of their spin-off games: Minecraft Legends or Minecraft Dungeons. Unfortunately, I can't remember the video I got it from, but this intro that I included was just a YouTube video on its own, and I thought it was really cool and perfect for my game, so I thought why not just include it, hopefully there's nothing to worry about regarding copyright, right?
Once I got my head around how to play a video, which I learned from YouTube video tutorials, the last thing to do was add more sounds. I thought it would be cool if there were some voice lines that I recorded or got from online that were sort of breaking the fourth wall by talking to the player. In the end, I found a fantastic website that allowed me to generate some simple AI text to speech mp3 files, and I made a bunch. In the end, I never actually got around to including them due to time constraints, but I attached an image of all the files that I got with the text that they were saying. I'm quite disappointed I didn't get around to adding them, but it's not the worst thing, because it could have been too distracting anyway, and I may have ended up removing them anyway.
AI Text to Speech Audio Files
Animated Mojang Loading Screen (Not Made by Me)
After a very busy few months of working on this project, I'm both glad and disappointed it's come to an end. On the one hand, it has helped me improve many skills, and I'm really pleased with what I have produced in the time and alongside the other projects. I can also now take a step back and focus on something new, honing in my skills that I've gained and use them to make something better in future projects. On the other hand, I am slightly disappointed that it has to end here. It should be obvious that there was plenty more I could add, and I had so many ideas pop up as I was making it, which makes me frustrated that I wasn't able to include all of my ideas to make this a better game. However, I do also think that there are some things I would have rather done differently now, which would make me want to mostly restart this project and start everything from the beginning, almost treating this game as a prototype since I now know I could have and should have done so many things differently.
Overall, though, I'm really happy with the outcome, and I even gave myself just enough time to release the game on my itch page to download. Also attached below is the video of me showing off what the game has to offer, as well as a tutorial for how to download and play the game if it isn't quite straightforward enough for some people. Especially when it came to the gameplay part, I wanted to keep the edited parts to a minimum since I assume that's mostly what needs to be submitted, but I recorded quite a bit, so I did speed up some clips to get to the important parts, avoiding a lot of wasted time of me just doing the same thing over and over again in quite a quiet game.
All in all, this project has been a great success. I feel I paced myself relatively well from the start, getting a decent amount of initial research complete at the start of the project, so I had an idea of where to start, and I kept doing little bits more throughout. Not only did I pace myself quite well, but I thought it was a neat feature that you can go back and watch the production of the game change every week, and see how it improved from the streams that I did at home (available to watch on my YouTube channel). Moreover, I think I stuck to the Minecraft theme really well, but made it feel like you were playing a machine that was inspired by Minecraft, not completely Minecraft, if that makes sense. I think I did this by making a nice, calm area that you're surrounded by that immerses you into the game as if you're actually there in person. Obviously, there are some things that break that immersion, but overall it's decent. The gameplay loop feels solid to me. I included a variety of features from the more common bumpers and flippers to a breakable, randomly generated area and somewhat random mobs. I feel that although there isn't a tone of features, everything that is included all works quite well together and provides a decent amount of play time, even if it's a game that you only play once. Furthermore, I feel that I've created some sort of competitive aspect too, since the leaderboard is a neat feature that allows players to compare their scores to one another and gives them a reason to keep playing: try to beat your friends. Now, I can almost guarantee there are ways to cheat the score, but I don't know how to test that or fix it, and I don't really care for it, so I'm sure it's fine. Lastly, everything seems to work quite well, and I have fixed the majority of the bugs I could find, so it should be a pretty smooth-sailing game. Unfortunately, there are some things that I will talk about later that would need fixing, but for the most part, every feature works properly and as intended. Everything is relatively easy to read, and I don't feel that there is an excess of information to overwhelm the player, but just enough to not make it feel too unfinished.
Now, regarding what didn't go so well, is probably going to include quite a long list of things. I know that overall, everything did go quite well, and I'm certainly happier with how things went rather than disappointed, but there was still more to be had. For starters, I could have included a lot more gameplay features. In the time span I had, as well as the space, I think what I came up with was alright, but it definitely could've been better. For starters, when you look at real pinball machines produced nowadays or machines in games like Pinball FX3, they just have so much more to offer that keeps you hooked in the game for longer. Now, I feel like I could've added so many more features all throughout the game, but for now, I'm just focusing on the actual machine. For starters, I never really included any kind of well-known pinball mechanics or obstacles. I mean, yes, I had the flippers and bumpers, but I didn't include any kind of track/rails that the ball gets caught in and rolls down, usually out of bounds. Talking about that, I didn't really include any out of bounds areas besides the main hole down the centre. I didn't even include multi-ball. Now, my main reason for this is mostly time and space. The rail was something I looked into at one point because someone suggested it to me, but due to the size of the blocks I made, the height was only just two blocks, so I didn't have the space for that. Adding areas that the ball falls into is always an annoying feature I found when researching certain games, however, that's when you can include some kind of ball save that doesn't get rid of a life. Multi-ball is one of those features that I so badly wanted to include, but just didn't get the time to properly plan out how I'd make something like that. It's unfortunate, because it is a great idea in hinds sight, but it would just cause too many complications with the ball count and I feel it wouldn't work very well with the size of the machine's place space, so it is probably for the best. Going back to the block sizes, I keep talking about how I wish I had made everything at least half the size, which is one of the reasons I would completely restart if I were to continue this project. For some reason, I made everything ridiculously large in comparison to the space I actually had, and it kind of ruined most of the project, since then I had to make everything fit without filling up every space that the ball needed to get further up the machine. This unfortunately led to the cobblestone generator feature in particular being dropped, since it was just too large to fit in. Moving on from that, I would've loved to either add more things to do in the room and have you move around with pre-made animations, or give the player a whole character and allow you to freely move around. My original idea for the game was that you were going to be in a casino and the opening cutscene would be you walking to your private room that you could explore. I think this would have been a really cool idea if I was to expand the idea of the game, rather than being purely based around a Minecraft-themed pinball machine, but I think what I produced was good enough in the time. The last thing I can really think of right now that went particularly poorly was the sound design. Unfortunately, it seems to be something I usually leave to the end and never really get around to fully including, so it's definitely something I need to improve on in other projects, because sound has a massive impact on a game's immersion. It's unfortunate I ran out of time to include the AI voice lines because I think they would've worked pretty well within the game, but it's something to consider for another time.
After I keep talking about starting from scratch again and acting like this is a prototype, I will now explain why I think that. Across the time of developing this game, I've come across a few issues that could have been solved if I changed everything entirely or thought about them beforehand. The first thing would be to redesign the actual machine. For starters, I think the panoramic design was cool, but there must be easier ways of making it, and originally I wanted you to be able to change what the machine looks like which at this point in time, would take far too much work for what it's worth. Not only that, but I would want blocks and other stuff to be changed to match the overall design, which would just have taken too long to implement, especially when it was only an aesthetic change that had no actual gameplay. Another issue with the machine was the floor of the place space and height. I think if I had made the blocks smaller, it would have been alright, but the floor was quite an issue. For some reason, although it looked to be a completely flat face from the top, I believe the face had some issues with being an actually true flat face. What I mean is that I could rotate an object to what seems to be the correct amount of rotation, and on some parts, it would move around normally. However, if I then moved it along the floor to the other side, it might start clipping inside a lot, which might happen if the face was not completely flat. I don't know if this is a 3DS Max or modelling overall issue, but that's why I'd definitely want to remake the machine again. Not only this, but I'd also try to make a proper starting chute mechanic and area to actually catch the ball when it falls past the flippers since in my game, the ball kinda just despawns and appears which isn't very realistic. I know a lot of the design isn't realistic, but I'd try my best to make it a bit more true to life, and along with that, I'd add some more detail to the machine that is missing, like the whole mechanical front of the machine, proper metal trims surrounding the glass, etc, and plenty more. On top of all that, I'd try to get better ball physics since they aren't too bad, but I still feel like everything could be a bit better. When I play some of the best pinball games, they always feel quite fast, which my game does, but also smooth, and they keep the momentum a bit more, which requires a bit more precision. Probably partly due to the shape of everything in my game, the ball's momentum constantly gets killed, leading to some very unmoving gameplay, which would probably drag away a lot of players. Lastly, I think everything just needs a bit more life brought to it to really feel enjoyable; I think the main aspect of that would be the mobs. If I properly animated them, it would feel so much more immersive and rewarding for hitting them, and of course they should be 3D models. Also, something like the redstone lamps could have an actual glow like a proper light source that gets emitted. This could be purely done by just adding a specific light source that gets activated while the lamp is on, or a proper lamp that looks like it's activated by a light source from the inside, making it look cool outside. Now, I do think sounds would do the majority of the heavy lifting, but when I see the chest animation in the game, it just seems out of place because of how smooth and good-looking it is compared to the lifeless world around it.
If I were to continue this project and try to make a bigger and better game, there are many things that I've already talked about changing, but what about adding. Let's say I completely remade the game - new Unity project, new assets, new scripts, and once I got back to a similar point, what would I add? Well, for starters, I'd want to change up the gameplay a bit. Initially, an idea I had for the game was a resource pack option that would allow you to change the overall theme of the machine, but what if instead that acted as the graphic settings menu, and the theme changed depending on your gameplay. Let me explain. I'm not sure how I'd do overworld stuff, but what if you were basically beating the game inside of pinball. So you spawn in the overworld and you first need to break blocks like trees to gather wood. After that, you could go cave mining, get better gear and more score. Maybe I could even include achievements that give you large amounts of score too, giving you multiple ways to get more. After a while, you could somehow go through a nether portal and begin exploring the nether, going to multiple types of structures across worlds, one being the fortress where you could kill blazes for their rods, and after somehow getting ender pearls, using eyes of ender to get to the end, and to kill the dragon. Again, it would take a lot of time and thinking about how to even start something like this, but I certainly think it could work one way or another. I'm not 100% sure how mechanics such as placing blocks and crafting would work, but I could make it into a proper arcady game that is heavily influenced by Minecraft, but instead all in a pinball mahine and you being a metal ball. Again, it's a big idea, but I think using all the Minecraft assets and the skills I've developed, it's certainly possible with enough time. That's one large idea, anyway, but my other would be going back to what I said before that I make the game sort of like a casino simulator, but you could play a variety of pinball machines. Obviously, at that point I'm basically just making a game like Pinball FX, but with extra steps because you'd be able to choose your games as an actual character. Maybe I could even make a game that revolves around you making your own machine in-game. Lots of assets would have to be made, and I've no idea how you'd go about making a building game like that, but it is the kind of game that I want to create one day, so maybe that's more what I'd be leaning towards. I'm not too sure what I'd actually end up doing. I have so many ideas for where a big project based around this could go, but if I was just making something small that was still based around just one Minecraft-themed machine, I would just make a really awesome machine with tones of features, as well as a more interactable world around it. Adding some proper multiplayer leaderboards and online vs matches could entice competetive players to play more, especially if it was like real Minecraft speedrunning, but instead a pinball version.
Overall, though, as I look back over the work from this project, I'm very proud with what I've produced. I think my personal skills have had great leaps of development throughout this project, and I know there's still a lot more to be had. It's unfortunate that I wasn't able to get more production complete, but that was mostly due to time constraints from other projects, and just the amount of blog work that I've put into this one. Production aside, I'm also very happy with the level of blog work produced for this project, and I think I've gone into lots of detail, just like I did for my Year 1 FMP, and I've continued that very well. When I have a project I really enjoy and am passionate about, I find it a lot easier to write about the work, which I think shows.
TWC
21935