Welcome, Guest. Please login or register.

Login with username, password and session length

 
Advanced search

1411421 Posts in 69363 Topics- by 58416 Members - Latest Member: timothy feriandy

April 18, 2024, 12:57:06 AM

Need hosting? Check out Digital Ocean
(more details in this thread)
TIGSource ForumsCommunityDevLogsTeam-based Shmup "Heal"
Pages: [1]
Print
Author Topic: Team-based Shmup "Heal"  (Read 621 times)
mariejuku
Level 0
*



View Profile WWW
« on: March 27, 2022, 05:24:04 AM »

it's about time i made one of these ain't it


Hi everyone. I'm Marie, I'm a Melbourne-based hobby dev. (More about me in introductions.) I'm making a narrative-focused shmup with team mechanics. My background is in programming and visual design, and I've previously worked on some Wipeout-esque racing games where I contributed level design and visual direction. Narrative design and writing are by Maxine, who is NZ-based.

The game is a (hopefully) small-in-scope shmup with a narrative focus, and mechanics that see the player leading a team of pilots that support each other in the fashion of Ninja Storm or Genshin Impact. We're planning to have 5-6 missions in total once all is said and done, and about 25-30 minutes of playtime if optimized.

My influences include Ikaruga, Zone of the Enders, Nier: Automata and Porter Robinson.

Gameplay involves building meter in all three ships with appropriate chaining and then switching to make use of each ship's unique specials. These are designed to synergize and increase damage dealt. Narratively speaking, I am a trans woman and I've struggled with mental health throughout life, so our narrative will touch on this in some way (no spoilers).


The game runs on Unity. At this moment in the project, I've created a variety of gameplay systems, but I would still consider the project to be in pre-production for now. The milestone we're currently working towards is a demo first level that includes short cut-scenes, some dialogue, enemy formations and your typical mid-boss and end-boss. I see this as a stress test that should highlight any areas lacking in my tools (I can then correct for that).

Going forward, our development plan is to give ourselves 4 months of working time. After that period, we'll review and assess how confident we are in the project at that stage.

It's worth noting that our skillset currently lacks audio. This is a point of trouble that I'm anticipating, and I'm gonna be doing what I can to plan a path toward suitable audio (be it commissioning or something else).

I hope to learn a lot while I'm here on the forum, seeing how others might approach the same problems I'm encountering.

Thank you for reading. I hope we can make something nice, and I hope you all can enjoy it :)

Development for Heal is gonna progress in our Discord: https://discord.gg/TuEpgJwwDV
I post pictures and gifs, you can chat with me there and ask questions. I am very conversational (if a little curt at times).
Some of my past work is displayed on my portfolio.

Thank you for your time :)

I am going to be making a follow-up post shortly to discuss our current Unity progress and my tooling.
« Last Edit: March 27, 2022, 06:00:12 AM by mariejuku » Logged

mariejuku
Level 0
*



View Profile WWW
« Reply #1 on: March 27, 2022, 07:37:46 AM »

So I want to start off by talking about my tooling so far, and how I've set up the project inside of Unity.

I've not seen how others do this or what a mature in-house shmup engine looks like, so I'm very curious to see the similarities and differences among the solutions I came up with and those of others. Please send suggestions and questions! I looked at projects like Shmup Creator: Build & Blast as I went. There's a caveat here that I'm going to change and expand these further as I go so these aren't their final forms.

I wanted to use as many features native to Unity as I could. So what do we need?

The most fundamental part the view is the Arena. From the outset I needed to have a play area that could be moved and rotated while the player's view remained fixed, and crucially without affecting player motion at all. The motion of all bullets, enemies and the player all happens within the arena's local space. The camera is fixed to the arena as well. My project uses Cinemachine, and the arena camera is a cinemachine virtual camera. Also, the game uses a secondary camera that renders only bullets on top of all other parts of the scene so they can't be obscured.

The white box is the Arena's bounds. There are also some placeholder enemies moving there.

There is also scenery there, the ocean (the first stage happens over the ocean). I use a scenery manager to scroll scenery objects. The transform space of scenery is seperate to the arena, the arena can rotate away from that forward scrolling direction if it wants to.

Scenery in my game is instantiated at runtime. I did this so the player can advance through the stage at a variable pace, and the scenery will be tied to their progress through the stage even when scrolling quickly. So the scenery is made from chunks, which are prefabs, that get loaded in order until they fill up some distance ahead and behind.

The 'chunked distance' is dynamic during the game. I usually keep it short so that response from the system is fast, but it can be made long for instances where the camera faces towards the front and back horizon. And then brought back to short again with removing those chunks. If you look at

, they sometimes use a very short fog point to hide loading objects but I'm hoping that I can display a believable horizon (and sunset) with this system.

Chunks are stored in a Scenery Zone.

It's a basic asset. When the scenery changes to a Zone it will create the Start chunks, then loop the Main chunks. On changing, it add the End Chunks.
Zones usually get changed when new encounters happen, more on that in a second. The chunks themselves are just Unity prefabs with an appropriate component. These have colliders so that when enemy ships are killed they can turn into a physics object in world space and collide with the scenery below.

Stage Manager has the most responsibility in a single level. I intend to have one stage manager per scene and for all intents and purposes it is the level.

The level is defined by a series of events that are executed in order. Some of these can take time and others are instantaneous. I wrote my own custom inspector for this component.


You can rename and reorder components and change their properties. In this image is the Capture Players component, this will either spawn the player objects if they don't exist or take ownership of them if they got loaded in a previous scene. The stage manager also (for now) contains the information on the player's team. This includes the current leader ship. Everyone's meter and stats are stored individually still.

Encounter is the most important event here and the level will be mostly Encounters.

When an encounter starts it can command a change of zone and it can choose how the level waits, with a time limit or destruction of all enemies. Enemies are stored in Squads, which are just prefabs. There's an optional delay on the instantiating of those squads.

So squads are pretty important because the contain the enemies.

So it's a group of enemies collected inside one prefab that are spawned all at once at a certain location, usually outside of the player's view and then they move into view. The red box in the gizmo indicates the relative position of the player's view.

Enemies are spawned in the transform space of their parent squad. This is useful if they are grounded enemies, but if they are flying around then the Release Mode allows them to be moved into Arena space either immediately or when they come into view. The squad tracks it's own enemies and destroys itself when they have all been defeated.

Enemies are not considered to be 'in play' until they've entered the arena. Until this time, they cannot damage or be damaged. They can despawn by leaving the arena only once they've entered it first.

Enemies are important!

Enemies run on a behaviour driver that's individual for each enemy. They move based on their Move Behaviours, and shoot with Weapon Behaviours. There can be multiple behaviours in a row and they'll run in order. Some are instantaneous and some take time, with a dynamic ending condition (this makes enemy motion difficult to preview without a real enemy doing it in the game). These behaviours are things like 'move to location', 'move to player' or 'follow this path' and have some properties.

The squad stores behaviours, too. The squad will send orders to all it's enemies, so that you don't have to set it up on an individual basis. These orders are added ahead of any individual orders and that's what 'initial behaviours' means. You can also set the 'mirrored' flag on an enemy and all its motion orders will be flipped. I'm currently working on a behaviour that lets the enemies coordinate in different formations, like a circle.

For cutscenes, I'm making use of Unity's Playable Timeline. I'm recording motion for cameras and the arena. The player can be at any position when a cutscene starts, so I animate placeholder transforms and I blend the position of the player between the desired cutscene position and their player position.

As mentioned, I use cinemachine to blend between gameplay and cutscene cameras. I also use Yarn to handle dialogue.

This is all super rough. I've written stuff as and when I've needed it, and I've not had much insight into standard industry practices when it comes to games like these. So I'm curious to see how my approach diverges from others, or is similar to others. I'm definitely open to advice for doing things in a cleaner way or hearing how you did it. I suspect there are some games that build their whole level out in a single scene instead of dynamically loading pieces of it in this manner.

Thank you for reading Smiley
Logged

mariejuku
Level 0
*



View Profile WWW
« Reply #2 on: April 18, 2022, 10:53:32 PM »

Hi there! Recently I've been expanding our tooling a little and working on our test first level.

Firstly, I've expanded the arena somewhat. In addition to placing enemy prefabs, the arena can now spawn it's own enemy objects at runtime based on a timer and some other settings. I'm hoping this makes it easier to make consistent patterns.


I can add as many different groups as I like, and there are 'delta' properties that allow for a spread of values across each mob. It also makes it easy to update the alternate side of any patterns that are mirrored to the other side of the stage.

I've added a GUI representation for this, and here's what that looks like:

It displays the initial direction and position of the spawned mob.

The arena and mobs now support a 'standby' behaviour set, which is optional. This can be used to place the mob in the world with some direction, but not attack the player yet. They can sit visible in the background and wait until the arena calls on them to starts their attack.

Further to this was a small consolidation of the mod's movement options; movement is now controlled by a velocity variable that persists in the mob across different motions. Previously the behavior held their own velocity, which meant they couldn't smoothly transition from one to another.



Next, I reworked the way colliders in mobs operate. The mob includes a set of Units, sometimes just one, sometimes several. The units represent the individual sections of a boss mob that can be independently damaged or destroyed, and the mob's colliders are attached to each unit. I can mark a section as a weak point, causing it to take double damage if players hit it there. Damage applied to the unit can be chosen to damage only that section or the entire mob together.



I've also added a screen-space shader to highlight weak zones. I took some time to touch up visibility of projectiles by writing an edge-highlight shader, and adjusting the look of player rockets.



So a lot of the tooling seems to be coming together now, and that's exciting.



For a test introductory level I figured it best to make sections that focus on the abilities of each player type. This hopefully gives me good grounds to test their gameplay loops in isolation before bringing them together. So this first part focuses on the red player, and next I'll be building out the section for the yellow player. The yellow player is the mobility-type ship and in my initial draft features a close-range weapon and a dash for moving quickly.
« Last Edit: April 18, 2022, 11:03:45 PM by mariejuku » Logged

mariejuku
Level 0
*



View Profile WWW
« Reply #3 on: June 01, 2022, 06:27:18 PM »

Balancing life & work is difficult! But I've been continuing on the game.
Here is some testing of the yellow player's skills:


I am working on blue player next, which includes a beam weapon.

I'm a designer first and a graphics person second so I expect to come back to these effects and improve them in the future.
Blue player will include a non-autofire weapon and a melee AOE attack.
Follow development on Discord: https://discord.gg/TuEpgJwwDV
Logged

Pages: [1]
Print
Jump to:  

Theme orange-lt created by panic