Implementing space shooter game features - Multi-direction shot
A quick review of new features added to a space shooter game in Unity
Objective: Implement a new type of shot for a space shooter game with Unity.
In the previous post I implemented a camera shake effect in my space shooter game with Unity. Now it’s time to implement a new type of shot for the player spaceship.
To start, let’s get the new sprites to implement the new shot. If you don’t have any edition software to create them you can always use a free one like the one I use:
Photo Editor : Pixlr.com - free image editing online
Login / Sign up Welcome to the free modern photo editor by Pixlr. Start editing by clicking on the open photo button…
Also, if you don’t know how to create shots, power-ups or animations you can check these older posts to get a reference:
Instantiating & destroying gameobjects in Unity
A quick guide to instantiate and destroy gameobjects in Unity for your game
Creating a power-up for your game in Unity
A quick guide about how to implement a power-up item in your game with Unity
This is the new shot sprite, which will turn into pellet shots to keep destroying enemies around when it hits an enemy:
This is the pellet of the new shot, which will be instantiated to go in another direction when the new shot hits an enemy:
This is a prefab that includes the respective pellets of the new shot, which will go to 8 different directions to hit other enemies when instantiated:
This is the new power-up item that will enable the multidirectional new shot for 5 seconds when it gets collected by the player:
Implementing the new shot
Now, in order to implement the new shot behavior. let’s create 3 new scripts:
This class won’t be inherited from MonoBehaviour. It will work as the main class to contain all the properties a shot could have in the game, just like:
- Property (player or enemy shot)
- Color animation
- Fire rate
- Offset to be instantiated
- Space bounds to be instantiated
To be able to modify the properties of each shot in the inspector, let’s use [System.Serializable] above the class declaration:
Forward shot class
This class will handle the behavior of the shots that move throughout a single line in the space, just like the lasers and the multidirectional shot to be included.
We need the class to inherit from MonoBehaviour to be able to modify the gameobject that this script is attached to. Then, we can use the Shot class to modify and use the properties of the shot. And finally, if we want the shot to be animated with different colors, we need to modify the sprite color through the Sprite Renderer component of the gameobject.
If the shot is set to be animated, we’ll need to initialize the respective Sprite Renderer and the delay to change color while traveling in the space. Then we need to call the respective coroutine to start changing colors:
Then to handle the movement in a single line, depending on the shot’s property, let’s move the respective shot in the Update method:
Multidirectional shot class
Now, to handle the pellets instance with the new shot, let’s inherit from the ForwardShot class to have the same behavior but let’s instantiate the pellets when the shot with this script attached collides with an enemy:
Note: I didn’t use virtual methods or overriding as the ForwardShot class doesn’t use the OnTriggerEnter2D method in this case.
If I attach the MDShot script to the new shot, the pellets will be instantiated when I use it in the game:
Enabling the new shot
Now, in order to enable the multidirectional shot for only 5 seconds, let’s modify the respective scripts:
Let’s create a new array to store the different type of shots that the player can have. Also, let’s keep a reference to the current shot, so that we can instantiate it when needed:
Then, let’s create some methods to handle the selection of the shot and it’s respective behaviors:
With the next method, we’ll make sure that the fire rate included in the Shot class affects the player:
Then, to enable the respective shot when collecting the power-up, let’s call one of the methods from above including the number of the shot in the array as parameter:
Now, when the player shoots, we’ll instantiate the selected shot:
Also, in order to spawn the power-ups according to the rarity, let’s use an enum to select the rarity from the inspector:
Spawn Manager class
Let’s divide the different power-ups by rarity by creating new lists:
In the Start method, let’s call the next method to initialize the lists and fill them with the respective power-ups. To choose the right list, we can get the Rarity from the PowerUp script component attached in the prefab of the power-up items:
Now, to spawn a random power-up depending on the probability of it’s rarity, let’s create a new method to return the respective item prefab:
Finally, let’s call the method when instantiating a new power-up in the respective coroutine:
Now, if we run the game in Unity, we’ll be able to use the multidirectional shot without any trouble:
And that’s it, we implemented a new shot! :D. I’ll see you in the next post, where I’ll be showing more features added to my space shooter game in Unity.