Gift Game: 2023 Week 6

Day Thirty Six

After spending yesterday organizing animation clips, I start today by assigning assets to the base move sets for the playable characters. This involves hooking up animation clips to references on the character objects. As part of that I start to play with adjusting animation keyframes in Unity. I’m not doing anything complex with keyframes, so Unity’s basic interface is all I need to trim down animations, or chop them up into the component clips UFE needs. UFE also provides the ability to keyframe speed changes in your move objects which is another tool you can use to solve the kinds of problems that come up when trying to get animations from different sources to work together coherently.

As I’m working with the animation files, I’m re-evaluating my folder structure and moving things around. By the time I’m done for the day, I’ve organized my clips so that I can fill out characters way faster. But even with my optimized sorting strategies, it still takes upwards of 30 min to pick and assign all the base movement animations a character needs to function. I should have the base moves set up for all my playable characters by the end of the week, which will just leave all the attack moves left to be implemented into the game.

Hooking up animations to base moves and creating move objects for my characters.

I’m starting to worry about the remaining time I have for the project. I still think I’ll be able to get everything done before I have to deliver the game for Christmas, but I need to continue the rapid pace I have going, and I need everything to go smoothly. Any bugs or issues I come across I’ll either have to solve quickly or live with them in the game. I’m not going to have time to iterate and polish. Which is a shame. I’m really liking the game, and I want it to be as good as possible. I’m enjoying making it. The only unpleasant thing is the stress from the tight deadline. If I won’t have enough time to give the game that extra level of polish, I’ll be disappointed. I suppose I can always continue to work on the game and release a polished up patch after Christmas…

Day Thirty Seven & Thirty Eight

Over the next couple of days I finish hooking up all the base moves for my playable characters. I also hook up the base moves for all my boss characters except for Golden Boy. That’s because I want Golden Boy to have a Capoeira fighting style, and while I have an idle and a bunch of capoeira attack animations, I don’t have suitable Capoeira style animations for a lot of the other default moves (crouching, jumping, blocking, hit reactions, etc.). I think I’m going to need to create some custom animations if I want to fill all those in.

Boss characters won't be playable till next year's Cristmas Fighter 2: Championship Edition

My plan was always to have the bosses as selectable characters in versus mode, but this issue with Golden Boy’s animation requirements is making me reconsider that plan. If a player is going to be able to play as a character, then that character needs to be able to do everything a player expects a character to do like  jump, crouch, attack from all those positions, etc. The player expects there to be feedback for all that input, so I need have animations or feedback for all those situations. If that is missing then the character feels incomplete to play as.

If the boss characters aren’t playable, then it doesn’t matter if some of the interactions that a player would expect to have available are missing. I can create move sets that would be weird or feel broken to play as, but feels fine to play against when the character is being controlled by an A.I. By wanting the bosses to be playable, I’m creating extra work that isn’t strictly necessary, so I decide to cut that feature from the M.V.P.

Day Thirty Nine

After all that time character building, I needed a bit of a creative break. So I took a swing at creating an original level. The mall level I’ve been using is basically just the demo scene from one of my asset packs. This is my first attempt at building a level from scratch using pieces from the asset packs. Of course I start with building the level for my character: an arcade! 

As soon as I start making the level, I quickly realize that by choosing a 3D fighting game, I’ve made building and designing cool looking levels much harder for myself. With 2D levels you have a nice flat plane the characters fight on. You can neatly arrange your level assets behind your fighters in interesting ways to make cool levels. It gets a lot harder in 3D because now your characters can rotate relative to each other, which moves your camera around in the space of the level. There’s a lot more space to fill with interesting details. If you’re making the level by placing objects in the world, you also need to strike a balance between making the level look interesting, but also leaving room for the camera to move around and not get the view obstructed by objects.

Issues with camera obstruction when characters are too distant. Also some animation anomalies show up when chracters interact with the level boundaries as seen on the right hand side.

Playing with the camera’s clipping distance seems to be a solution to preventing objects from getting in the way. But it’s not perfect, and there isn’t an easy clipping distance value that fixes all my use cases. If I set a clipping distance that works when the camera is close to the players, then when the characters are far apart and the camera is forced to pull back to a wider shot, the clipping distance will be too short and items will end up between the characters and the camera. But if I were to set it to a clipping distance that works when the camera is wide, then when the camera gets closer the players get clipped.

To clean up all edge cases, I might need to create a custom script to dynamically control the camera’s clipping distance to cull anything between the characters and the camera. Or maybe something that deactivates potentially obstructing game objects when they’re between players and the camera. I can also work with the engine and modify settings like the max allowed distance between the characters, and the level radius to prevent characters from being so far apart. I have a couple of potential solutions, and I’ll need to do some experimenting to find the right solution.

Animation files sorted by attack, limb, and type with additional information about the clip added to the clip name.

Today I also went through the process of sorting all my attack animations. Thanks to my experience sorting the character base animations, the sorting goes quickly. I organize the animations into logical groups so I can easily see how many variations I have for each of my attack animations. Creating attacks and moves in UFE 2 is slightly more complex than setting up the base moves on a character. With the base moves all I needed to do was pick an animation and hook it into the appropriate reference on the character object. To create a move I still have to pick an animation, but I also have to create the move object and set all the relevant move meta-data. 

There are a lot of attack animations and I’m going to need to make a lot of moves. Part of me thinks I should just focus on creating move objects for the rest of my animations, and then worry about applying them to the fighters once I have all my moves made. But I also don’t want to end up doing the work of creating moves for animations that I’m not going to end up using, so maybe my first step should be mapping the animations out before I start making the move objects.

Scrubbing through animation frames to set the active frames, hit zones (teal) and blockable area (blue).

Day Forty

Today I did a lot more organizing of my attack animations. My original plan was to follow how they sorted their animation clips in the demo project. I would distribute all the animations to the character’s folders as I assigned them. But I don’t think that makes sense for my project anymore. I’m going to keep all the animations organized together, and each character will have their own moves that reference the shared animations. That removes duplication and if I make an adjustment to an animation, all the moves referencing it will benefit.

I’ve been failing at keeping track of what animations have been assigned in the spreadsheet I created. It’s too much of a pain in the butt to enter the data as I’m trying to sort stuff, so I’m just not doing it. Instead I’m trying to have the names of my animations and move objects be self-documenting so I can use them to track my animations. I start by adding more information to my sorted animation clips names including the type of attack, limb being used, and variation count. I then use that same information in the name of the move object. This lets me see what animation clip is being used by the move at a glance. All this organizing and structured naming of clips is bringing me back to my days as an assistant video editor…

Demonstration of how I'm using the animation and move names to keep track of where animations are being used.

Day Forty-One

I’m modeling my game after Tekken, so my controls are also made up of four basic attack buttons: left punch, right punch, left kick, and right kick. That means the minimum amount of move animations required for a complete character move set is 12: those 4 basic attacks x 3 stances: standing, crouching, and jumping. I decide the smartest thing to do is to start with the stances where I’m most limited for choices. Most of my attack animations are standing attacks, and I only have a handful of crouching and jumping attack animations. Everyone will need to share those attack animations, so I’ll get the most bang for my buck when I make one of those move objects. So I start by making the moves for those stances.

I sort the animations some more, grouping them by the stance in the animation, and the limb being used to attack. After the attacks are sorted, I start creating moves by picking an attack (e.g. crouching left  kicks) and making a default move object for that attack using one of the animations. After setting up all it’s data, I copy the move and use it as a basis to make default move objects for all of the animation variants of that move. This speeds up move creation. It’s still a little time consuming as I have to tweak the hitboxes and active frames to match each animation’s unique timing. UFE 2 provides tooling to preview and scrub the animation to find the frame info you need to set the fields in the meta data. At least working from the copied base means that some of the move’s fields are already filled in.

 Once I have all the move objects for the different variants of an attack, I decide how to distribute them to my characters based on a fighting style matrix I have for my characters. I make each character a custom copy of the move object and hook it up to the character’s move-set. Following this process I’m able to get all the jumping attack moves and crouching attack moves (including sweep attacks) created, distributed, and hooked up to my playable characters.

There's enough moves in the game now that the computer characters can actually fight each other.

I do know I have an issue in that I have not set up the damage settings on my attacks properly. I’ve set most of my attacks to do a set amount of damage points (instead of a dealing damage as a percentage of the opponents health bar), and the damage amounts I’ve set are not properly scaled to the hit points I have for currently set for the characters. As a result, the attacks I’ve set up do very little damage.

Overall I haven’t yet given much thought to game balancing in terms of health and damage, so I’m putting this off as a problem to be solved later. I’m going to need to develop some kind of strategy to address and balance that part of the game, but right now I’m more concerned with getting enough moves into the game and assigned to characters so that I can have a couple of complete characters to play and start experimenting with game feel.

Example of how hit colliders can miss each other when not configured properly.

As I’m setting up moves, I’m also discovering that I can sometimes find gaps between hitboxes when doing attacks. The attack ends up missing when it looks like it should hit. When I find the issues, I tweak the moves to try to eliminate them. But it’s the kind of thing that will require more play testing in order to identify and fix. I may also need to tweak to how I’ve set up my character’s hitboxes.

These kinds of polish issues are the sorts of things I have no time accounted for in my currently insanely tight schedule. Things like this that come up are quickly dispatched to the ‘If I Have Time To Fix It At The End’ bucket. There is more and more going into that bucket, and the more I add, the worse I feel about what I’ll be delivering. I’m really starting to stress about how finished the game will be by Christmas.

Day Forty-Two

I’ve put a bunch of work into the game over the past week, but the progress towards a complete game has felt like it’s slowed down. I’ve hooked up a bunch of animations and created a bunch of moves, but now I have to start organizing and assigning the attack animations. This is the biggest and most complex part of the game. I have to start making decisions about combos and special attacks, and come up with a strategy for balancing health and damage. I’m worried how much iteration time it’s gonna take to find a good game feel, and there’s a growing list of bugs to be worked out. There’s so much work left to do…

To try and pep myself up a bit, I do some work on the UI of the game. I figure replacing some of the default UFE 2 assets with my own custom stuff will help me feel excited about the game again. I put logo on the splash screen, and take my first crack at creating a main menu for my game. It’s just a first draft, but I think it catches some of the vibe I’m going for. I like how it looks and it makes me feel a little bit better about stuff.

Main Menu v1.0

Nice new menus can’t stop the realization that is starting to set in: I’m not going to have time to get this game complete to a standard I’m happy with. Christmas is less than two weeks away.  Even if I were to crunch on this game for the next two weeks and completely neglect all my holiday responsibilities, I’m probably still not going to get to a complete MVP that I’m happy enough with to give my friends.

This game has already been eating up all my time. I’ve been so focused on getting this done that I haven’t even started my Christmas shopping yet. I’ve got holiday parties and family events coming up. I don’t want to be burning myself out right before the holidays trying to finish this game. The final straw comes when I realize that instead of having something for them this holiday, it’s more important to me that I take my time, make the game properly, and give my friends a polished product that I’m happy with. 

Wrap Up of Slow Jam 2023

After LD 54, I was planning on taking a break from game jams until the end of the year. Then the Slow Jam came along, and I decided to participate since it was designed to be a chill, crunch-free jam. Unfortunately I’m me. Of course I’d eventually turn a stress-free jam into a massive, overly-ambitious project, with a looming deadline and tons of crunch. Once I realized I was doing the exact thing I said I wanted to avoid doing the rest of the year, I knew it was time to stop.

My github is a graveyard of abandoned projects....

I’m still super excited about tackling this project, and I have no intention of letting it slip into my graveyard of unfinished projects. A fighting game with my friends has been on my bucket list for years. I’m glad the Slow Jam came along to give me the encouragement and excuse to start working on this project. Now that I’ve invested so much time, energy, and money into this project, I’ve created a great base to build from and a plan for how I can finish and deliver this game.

I’m disappointed that I won’t get to blow my friends minds this Christmas. But I know that taking the extra time to get the game right will make it that much better when I finally do get to deliver it to them. After I take a bit of a break and re-charge my batteries over the holidays, I’ll be ready to tackle this project and get it finished in the new year.