Die to Survive - Railshooter

After a lot of thinking and testing how to implement some sort of traps i finaly found a working solutiuon (at least i hope so).
The problem was to use traps that are need to be destroy to start a next event. Also to draw attention, stand out to be clear identify and be destructable.
I think i found a pretty nice way to do all of this as you can see in the short video.

Edit:
Added a stand, so the poor flamers do not fly weird in the air :slight_smile:

2 Likes

A try to spawn statue like enemies, so spawn them in place and make them noticable. I kinda like it, but also it somehow looks not right.

2 Likes

After testing a lot of different things, it feels like i have found a pretty nice solution to make it look better. Still need some work but this one feels way better.

2 Likes

Impressive but perhaps unmanagable. Sometimes it’s useful to visualize your data straight onto the level to see what you are doing, but, there’s so much going on you can barely navigate.

At such times It’s often more useful to remove the visual bloat from the level (those colored events on rail?) and move them to data, since data can be visualized just when you need it and in any format you need it.

A while ago I shamelessly advertized my Event Manager plugin which could help calming your mind (and interface).

The idea behind it is that you can set up “action, reaction” in your level for just any event, from simply moving over the rail to a custom event the mind comes up with. It uses the “observer pattern” to do so.

Any action, either simple or advanced (Player moves 20% over rail, kills enemy X, did not find Y), can be set up beforehand, like:

A benefit is being able to centralize your event / reaction structure to code, and minimize the clutter shown on the level editor.

I think it’s silly to display “take damage” when you visibly walk through the trap. Maybe it makes more sense to display where the damage came from (a blood texture bottom right or left etc.) so that the player can immerse in the environment and receive feedback on positions he gets damaged from (so UI position functions as useful feedback).

You might find this useful then:

Math question. finding distance to the edge of a plane in direction from center. - #12 by Roy_Wierer.Seda145
I also included it with my Utility Plugin

But the player walks right through it? That doesn’t seem right. If he needs to destroy the statue, maybe spawn enemies until the statue is destroyed, and when destroyed, walk to the next part? Else the player could just run forward and ignore the fire.

The flame statues do get the attention. I like that they are nearby while the enemies spawn. The player will feel the tension “should I shoot the flying ones, or the statues”, while getting near the statues.

In the current scene, I don’t think they have a purpose. They’re there, you can see they’re there (it won’t be a surprise), then after X delay they start walking like known (zombie like) enemies. Makes me wonder, what makes them special? They don’t run super fast, don’t behave differently, I could see them realllly early as a statue, what does it do to me?

I think maybe, that if they had surprised me in this particular scene, they’d have had a place. Like being invincible as stone, running super fast 4 at once, or… maybe like the Dark Souls 1 Gargoyles, 2 (smaller threat) out of 6 (large threat) early bosses. maybe, they’d have a special power. Maybe, they’d totally surprise me being camouflaged as part of walls, but rn they’re just regular zombies.

At the point you shoot the arms off and they start kicking, this might have an unintended effect on the public. To me it is amusing, because it reminds me of the Monty Python scene “just a flesh wound” , a comedy of the hero defeating the black knight (by removing all his limbs), and the knight just won’t give up. What I’m trying to say here is, maybe, who is this enemy who turned from a statue, to zombie, to a limbless kicking uhhhh… The expectation of a zombie is, it tries to eat me. the expectation of a statue is, it’s a statue. but what just happened? A statue just tried to kick me like a zombie? I’m just confused? Maybe not amused or surprised.

There’s something odd going on top left with em disappearing, and a “statue > enemy” kind of respawn going on . You could use the same enemy character as a statue without respawning anything, fixes the glitching. The animation blueprint, the AI logic tree could stick to a “wait” state until triggered.

The “Headshot” sound effect… It was satisfying in old Quake… UE tournament? Like “headshooot” “double killll” “multikilllll” but on the video it repeats “headshot” all the time which I think maybe is too easy or too repetitive to do good. It sounds a bit annoying. Does it have a gameplay purpose that I don’t see on the UI? Point is to make it satisfying. In my case (playing a rail shooter with dismembering limbs) I’d probably find splatter (gore) of headshot more satisfying than repetitive sound effect.

1 Like

This looks so incredibly professional! I look forward to following this!!

1 Like

Thank you for all the suggestions and feedback :heart_eyes:

The event manager was one of the first things i created. I constaly update it if i need to.
It is as you will the heart of the whole game. Beside the movement spline the player move on i have also a event spline there.
I simply use a enum where i can select what should happen at certain event(spline)points. It is really easy to update this way.
Did not add it for traps now because i still test how to use it.

Defently something to consider to change, thank you. This is also still the way as it was at the beginning.

I wanted to introduce it this way, this is why you need to destroy them the first time. They apear later again but as you move, so if you do not destroy them you will take damage.
The same goes for the statues, the will often there but not always spawn. Also the ammount will change based on difficult(at least that´s the plan right now).

Love this scene, it is the best in the whole movie :grin:
I need to have more animations first, basicly more like placeholder animations. There is a system in place the enemy attacks based on dismembering.
The only thing they do other than zombie enemies at the moment ist that they do not stop if take damage and have more health.

You are absolutly right with this, just sounds anoying. I can remember a pretty old sidescroller from the NeoGeo with this “Bonus … Bonus … Bonus…” made me want to stop playing after a short time :rofl:
Was struggling with this a lot, the more often i hear it the less i like it myself and want to change it. Before i hade a rnd roar if hitted in the head, it is mor like a test for now.

1 Like

Thank you, glad you like it.

Ah I see, quite a complex system is in place :slight_smile: but configurable from the editor. I went the other route doing configuration in code with delegates… Basically a central subsystem collects info (X % on spline, player killed Y, player did this and that but not Z), then info listeners act on their own if they desire to, for a combination of info. So the editor looks completely empty besides some overlap volumes and if I’d desire I could still output the info as a graph or export it in different ways.

Another thing I found useful in the past was to color overlap boxes. Made one system I call EcoS that manages my character AI when they walk through overlap boxes, where they can get controlled by a hive mind (player goes to a field, he might collect apples etc.). Another system would change the background music when walking through other overlap boxes. Became essential to implement some editor tool / editor debug visualizations to make clear what is what. So in your situation, I thought, it might be helpful to write a little editor tool to say “show only overlaps of type X, with color blue” etc.

I got some code for that from old times, but might still work. You could do something like:

#if WITH_GAMEPLAY_DEBUGGER
FString ABGMTriggerVolume::GetDebugInfo() {
	FString DebugString = GetName() + "\n";
	DebugString += "TriggerType: " + UEnum::GetDisplayValueAsText(BGMTriggerVolumeMode).ToString() + " \n";
   // DebugString += ...

	UKismetSystemLibrary::DrawDebugString(GetWorld(), { 0,0,100 }, DebugString, this, DebugColor);
	//UKismetSystemLibrary::DrawDebugBox(GetWorld(), GetTriggerArea().v1, GetTriggerArea().v2, DebugColor, GetActorRotation(), 0.0f, 10.0f);
#if ENABLE_DRAW_DEBUG
	::DrawDebugSolidBox(GetWorld(), GetTriggerArea().v1, GetTriggerArea().v2, GetActorRotation().Quaternion(), DebugColor.WithAlpha(10));
#endif

	return DebugString;
}
#endif // WITH_GAMEPLAY_DEBUGGER

FTwoVectors ABGMTriggerVolume::GetTriggerArea() const {
	const UBoxComponent* Area = Cast<UBoxComponent>(GetCollisionComponent());
	return { Area->GetComponentLocation(), Area->GetScaledBoxExtent()};
}

I remember implementing FGameplayDebuggerCategory subclasses for that in an editor code module, so I could pick whatever I needed to be visualized. Anything else would be hidden (basically with a checkbox on the category.). If you need it I can share the code.

That linked video shows just what it is and how to do it.

I see you already got some custom icons going on on that screenshot. That helps too.

1 Like

This was very importnat to me to have. All in cpp but have something to see and to change what i can see.
For example: If i add another point to the spline i do it a way so just another array position will be build at this point. Just some automatic thing i have a better overview, that is why also are numbers over the splinepoints. This way it is more easy to find a certain eventpoint.
I also use custom meshes just for debug at this points. The camera for example shows also into the direction i rotate the point to. So i can easy see at wich spawnpoint i look at this event point.
Just all a little to complex for only doing this in code without seeing within the editor.

Also i am one of the people who love “wysiwyg” :grin:

1 Like

Thank you for the snipet. Was just looking into this as i remembered i already use something similar to draw the explosion radius.

1 Like

After upgrading to UE v. 5.6 the copy skinweights with Nanite still don`t work.
Not sure why, but just can´t get it to work. So basicly i can use Nanite with a workaround for my dismembering or stay with non Nanite models sadly.

As i already work on a second extendet playtest i guess i need to stick with the old dismembering methode.
Still time before i need to decide this finally, because i don´t want to do all enemy models twice.

But i have now the difficulty settings working. Not with simply increase health, instead i go with spawning more and/or different enemies (increase helath is also in place just in case i wanna use it).

I use data assets for easier control, changes and overview. All data is stored in them.

Edit:
Here is a video how the dif settings should work in the end.