7 Hours - Hemisphere
The weekend prior to the start of the 7DFPS, the organizers decided to put on a 7 hour version, the 7HFPS. This would be used to start getting things active early and help test their web site systems prior to the main event. At first I wasn't particularly interested in working on something for 7 hours, instead eagerly anticipating starting on our silly archery game. Then we thought of making a first person bullet hell game. It seemed simple enough for 7 hours and we created Hemisphere.
7 Days - Probably Archery
I was a little worried about how development of Probably Archery would go over the 7 days since I got pretty bored making Hemisphere and that was only 7 hours. That wasn't the biggest concern though, because Shane had full time work on all week and I had contract jobs to work on. The amount of hours we could spend per day during the 7 days would be fairly limited. There was around 3 days where I could work for decent stretches of uninterrupted time on the game, otherwise coding bits and pieces here and there. Shane had to make art assets after work, but got most of what we needed done during the starting weekend.
When thinking about how the game would play, we pictured awkward looking people struggling to get arrows nocked and fired in something resembling the right direction. As we built the game, it became harder to tell how it would feel to new users and felt less silly than we expected. Still, we wanted to keep the sense of humour so we had some very obviously inaccurate and silly aspects (players are balloon-headed sack people). Also by choosing to not research anything about archery at all and not worrying about accuracy, there are some aspects like the arrow being on the wrong side of the bow that probably annoy the hell out of people that know about archery, physics, etc.
I'd normally be very keen on the idea of live streaming development of the game, but the erratic development times weren't ideal for that. I did enjoy sitting in the 7DFPS chat and watching various live streams over the course of the week. Playing the in development builds of games and having people in the chat test Probably Archery's multiplayer early was awesome. The latter half of the week once I started doing this made the experience much greater as I felt more connected to other people and the jam as a whole instead of working on some silly game in solitude.
Ultimately I was fairly happy with how the game turned out. When I woke up this morning and decided to Google "Probably Archery" I was excited to see a couple of YouTube videos people had made while playing the game. Unfortunately one was prior to me updating the controls text to make it clearer that you could move the left arms shoulder and elbow joints as well, and the other was recorded before I fixed an issue where 3 people could be in a multiplayer match instead of 2 which would cause all sorts of issues. Still, just the fact that anyone played a game we made in 7 days and didn't hate it is exciting to me.
Some brief technical points on how various parts of the game are done:
- The arms are rigged and skinned and have a few animations for hand poses
- ?The clavicle/shoulder, elbow and wrist joints are moved in code with min/max angle restrictions
- Hand animations are set to only affect finger joints and can be played without affecting the rest of the arms
- 2 pass arm shader draws translucent (arms fade when close to the camera to not obsure aiming vision) and opaque parts of the arms separately. This allows for proper depth sorting.
- 2 cameras are used, one to render player arms/bow/arrow and one to render everything else. This allows for higher quality shadows from the directional light on the arms as the camera farClip-nearClip distance is short, while also allowing other environment shadows to look good with effective distance for cascades.
- Bow string and hanging target rope is a quick script I wrote that generates a cylinder mesh of customisable quality and allows you to set Transforms as segment points. The bow string has a center Transform that gets attached to the hand when the arrow is nocked and drawn. The hanging targets have Transforms attached together with spring joints.
- Bow drawing sound is a looping clip that I mute/unmute based on whether the draw strength was changed in the last frame.
- Arrows have an Audio Source playing a whistling wind loop. This gives a really nice 3D effect as arrows fly past your head.
- Multiplayer uses Unity's built-in networking because of time constraints. We setup a master server and NAT facilitator on an Amazon EC2 server. When the player hits the multiplayer button, it will look for a hosted game with only 1 player (the host) in it and join. If it fails to join (the host has their Firewall blocking connections for example), it will look for another host, only trying that same one again after 30 seconds. If it doesn't find a host it will host a server. This is fairly simple for me to setup and for the player to use, but it has some issues. If the player is full screen and hosts, they won't notice a Windows Firewall popup asking them to allow access for the program.
- Besides connection/disconnection code, all networking calls the same RPC method sending though a byte array with the first byte being a packet type. I assign callbacks/delegates to the NetworkManager to be called when certain packet types are received.
- Arm collision is handled through capsule/capsule intersection tests (closest distance between 2 line segments vs the sum radius of both arm parts being tested). After moving a joint, collision is tested on that part of the arm and all parts down the hierarchy against the parts of the other arm. If they now intersect, the movement is ignore and reverted. When drawing an arrow and moving the left arm, collision is ignored to allow the right arm to intersect anything for gameplay purposes. After this, the right arm could be intersecting the left so intersection is allowed following drawing an arrow until there is no intersection. This allows the player to move the arms out of each other without issue, but not back in.
- We added Google Analytics events to the game so we can see stats of how many people play each version, play the single player, multiplayer, etc.
- I didn't mean to put 'COLOR' instead of 'COLOUR' in the colour picker text in the menu, but American spelling of color in the Unity code was messing with my head .
Again, we're happy with how it turned out. It was hard to judge how it would play to a new user since after a short time with the mechanics, it became very easy for me to hit what I wanted. I think the game is a perfect fit for higher end motion control like the Razer Hydra, albeit with a separate control scheme where you only moved the hands (position and orientation) and the parent joints moved with IK. Having the WASD keys free also leaves the option for movement to be added if we wanted to develop it further and have larger scale multiplayer.
Thanks to the 7DFPS organizers for putting on a great event. There are a lot of really cool games that were made during the week. I think I've played just about all of them at this point. We'll definitely get involved again next year and will hopefully have 7 days full time we can dedicate to making something cool.
Probably Archery 7DFPS Game Page
Probably Archery Web Player page