ETHYN.NET
THIS IS PART 2 OF THIS GAME’S DOCUMENTATION. TO VIEW PART 1...
TAMAKI TIME-LOOP
CONCEPT
A FAST, ICONIC, FIRST-PERSON ADVENTURE WITH A LOW-POLY PSX AESTHETIC.
Set in a dense, open-world based on urban New Zealand environments, the player controls a homeless man who must navigate the challenges of modern street life while trying to break free of the curse he is under, which causes him to live the same day on loop.
The game combines situational townsfolk interactions in order to progress, with a cluttered atmospheric environment for the player to get lost in.
Similar to something like Shenmue, but sped up significantly and with the addition of a unique mechanic...
The player only has 60 seconds at a time to collect items, explore, communicate, and make progress.
The following devlog explains how and why I created each and every aspect of my game.
Starting with the most important element of a 3D experience:
MOVEMENT
I need my game to have a fast paced physics based movement system.
This is something I find in many of my favourite games (CS, HALF LIFE, THIEF).
I have always had a particular fascination with bunny hopping (a technique used to increase movement speed and control by jumping repeatedly while moving forward.) and the power it gives the player. What originally was a glitch with the movement system in quake became so ridiculously fun to exploit people started developing custom maps just to bunny hop in.
^ this was THE SHIT when i was like 12,
The moral of the story is that a movement system developed in a way where players can immediately see better results as they build their knowledge in exploiting momentum and strafing is FUN and REWARDING.
It is essential for the experience of my game that I supply a movement system where the player can grow in technique to traverse the area quicker and easier, as my game is limited to 60 second game-play intervals.
To make this more user friendly I will allow holding the space bar, instead of timing jumps manually to initiate bunny hops, as well as holding a strafe key instead of needing to correctly coordinate it in sequence.
This should result in a compromise of fun, speed, reactivity, and technique to learn for my game’s movement system.
I achieved this by attaching a rigidbody component onto the player object to simulate physics such as drag thrust, lift, and weight.
HERE ARE THE SCRIPT’S I USED: (sorry, this one is the longest and most cluttered)
INTERACTION
I need my game’s interaction system to be responsive and functional.
Simple, and effective.
In order to achieve this, the player needs to be able to enter and exit buildings while moving at any velocity by pressing an input key (E). This should instantly teleport the “player” object to the desired location, at the desired camera rotation, yaw, and pitch while not bogging down the user experience with constant loading screens.
I will achieve this by creating trigger zones with cubes that have no render material. This is also how the conversations will be triggered in my game.
Once the player tag enters the area collider of the cube they will be prompted with the option to interact via a small UI element in the middle of the screen saying “Press “E” to interact, enter, exit, ETC”
This UI element will be removed once the “player” tag has exited the collision space of the cube, this also ends the interaction in case the player is removed from the trigger during conversation/ interaction for some reason.
HERE IS THE SCRIPT I USED WITH COMMENTS TO EXPLAIN:
ANIMATION
To animate the objects in my game I will keyframe assets using the animator in unity.
every single animation will be a length that is divisible by 65 (the amount of seconds a round of Tamaki time-loop truly lasts) and loop it so it will always play as it should during gameplay.
This is how I will achieve animation of cars, store’s opening and closing fences, the bus which triggers the start and end sequence of the game, the movement of certain townsfolk (“town drunk, skater, laundromat kid)
For more specific and expressive animations such as characters sitting, walking, talking, or doing anything requiring a rig I used mixamo.
I managed to do this by importing each npc into mixamo one by one, rigging it within mixamo, choosing the animations required for that npc, and exporting + importing the animation fbxs into the unity game, generating a humanoid rig, extracting materials, creating an animator controller, and linking it to the humanoid rig which was generated, Then I created parent objects and keyframed those to create simple position movement on top of complex animation as mentioned above
To animate the arms of my character I created a script which allowed me to display the running animation while the character was holding w, a, or d. The idle animation while not pressing anything, the slide animation while holding “c”, the jump animation while holding “space”, and the phone animation while holding “tab”. I also made the phone animation lower priority than sliding and jumping so the player has to first put their phone away before they can abuse the movement system.
HERE IS THE SCRIPT I USED WITH COMMENTS TO EXPLAIN:
TIMER
It must be 65 seconds in length, split into a 5 second starting period (to leave spawn) and a 60 second gameplay loop period.
Once the timer runs out, the player will be sent back to spawn no matter the circumstances of the rigid body or interaction status for the loop to be reset.
For the period of time that the player is being teleported back, a screen UI canvas will appear, counting which # loop the player is on, before disappearing and beginning the next loop.
The timer in my game must display within the inventory UI (phone), using text mesh pros to visualise the numeric value of the timer.
HERE IS THE SCRIPT I USED WITH COMMENTS TO EXPLAIN:
INVENTORY
For the game’s inventory I need to create a script that displays a UI canvas while the player is holding “tab”, this will be the lock screen of an iphone.
If left click is pressed while tab is held, the script will activate page 2 of the inventory and anything that is a child to it (instagram app, which displays the players items visually),
And if right click is pressed while tab is held, the script will activate page 3 of the inventory and anything that is a child to it (notes app, which displays the players items through text).
I need to ensure that the UI does not overlap and they are enabled/disabled accordingly
After that I will make the UI canvas a real world object, which can be viewed in the scene instead of pasted on top of a camera. THEN I will parent that object to the phone arms animation so it only shows up while the phone arms are activated.
HERE IS THE SCRIPT I USED WITH COMMENTS TO EXPLAIN:
DIALOGUE+VOICE
I needed my game to include a fully voiced dialogue system. The touch of hearing voices will add an important depth to the game’s characters, and will contribute to the storytelling by making interactions feel extra lively and memorable. I will implement a system that triggers audio cues in sync with text dialogue whenever an interaction begins. Each line of conversation will be linked to an audio clip that I have already edited in ableton, with voice acting that matches the character’s tone and personality. I will also add profile portraits to every character to add to the visual polish and player connection.
Instead of creating my own system, I jerry rigged a 2D dialogue system addon from the unity asset store to work for my own purposes with the previously shown interaction script. This provided me with a visual layout in the unity editor to adjust dialogue in my game on the fly which i'm assuming saved me hours
https://assetstore.unity.com/packages/tools/utilities/dialogue-editor-168329?aid=1101l9Bhe
WORLD
I need the game world to feel authentic and alive, with busy streets, recognisable buildings, props, and small details reflecting the essence of New Zealand’s urban environment.
In a way I am treating the creation of the world as its own art project.
I am trying to capture Auckland and satirically condense it down to its absolute most ugly, loud, and chaotic essence. GTA-ifying my hometown as everyone would want to.
It should support exploration and encourage interaction, while still maintaining a sense of mystery.
I want players to be able enter almost every building with no full idea of what they are about to see, while knowing it is all worth seeing.
There will be no useless locations. Every interior will have something to find, someone to have humorous interactions with, or be related to the story. This ensures that I am not creating an empty, soulless, husk of a city.
The game world will be designed as an open-ended environment with distinct sectors representing various aspects of city life:
A commercial main street, a flat area with skaters, bus terminals and construction sites, tight alleys, and wide office like spaces, bustling with unique NPCs. Each area will contain hidden high value currency, and funny non-essential dialogue to reward exploration.
LAYOUT CONCEPT
To begin, I sketched a general layout with a focus on not making the space blocky, linear, and boring to explore. Ideally I would like the player to be able to still get lost in the smallest space possible, This new layout is drasticly different to the last version of the game and it certainly shows in the gameplay experience
DEVELOPED SKETCH
I then assigned and labeled the spaces of land to the buisness’ I felt would compliment the ones around it. This was more than throwing down random brands, I really considered the flow of the game here, as well as the real world importance of every store.
I was now able to work on the 3D side of things!
3D BLOCK OUT
I started by creating a 3D block out from birds eye view to match the layout I had drawn, I then added the verticallity to each cube.
I made the roads and pavement make sense, while being flush and functional, also blocking out exterior props.
(These screenshots were taken after I made the meshes more complex)
BUILDING EXTERIORS
I then textured all of the blocked out buildings, using images entirely sourced from either the real world with my phone camera, or google earth. I used photoshop’s perspective warp effect (the method shown in the previous development log) while adding more depth and complexity to the meshes.
I finished this stage off by adding a huge amount of unrelated background buildings to increase the city’s immersion.
I repeated the same process for the game’s exterior props, interiors, and interior props. (To see the game’s interior’s fully furnished with props watch the interiors walkthrough video at the bottom of the following block or at the end of the page)
BUILDING INTERIORS
INTERIORS VIDEO
EXTERIOR PROPS
PURCHASING ITEMS
To implement the purchase logic, I created a script that checks a text mesh pro (money amount) and activates/deactivates objects in the scene based on how high that value is.
By default every store keeper will have scripted dialogue unrelated to purchasing anything.
Instead, their dialogue will be about the player's current objective, or they will say they are busy.
Once the player has unlocked the ability to make the purchase, I enable the storekeeper's “buy container”.
This is an object which parents both the item purchase successful interaction AND the item purchase is unsuccessful interaction.
By default, once the “buy container” is enabled the storekeeper's unsuccessful interaction will be set to active.
Once the player gains the correct amount of coins, the unsuccessful interaction will be disabled and the successful interaction will be enabled, allowing the player to purchase the item and continue with the game.
SO.. HERE IS A RUN DOWN
1- Current objective = get fuel
2- Fuel purchase container = active
3- Fuel purchase unsuccessful interaction = active
4- Once the player gets 50 coins,
Fuel purchase unsuccessful interaction = inactive
Fuel purchase successful interaction = active
5- Player interacts = Minus coin object = active
6- Player loses amount of money equivalent to purchase + receives item
7- Fuel purchase container = inactive
8- Purchase interaction complete.
STORY
The game’s narrative must reflect morals which I believe are desperately lacking in this city/ country.
hahahhaha do not worry,
not on some negative extremist, or conservative shit,
I want the game to convey positive themes such as: “everyone has value” , “don’t judge a book by its cover”, and “with repetition (dedication) and the process of learning you can achieve any goal”
I want to embed this into every characters' dialogue, while making sure the objectives direct the player into visiting a large spread of locations, ensuring they experience as much of the map as possible during their playthrough of the story.
It is also important that there are some funny moments, because what is the point of voices if they aren't goofy as hell. Postal 2 style.
NPCS
For the NPC models, I would like to create the most diverse, yet default group of people possible.
No fancy hair or clothes, everyone appears how they would in real life. Pure mundanity.
The most regular people you can come across. Yet they hold distinct personalities and appearances.
Each will serve a role in the story or gameplay loop, providing assistance, obstacles, or flavour to the world. If not, they will have something absurd to say.
I created the following models starting with a free psx base model found online, I then adjusted the physique on blender, and farmed textures + applied from numerious different sources such as https://thispersondoesnotexist.com/ and using photos of people I know IRL.
NPC DESIGNS:
POLISH
To polish the game I need to do a number of things.
Polish unfortunately never ends and you just have to find the right time to cut it off.
I added animations for cars, stores/locations opening and closing, NPCS idling, sitting, walking, running, skating, playing music, etc
I added a visible day-night cycle which cycles through 12 different sky boxes I created, all featuring varying times of the day.
I added my own 15 minute original soundtrack that I played guitar for while my friend played drums which plays on loop in 3D space in the town square
I added loading screens, a main menu, a game end sequence, a loop reset screen with a timer that counts which loop you are on to allow players to keep track of the game and their pacing. Players that ended up completing the game always told me which loop they finished on which I found interesting as I often would not take note of this.
I added an outer glow to the coins and cash in the game
I added hidden cash spots for the player to discover
I made the cash register at different values for which note they were
I added a bunch of optional NPC interactions and hints that allow for high currency rewards
BUILDING GAME
I developed 90% of this game on my mac laptop, meaning the game will be built on mac. But no one that actually plays games uses a mac to play games. Every computer in my uni degree's floor is windows, it is universal. So it is INCREDIBLY important that I also port this game to windows.
This turned out to be WAY harder than I estimated, as I somehow downloaded my unity version half a year ago without using unity hub, which means I was unable to install extra packages onto my project, meaning I couldn't add the functionality to build for windows.
I had to desperately scour the internet to find a manual download for windows support for the exact version of unity I was running.
AND SOMEHOW I GOT IT TO WORK
I managed to build the game for windows and get it running on my brother's laptop.
Except, once I hit play, the game would immediately crash.
This also occurred in the mac build making my game unplayable.
BUG FIXING
This was simply a nightmare that wouldn’t end.
The first issue, and the worst I encountered in the whole project by far was that the built version of the game simply would not load anything past the main menu. It would crash no matter what, and the mess of error codes explaining reasons for the crash made no sense to me.
Days went by of me living in anxiety trying to figure out what was causing this error.
How could I have worked months for my game to only function in the editor??
What I had to do was go through every object + script in my entire game and try to look for any issues that might be causing the break.
After countless hours I found that I assigned a rigid body physics object to one of the NPCS animation controllers instead of an animation file. As well as not having one of my animations set to a “legacy” animation, which can only be enabled in a hidden menu. Like wtf…
This somehow fixed my issue, and the main scene would now load for both mac AND windows with no crashes!!!
But that was not the end of my suffering,
Not even close…
Once I loaded into the built version of the game I noticed all the building meshes were jittering which I found out is called z fighting. This occurs when the mesh has poorly placed faces that overlap.
I had to manually adjust all of my buildings faces, extruding them slightly and reimporting them into the game one by one while playing a build on another device and comparing my adjustments.
Once the visuals were looking back to normal I experienced days of trouble making the timer script, day night cycle, respawning, loading screens, and the reset screen all fire at the correct times, in sync with each other.
A huge issue I ran into was that the player would not be sent back to the spawn if they were running the game at a low frame rate, instead the teleport would glitch and keep them in the town, which is a game breaker.
To fix this, I amateurly adjusted the script to force an attempt to teleport the player several times across the span of a few seconds, also force freezing rotation and position on the player's rigid body. This thankfully worked.
These fixes created a new issue where the timer would begin once the game was launched as opposed to when the scene was activated, making the player spawn at a random time on day 1.
To fix this, I removed the use of time.time in my script and painfully created an alternative time system that still managed to work on any computer rig.
I ran into many bugs with store opening and closing animations being out of sync, or losing their synchronisation over the course of many loops as well as cars and the bus.
To fix this I made every animation in the game a duration that was divisible by 65 (the amount of seconds in each loop) down to the millisecond. This ensured that they would always play at the same time every loop no matter how long the game is running. This also allowed me to create complex overlapping animations like cars weaving around each other,
Numerous other small bugs were fixed like interaction triggers overlapping with others, door exits not always working, performance fixes, and sound adjustments
WHAT WENT WRONG AND WHAT I WILL DO DIFFERENT NEXT TIME
Game Got Deleted and I Lost All Progress
What Went Wrong:
My project files were not correctly backed up, leading to a complete loss when the game was accidentally deleted at the end of the last documentation.
What I Will Do Differently:
I have now purchased and set up an external hard drive specifically for uni project backups. In the future, I will implement a routine backup schedule to make sure all my progress is safeguarded.
Unable to Build for Windows
What Went Wrong:
I had issues building the game for Windows due to compatibility problems with the Unity version I was using, which was not directly downloaded from the Unity Editor.
What I Will Do Differently:
I will always download unity versions from the official website/ launcher to ensure support and avoid these sort of compatibility issues. This practice will be applied to all software to maintain reliability and future-proofing.
Built Version of the Game Wasn’t Working as Expected
What Went Wrong:
The game did not function correctly in its built version because I only tested building at the end of development.
What I Will Do Differently:
I will integrate proper version control practices and build the game incrementally as development progresses. Regular testing of builds will help catch issues early and streamline the final stages of development.
Documentation Challenges
What Went Wrong:
I underestimated the importance of keeping a good strong stream of documentation trickling and struggled to do so consistently.
What I Will Do Differently:
I will allocate some time at the end of each work day to document progress, changes, and ideas. This will make sure I end my project with comprehensive documentation that evolves with the project.
GitHub Issues
What Went Wrong:
Because I wasn’t fully aware from the start that we had to upload a github repo of our game (I didn’t even know what GitHub was or how to use it), I developed a project that was 3.7 GB in size and 10GB in size ON DISK (the project not the game) on the external disk I was working on, meaning it was literally impossible to upload the entire game onto github (Max upload in a single commit is 2GB https://docs.github.com/en/get-started/using-git/troubleshooting-the-2-gb-push-limit). This did not stop me trying for a whole week though. I did this because THE ONLY BOLD TEXT ON THE HAND IN SHEET WAS TO UPLOAD THE GAME FILES TO GIT HUB WHICH IS THE ONLY THING I COULDN’T DO. I attempted to split the game into multiple parts to hopefully get all of the files onto the repo through numerious different commits, This didn’t work. Everything I tried either corrupted the game files, or displayed an error in GitHub desktop. I think these problems could also have been occuring because I was on mac? I tried for days and days asking AI, searching decade old forums, trying different commands in the terminal to rebuild the repo correctly, compressing the game, I tried everything.
This is the only thing that BEAT me. I never got a solution to this. I am so pissed.
What I Will Do Differently:
In my future projects I will implement version control IMMEDIATELY! This will allow for my files to constantly be backed up as well as allowing other people to download my games source code to help me work on it, which will be essential if I create anything bigger than this.
I am truly frustrated and worried for my grade that I couldn’t get this working but I had no knowlege of version control and couldn’t have known any better at the time of creating this project. I promise in this reguard I will do better in the future. If this is a major issue, what I can do is provide all of the source code in person, or potentially through a google doc if it is necessary (though it crashed my google instantly whenever I tried to upload it there).
Developing a Stronger Sense of Scope
(biggest issue)
What Went Wrong:
I did not leave a sufficient amount of time for the polish, building, and bug fixes required for a game of such an enormous scale (especially for a single person’s first project). As I had no prior knowledge of the fact that these invisible parts of a game’s creation, that you don’t think about, arguably takes the most time out of anything.
This lead to a hopeless, nauseating, and anxiety filled final stage. As well as still not being able to hand the work in on time even after clocking in no joke, 14 hours a day for the last 3 weeks of the project.
I have never made my body work so hard, for so long, just for something to not be completed on time. And knowing this made it so much worse for myself. The next week was spent waking up, throwing up from anxiety, bug fixing, banging my head against a table, and just wishing I had more time to learn how to finish this project at a healthy rate.
This situation also wouldn’t have occured if my almost finshed game didn’t get deleted earlier.
In the end I had to prioritise my sanity and physical health by taking a several day break before completeing the rest of the hand in process for the game, which I massively regret.
What I Will Do Differently:
I will allocate dedicated time blocks for polishing, building, and fixing bugs in future projects. Setting clear milestones and goals for these will help manage scope effectively and reduce end-stage pressure. As well as creating a project at a MUCH smaller size.
PLAY ON ITCH.IO!!!
To finalise the project, allow my friends and family to play, and to have the game tested by random people across the world I needed to publish the game.
I did this by creating a Itch.io game page! And uploading the exe for free (name your price) for mac and windows.
Immediately the game had minor success hitting 100 downloads and 500 page views in the first 3 days, also recieving about $50nzd from dontation purchases, which is not bad at all for a uni assignment and first game!
The game also generated a 35-minute playthrough clip, and 10 minute speed run video (CURRENTLY ON THE LEFT SIDE OF THE SCREEN) which were both uploaded to youtube by random people playing the game which blows my mind.
I have linked the game page and videos below
FINAL THOUGHTS
Tamaki Time Loop was a brand new life experience for me in so many ways.
I had never spent so much time making one thing.
I had never made such a complex fictional world, building a whole universe from scratch, deciding every variable of my own reality, from the drag of gravity, to the level of distortion made by vehicle sounds passing by.
When I was younger than 12 I used to try make “adventure maps” in minecraft using command blocks, which were mythical knowledge at the time.
I would hook up redstone triggers to allow the player to engage in very simple, one sided dialogue with villagers or whichever other mob I picked and added a name tag to.
I would chain these interactions together, which allowed the player to explore my world and experience a basic narritive.
looking back, I am doing the exact same thing today but at a much higher level.
And that makes me so happy.
I am crying tears of joy while writing the final words of this document
because without realising I made a younger version of myself’s dream game.
And for that, I couldn’t be more proud of myself.
I had never taught myself how to do so much in such a small amount of time.
I never thought I would be able to code.
I never even thought I would be able to 3D model.
I had never made an original sound track using real instruments.
I had never completely lost all of the progress of a project I was working on.
I had never built a lost project all the way back up from square one again.
I had never seen the world around me as the texture library it is.
For me; This experience bridged the gap between reality and the digital world in many ways,
as a majority of the textures are photos I took in the real world with my phone.
(something I had never done before)
This project was an experiment.
This project was a life long desire.
This project was a long-winded sequence of monumental learning experiences for myself,
fueled by an undying labour of love,
dedicated to the iconic nature of symbolism, signage, and user interface-
found within the internet, New Zealand, and the early 2000s.
To conclude...
This has been a huge step in not only my game development career, but my creative journey as a whole.
I learnt countless things that will be absolutely imperative in the longevity of my work, creative endeavours, and in general the way I percieve life.
What breaks my heart is that it is likely none of this will be recognised by AUT as I am handing this in later than they wanted me to.
Either way, I want to thank whoever is reading this...
I CANNOT BELIEVE I MADE A REAL GAME!
THANK YOU!!!
THIS IS PART 2 OF THIS GAME’S DOCUMENTATION. TO VIEW PART 1...