Skylorn Bound Together [Sci-Fi Open-World Co-op Action RPG]

Hi all, I’ve been solo developing a sci-fi open-world co-op action RPG in my spare time for the past couple of years, and am planning to publish it on Steam.

Gameplay Trailer:

You can Wishlist the game on Steam if you like it!

Game Summary:

Skylorn: Bound Together is a co-op open-world action RPG. You arrived from a distant colony and explore a post-apocalyptic sci-fi fantasy world, battle enemies, uncover mysteries—alone or with friends.

The world of Skylorn lies in ruins. Failed experiments to incorporate magic into their technology have devastated the lands, leaving behind crumbling cities, mutated areas and hostile machines.


Features:

  • Cooperative multiplayer, all players progress in the same world, shared inventory
  • Open-world (2kmx2km map, densely packed)
  • Skill system allowing to learn awesome spells that are fun to use
  • Fast paced combat system

The two most important points for me were that the game is cooperative multiplayer (up to 3 players) and open-world. I was most inspired/motivated by the piranha bytes games (Gothic3 and later Elex) and always thought it would be cool to be able to play such a game with friends. That was the reason for me building Skylorn Bound Together. The world is 2kmx2km densely packed, and the focus is on exploration and combat.


Feel free to ask any questions! :slight_smile:

1 Like

Reserved, planning on adding a post on some optimization work I’ve done to optimize the game :slight_smile:

The game is build with UE 5.4.4 (I stopped updating, since while every update usually improves things, it also breaks things which takes time to track down and fix). I use Nanite, Lumen GI, SSR instead of Lumen reflections and Distance Field shadows (+capsule shadows) instead of Virtual Shadow Maps. I measure the performance at 11 predetermined points on the map in a shipping build, so that I can check which settings work best.

The game is GPU bound, and on an RTX 4080 at native DLAA 4K rendering and highest settings (highest game settings, e.g. lumen caps out at what would be high), the average frame rate (of these 11 points) is 77 with a minimum of 66

Average Framerate Minimum Framerate Nanite? Resolution
77 66 Yes DLAA/Native 100% 4K
88 75 No DLAA/Native 100% 4K
107 99 Yes DLSS 66.6%
118 107 No DLSS 66.6%

If nanite is disabled, it switches to lower poly fallback meshes with lods. Without nanite it runs about 14% faster, but looks slightly worse. Since I can hit my target framerate with nanite enabled, I keep it enabled by default but added an option in the video settings to turn it off.

Single Layer Water

The single layer water is something that costs quite a bit performance. Its in areas with water where I get my lowest performance. I always run the water at half res (r.Water.SingleLayer.RefractionDownsampleFactor 2) which saves some performance. And from render doc it looks like it requires a separate shadow pass which is another rather high cost, but can be disabled by console (r.Water.SingleLayer.DistanceFieldShadow 0).

For the water quality, at high settings I disable shadows on it, at medium I switch to opaque water that samples the height and color of the Landscape RVTs to fake opacity and at low I switch to a fully opaque material.

Scene 1 Scene 2 Quality
69 66 Highest
72 72 Disable Shadows
76 74 RVT Opaque Water
77 74 Simple Opaque Water

Here is the visual comparison between the qualities, from top to bottom is highest to low

Scaling to lowest settings

If I scale down to low settings (Full HD rendering res, TAA, no nanite, no lumen, no foliage clutter, low quality of the Landscape VHM, adding a single lod bias on the textures), but keeping shadows, it runs at around 3ms GPU time and around 30FPS on a GTX 960 (but showing a warning that its out of 400MB VRAM on that GTX 960 and will run extremely slow :sweat_smile: )

This is how it looks at that settings:

I recently found out why my listen server CPU time increases a lot when a client joins (from roughly 5ms on an Ryzen 3900X to 10ms when a client joins). I had around 7000 collectible items on the map, all set to replicate and even though they were set to DormantAll, they still used up around 4.5ms time of the server (GameNetDriver time below in UnrealInsights).

But this was easily solved by not replicating them, since the only reason I set them to Replicate was that when they are collected, they should be removed on all clients. And I thought that the actor needs to replicate so that I can send a reference of it between server and client (client telling the server which item it wants to collect, server telling all the clients which item to remove). But looks like you can still send a reference of a specific actor between server and client, even though that actor does not replicate so it was unnecessary to replicate them.

In progress join also works, since each collectible item has a unique String GUID and I store all collected item GUIDs in a replicated list (I originally needed that replicated list so that clients can save the game as well). So when a client joins, each of their collectible actors checks whether their GUID is in that replicated list, and if so removes itself.

Hey there @chrudimer,

Hope you’re well and having a wonderful week so far :slight_smile:

Not sure how I missed this thread for so long but this looks great so far. Especially the environment itself. I rarely see sci-fi game that has such a pretty and colorful nature-filled environment. So pretty :smiley:

I look forward to watching this as it develops - happy developing until next time!

1 Like

Hi there,

yeah I’m doing great thanks, getting lots of stuff done :slight_smile:

Yesterday I added loading screen tips like this, would maybe need to do another cosmetic pass on it, like adding a border around the image

And just now I finished a pass over all NPCs, giving them different heads (from metahumans) and generating any missing speech. For speech generation I used an open git repo that includes a pytorch ai model that can synthesize speech from text, with different voices. Its the same repo I started using 2 years ago, so there are likely better options today, but I don’t want to spend the time now to get something else to run :wink:

The bulk of the game is done (I’m planning to release it end of this month), now I’m mainly focusing on balancing, ease of life, fixing glitches and adding missing descriptions :slight_smile: