Delaney Bannon
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


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.


Phase Script Breakdown









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.





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.