It’s already the start of the new month, and I spent the majority of the time scouring newgrounds for appropriate music while trying to look for any sound effect asset I could find. Since I was almost done with the game, I thought that I could slack off a bit. It was a big mistake. I ultimately ended up pulling off a couple of last minute 3-4 hour sleep days to finish off the game just to put in some final buggy touches.
While I was playing the game, I still felt that the world was rather static and dull. The cars that I added last time helped with making the level feel more alive, but they were only noticeable when you ran along the edges of the level. If you stayed in the middle of the level, where the players would mostly likely be for the majority of the game, there was a whole of nothing going on.
I had some static environment meshes (a couple of trees and rocks) randomly placed within the space, so I decided to work with those. The music I chose is pretty upbeat, so I thought that having the trees “dance” with the music would be a nice little addition. I found this nice blog post about beat synchronization that was helpful: https://christianfloisand.wordpress.com/2014/01/23/beat-synchronization-in-unity/
The next thing that needed work was the core idea of the game: capturing the senpais. Previously, the senpais would disappear upon collision, so it needed to feel a little better. The “diving” animation in my previous blog post was used to add some extra hmph, and the Taichi Character Pack asset had a fall animation that was exactly what I wanted. However, simply adding animations wasn’t going to be enough. I displayed “Senpai Get” in big fancy animated letters letters thanks to SuperTextMesh, created a giant particle system of hearts and pink smoke, and since I have a love affair with screen shake, threw a little bit of shake in there as well. The idea is that since capturing the senpais is important, it needs to feel important. I don’t want to overload the UI, but I still wanted it to look busy during that very small segment of time. In essence, I was trying to attempt a positive feedback that says, “Hey look! You did something important. Look at all the stuff that is going on.”
The last thing to add was the actual win screen. My initial win screen just a simple scene with the player and a number showing the amount of senpais that they collected. One of the things that I always valued about Hotline Miami was the carnage that was left behind after each level. Therefore, rather than having just a simple number that says “this is how many you got,” I wanted the player to visually see their progress. For every point earned, a representation of the senpai type is added to a list. When the victory scene loads, the manager script populates the level with a series of environment prefabs that fits the senpaisTypeList count, and the camera scrolls through the senpais until it reaches the player. Here’s a section of the script:
#region setup
void IncreaseCameraSpeed() {
// increase camera speed
float factor = (PlayerStats.SenpaiTypeList.Count / 50f) + 1f;
cameraSpeed = cameraSpeed * factor;
Debug.Log ("newCameraSpeed: " + cameraSpeed);
}
void SetupEnvironment() {
int numberOfEnvironment = PlayerStats.SenpaiTypeList.Count / 73;
float positionX = m_environmentOffsetX;
while (numberOfEnvironment > 0) {
positionX = positionX + m_environmentNextPositionX;
Vector3 position = new Vector3 (positionX, 0.0f, 0.0f);
Instantiate (environmentPrefab, position, Quaternion.identity);
numberOfEnvironment--;
}
}
void SetupCharacters() {
float positionX = 0;
// setup the senpais
for (int index = 0; index < m_senpaiList.Count; index++) {
// place senpai and rotate 180 to face the camera
Vector3 pos = new Vector3 (positionX, 0f, 0f);
Quaternion rotation = Quaternion.Euler (0f, 180f, 0f);
// instantiate
Instantiate(PrefabForSenpaiType(m_senpaiList[index]), pos, rotation);
// update position for next senpai
positionX = positionX + m_senpaiNextPositionX;
}
// positionX is now the lastObj position
m_lasObjPositionX = positionX;
// place the player at the last object position minus offset
Vector3 playerPos = new Vector3 (positionX - 0.5f, 0f, 0f);
Quaternion playerRot = Quaternion.Euler (0f, 160f, 0f);
player.position = playerPos;
player.rotation = playerRot;
// set the player's animation to idle
player.gameObject.GetComponent<PlayerVictoryBehavior>().Idle();
}
#endregion
It’s a bit sloppy, but there is nothing fancy or complicated. There’s a bunch of magic numbers, and I basically made the environment much bigger than I should have. Each environment prefab fits 73 senpai models if spaced two units apart; therefore, for every 73 senpais stored in the list, a new environment prefab is instantiated and positioned next to the previous one. Furthermore, the camera doubles its translation speed for every 50 senpai caught so the player isn’t stuck waiting for the camera to finish if they ended up with a ridiculously high score. Initially, I had the camera facing directly in front of the characters. It worked well, but I didn’t like the idea of only catching a quick glimpse of the character as the camera flew by. By rotating the angle of the camera just a tad bit along the y-axis, captured senpais got more screen time. It was a minor change, but it made very a significant difference. The camera fly-by felt much more magical.
This was my first #1gam that I actually finished, so I’m pretty happy overall. However, I have to admit that I absolutely hate the game at the moment. I’ve been noticing a bunch of bugs, and though the idea of a little anime girl running around trying to collect boyfriends was very funny idea in my head, the execution and the final product wasn’t exactly what I expected. Regardless, I had a lot of fun building it, and thats all that really matters.
You can play the game here