top of page

Putting the fun in functional!

The goal of this page is to explain how I take an idea and turn it into a functional game feature. This will primarily focus on the boss's attack pattern, but I'll also break down how I got to that point.

Concept

I'd wanted to make a bullet-hell style bossfight. My experience in the genre is mainly from Strikers 1945 and G-Darius but I wanted to make something more in line with games like Mushihimesama; shooters with a higher skill bar and more interesting bullet patterns.

R&D

I read detailed blogs, forum posts and reviews of individual games. I also watched comparison videos and playthroughs to see how different games were able to mix up the genre, and how players of various skill levels were able to progress through them. This gave me insight into what players would expect, and the kind of balance that makes a difficult game fair. 

 

The benefit to a bullet-hell boss, going by what I'd seen, is that most of them had pre-set and looping routines which changed at certain damage values. This meant that it was less about the enemy responding to the player, and more about establishing something the player could learn over time. This was how I thought about it:

​

-Boss must move around

-Boss must have multiple shot patterns

-Boss must have special attacks to mix up the player and make them sweat

-Boss must change routine to show fight progression

-All of these attacks must be 100% avoidable by a player who knows the fight routine

-It would be helpful to be able to change this routine quickly for balancing purposes

-Because all the art will be temporary, design the tool around being able to drag and drop art once it gets finalized

Result
image.png
image.png

I wrote a script, called EnemyShip, that contains a list of Phases which can be easily modified and reordered via Unity's inspector. These Phases let me change each aspect of the boss's routine quickly.

​

This script is attached to the enemyShip gameObject, an empty object that has the boss's sprites as its children.

image.png
bossexample.gif
Phase Script Breakdown
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png

Movement chooses a preset animation made in Unity's animator.

ChangeState is set to trigger at the end of each animation. It will set the enemy to Idle and will trigger the delay countdown if one exists.

The spawnerSetup controls the routines of the boss's normal attacks. The enums affect the individual BulletSpawner scripts.

​

Bullet Type - The shape the bullets come out in

Shot Type - Fire rate

Phase Delay - Allows for an offset between boss's left and right  guns

BulletSpawner inspector example. The enum selected in the spawnerSetup will affect things like fire rate, bullet color, etc. These are predetermined as functions within the script. 

The BulletSpawner scripts are attached to separate empty gameObjects, which are then added to a list in EnemyScript.

This is so the player can destroy the boss's arms individually. When that happens, the associated Spawners become disabled. EnemyScript will still run the current phase pattern for the remaining gun.

This is what the pre-determined fills look like. It's a quick process to change or add new shot types.

If the phase has a Special Attack selected EnemyScript will call a function, similar to the BulletSpawner script, that will activate the turrets or the fin funnels.  It can also be set on a delay to allow the player some recovery time between phases.

Each fin funnel (the rectangle you can see on the boss's back that shoots a horizontal beam) has a Fins script attached. They have pre-written fills like BulletSpawner.

image.png
image.png
image.png
image.png
image.png

They're also added to their own list in EnemyScript.

This is for two reasons; the first being that they can be destroyed individually without affecting the phase routines. The other is to allow multiple launch patterns where they're fired off simultaneously or asynchronously.

Example of the Fins script inspector. This is to minimize animating the funnels in favor of scripting their routines for fast adjustments. 

​

Beam Duration Reset - How long the beam is fired for

Rotation Delay - How fast the funnels will rotate when they're moving to the target position

Movement Delay - If they pause before moving

Target Rotations - Determines the rotation the funnels will end up in after being launched

XY Movements - Makes the funnel shift position after finding it's initial target position

This is an example of how some of the inputs above are utilized by the fin funnel script.

A time buffer between phases. It sets a time for the boss to remain stationary after its current attack phase is done. When the boss is idle, and the timer reaches 0, the boss begins its next phase.

Conclusion

This script allows me, or another designer, to create new attack patterns for the boss and adjust them with relative ease and minimal direction. Even if I'm coding on my own, I try to make the work I do functional, legible, and fun to play with.

bottom of page