I’ve been playing through Saros by HouseMarque this week and have really been enjoying it. Fantastic studio and they’ve put out consistently great games over the years. Even when playing my very favorite games, however, I find it’s pretty hard to turn off my ‘developer brain’ and quit asking myself “how’d they do that?”.
Well, one particular question has stuck with me for a couple days, now, and I’m just curious what this community might think. Much like it’s spiritual successor, Returnal, Saros is all about projectiles. This time around, they’ve added a few new projectile types and there is one that follows along the curvature of the environment and I’m wondering… how’d they do that?
I found some decent footage here on this streamer’s video at 40:39. The enemy creates a ring of projectiles (I’ve seen up to ~500 at once from multiple rings) and they move outward, seemingly hovering just above the ground, going over even small undulations in the environment, until they hit a player or wall, then they are killed.
Obviously, they’ve got lots of custom engine code in their UE5 branch so I’m not looking for a step by step, just curious how this might be architected in a way that wouldn’t cripple performance. I think it’s safe to say that all other projectiles in the game are ‘flying’ using something like a projectile movement component but in this one case… I’m not so sure.
A few thoughts I had and please feel free to correct me if you disagree…
For as many projectiles as can be on screen, they can’t be constantly colliding with the ground and checking the impact normal to determine bounce or hit. That’s just way too inefficient, right?
So, do they query the environment once on the start of the ability and somehow determine and pass heightmap data into the projectiles, which they will individually use to modify their ‘flight’ path? Could splines be involved?
I remember when watching a Returnal dev doc, years ago, they mentioned some sophisticated fluid dynamics system which handled all the foliage and enemy tentacle VFX so maybe that’s driving this but still… how would you get that data into the projectiles in an efficient way?
Love to hear your thoughts!