Here's a release video showing some of the changes:
Recent community posts
1.3 Release Notes:
- Added SpaceDivider Generator which allows for generation of a rectangular shape with subdivided internal rooms.
- Added custom icons for the different ScriptableObject types for easier identification in the Project window.
- Updated Editor script for BoardGenerator to hide daily seed option when useRandomSeed is true.
- Fixed Clear and ClearAndGenerate functionality for CubeWorld example
- Fixed PerlinNoise generator to use random seeding.
- Fixed some scripts that weren’t using Strata namespace.
- Some small documentation fixes.
Thank you so much Nikki! I might well do an expanded version, my (distant, fantasy) project I'd like to do at some point encompasses multiple different things like this which you can explore and take pictures in, so this or a modified version of this might become part of that.
I "cheated" a bit on this because I used my own procedural generation tool Strata for the level layouts with some small tweaks, but that would have taken a lot of time if I'd done it from scratch. So that would be it, since I spent probably about 8 weeks full time building that outside the jam and getting it to a level of polish where it could be released commercially.
That being said, the time was pretty evenly distributed. I spent a fair amount of time wrestling with Unity's HDRP to get the volumetric lighting working, since it's new. I had some nice effects going with volumetrics off the floating light panels as well (my original idea) but it ended up being too expensive performance wise, even on my very fast computer, so I backed off and just went with a single directional volumetric.
I spent a good amount of time on the audio as well, trying to create something that felt varied and interesting while hitting the right mood over a long length of time.
I think I spent about 24 work hours overall on this, not including the Strata procedural level tool time. I also re-used the menu template which was something I built for my day job at Unity, that's freely available. So lots of "cheating" :)
I'm planning to do some post-mortem tutorial style videos soon for my YouTube channel here: https://www.youtube.com/channel/UCxRW28Si8_Vb27-IDhFMMKQ so keep an eye out for those and I'll go into more detail.
Thanks so much for checking it out!
I've just uploaded Strata 1.2! Thanks so much to everyone who's been emailing me at firstname.lastname@example.org to raise bugs and various quality of life issues. I've addressed some of those here and tried to test everything pretty thoroughly. I also validated that this does work with the 2018.3 beta for those who are upgrading to get nested prefabs (which are great btw) but it is still exported from 2017.2 for compatibility for those on earlier versions.
- Added SimpleFill Generator: This overwrites the entire grid with a character. Useful when you want to start with a filled grid and dig out.
- Added PerlinNoise Generator: Simple noise generator, no smoothing or post-processing, just fill the grid with noise, either overwriting what is already there or filling in empty space.
- Added CaveDigger Generator: Another simple generator that does a random walk clearing out a pre-defined portion of the map. Will continue moving randomly and creating empty space until a desired percentage of spaces have been cleared this pass (not including other generator passes).
- Added PathVisualizer component: This records information about the direction the path has moved in and draws an arrow Gizmo in the scene view, along with the name of the RoomTemplate that was drawn. Works with RoomSequence and PlatformerRoomChain. Useful for debugging generation.
- Cleaned up some small bugs in the example scenes.
If you want to send me an email I can actually send you some code that I wrote that builds a turn / grid based navigation map from the boardGridCharacters data, instead of reading from the Tilemap. It works pretty well and isn't tightly coupled to Strata, it just reads the data and acts on it on it's own. Send me a mail at email@example.com and I can send it to you.
So just to drill in a bit, how is that you want to use this data? You're using it for navigation of enemy agents?
I agree that writing this data somewhere in a usable form would be a good thing, just need to think precisely how and what data will be needed. The main info you're interested in is the sequential numbering of rooms? You're right though that for stuff like the RoomTiler which spreads in multiple directions a list of coordinates won't help much.
Overall something that I am starting to see is that generating a kind of map/graph at one level of abstraction and then moving down to turn it into tiles makes a lot of this stuff work better, so maybe it makes sense to generate a graph or map of the level and save it somewhere for other gameplay related purposes.
Definitely thought provoking feedback!
Awesome! Glad to hear you're getting more consistency.
Thanks for the heads up re the missing BoardGenerationProfile and the additional null check, I'll add those.
I'll take a look at how to replace the lost functionally. I might actually add a new generated GameObject in the scene that persists after generation and holds info about what was generated, to get that out of BoardGenerator, since there is still some info being written back to BoardGenerator like empty spaces. I might store the final generated grid in there too that BoardGenerator reads out to Tilemap. I am currently using a temporary object with a new RoomChain component on it but that gets destroyed when generation is done. I might need something more persistent.
Would something like that work for your purposes do you think?
thanks again for the feedback!
I just shipped an update (1.1) that replaces RoomChain with RoomSequence, which so far is much more robust. Also added RoomTiler which is sort of Wang tile inspired and spreads out along any open exit, as opposed to generating a linear sequence. If you have a chance to try it out I'd love to hear further feedback. Details here:
I've uploaded version 1.1 of Strata! Here are the release notes. Huge thank you to keybol and r618 for their excellent and helpful feedback.
I've taken both of your feedback and bug reports on board and hopefully fixed everything. I completely rewrote RoomChain and replaced it with RoomSequence and RoomTiler and I think they are both much much better, including addressing and fixing the previous problems. I also included the 3D demo scene I showed on YouTube and added a new TunnelBrancher generator type that spawns sub-tunnels while it tunnels.
1.1 Release Notes:
- Replaced RoomChain Generator and with RoomSequence and a RoomChain component. RoomChain Generator proved unreliable in generating chains of desired length. New approach is much more robust and always achieves minimum chain length. Also adds support for placing start/end rooms from a RoomList at the end of the RoomSequence.
- RoomChain component is a data holding object that is created and destroyed during generation. It tracks progress of RoomSequence and RoomTiler generation so that that data is not stored in BoardGenerator, making resetting cleaner and easier.
- Added RoomTiler. RoomTiler is like RoomSequence but instead of spreading in one direction spreads in all available directions marked by exits for a number of iterations. Grows buildings with connected paths branching off from a center.
- Added TunnelBrancher: This is like WanderTunnel but has a percent chance to spawn new WanderTunnels every step. Useful for generating branching tunnel systems.
- Added turnNoiseValue parameter to WanderTunnel, this flips the generation back and forth between preferring to tunnel horizontally first or vertically first based on a random percentage roll, this makes for more irregular, squiggly tunnels. Keep at 0 for clean 90 degree turns in tunnels. Also implemented in TunnelBrancher.
- Moved some source comments into Tooltips, not all yet.
- Fixed a path bug when setting up profile for first time
- Added simple example scenes for TunnelBrancher, RoomTiler and RoomSequence to MiniRogue example.
- Added Experimental CubeWorld 3D Example Scene: This demonstrates using Strata to spawn non-Tilemap tile data, in this case a world made of cubes. Note that all editing must still be done on 2D tilemaps, 3D editing is not supported.
Hmm so even calling ClearLevel the state is not reset? That's weird. There may be some parameter I'm failing to reset. For additional clarity, are you doing this in Play mode at Runtime or in Edit mode or both? Thanks for your patience, I'll take a look at your repro case and get back to you.
Honestly I probably should just move the state-ful stuff out of the BoardGenerator and into a function like almost everything else. Gonna have a think about it.
Thanks so much for your interest in Strata! If you need support or have questions, feel free to make a post here but I would also appreciate an email to firstname.lastname@example.org so I don't miss your message and can attempt to reply quickly.
Quick update, I think the issue was that for some reason I failed to call ClearLevel() during the loop in BuildLevel(), leading to old data on subsequent loops. I think this was an attempt to optimize gone wrong. Could you please try adding a call to ClearLevel() to the beginning of the for loop in BuildLevel (around line 203 of BoardGenerator) and let me know if that solves this issue for you? It looks good on my end, if it works for you I'll ship the fix.
Thanks again and sorry I missed the earlier response. I'm new to using Itch for this purpose.
Extremely sorry I didn't see this, somehow I didn't get an email notification on it from Itch. Please email email@example.com next time if you don't hear from me and I'll get right back to you.
Thanks very much for pointing these issues out and the thorough bug report. I'll look into them.
The switch to using Coroutines actually came about later in development since I did a prototype which combines it with Aron Granberg's A* asset and it was useful to be able to wait for generation to be complete before generating the NavMesh, so I figured others might want to do the same.
Honestly the looping/discarding in the RoomChain generation is still not totally satisfying to me, it was created to guarantee chains of a certain length, since sometimes it's would just throw up very short chains. Might need a deeper rethink for that. The PlatformerRoomChain at least guarantees reasonably longer chains without this approach.
hey, yes I didn't ship the 3D example since I wasn't sure if there would be interest but am happy to send you what I have if you email firstname.lastname@example.org, if you want to compare to what you have. Glad you got it working!
I'd like to introduce a new project I've been working on that I aim to release soon on the asset store, it's called Strata. Any feedback would be much appreciated!
Strata is an easy to use procedural toolkit for generating 2D levels which use a combination of hand-authored and procedurally generated content. It works in the Unity editor or at runtime without additional programming. Strata works with Unity’s native 2D Tilemap tools allowing you to hand-author pieces of levels and arrange and combine those pieces in interesting ways.
The design philosophy of Strata is strongly inspired by both classic roguelike dungeon crawler design approaches along with the newer school of action roguelike / roguelite games. To this end the project contains demos both for a classic top-down roguelike dungeon generator, and a 2D platformer built from a connected chain of handmade rooms. Both serve as good starting points for your own creations.
Programming procedural level generation tools can be complex and difficult, and with Strata I hope to open the creation of procedural content to artists, level and game designers and other non-programmer creators.
Here are two videos, one is a short overview, the second is a ~30 minute walk through getting started with Strata.
Setup Guide for Strata Easy 2D Level Generator For Unity
Overview of Strata Easy 2D Level Generator For Unity
How It Works
Strata works by generating level data into a grid of ASCII characters in multiple passes using what we call Generators. Each Generator contains a procedural content generation algorithm ranging from the simple, like randomly scattering 100 instances of an object, to the complex, like generating a linked series of dungeon rooms. The Generators run sequentially. This means that each new Generator’s output is applied to the previous Generator's output. This means, for example, that we can choose to generate some organic cave shapes, carve out a series of rectilinear rooms from them and then scatter objects within the empty spaces of the result. The choice of Generators and the order that the Generators are sequenced in via the Unity Inspector interface can result in significantly different generated levels.
One of the common problems in procedural generation is that you can end up with results which while technically unique, all feel the same to the player. This is sometimes referred to as the 'Thousand Bowls of Oatmeal' problem. Yes, they're all different, but who cares? To combat this, Strata supports the inclusion of hand-authored elements within the generation process so that you as the designer can choose to have as much or as little randomness as you prefer, and insert hand-authored set pieces and features for your players to discover.
- Generate complex, varied procedural levels without writing any code
- Hand author content to integrate into your procedural levels using Unity's Tilemap tools
- Multiple levels of random chance in generation: hand place items with a chance to spawn between multiple choices in authored rooms
- Generate levels at runtime for new levels on each playthrough, or generate at edit time in the editor, polish the output by hand and save.
- Supports deterministic seeded randomness and daily challenge style play
- Generators Included:
- Linked top to bottom room series for platformers
- Middle-out room series for top-down dungeon crawlers
- Cellular automata for organic cave shapes
- Randomly placed rooms connected by tunnels (traditional ASCII roguelike style)
- Random scatter X objects
- Tunneler to connect multiple previous Generators
- Save full tilemaps and feed them back into the Generation process (randomize existing levels)
- Place objects within connected space (place player start and level exit)
- Random scatter hand-authored chunks
- Mirror / Symmetry generators for making ‘man-made’ feeling spaces.
- Flood fill
- And more coming soon!
- Linked top to bottom room series for platformers
- Professional video tutorials, text documentation, and well commented C# source code.
- Easy to extend for programmers with a modular framework based on Delegation pattern and ScriptableObjects
- Rogue-lite platformer example scene
- Top-down dungeon example scene
- Just does one thing, generates map data that you can use in lots of ways, not a full game project. Doesn’t include a bunch of junk you don’t need!
What Strata Is Not
Strata is not a game-kit, engine or complete game project. It's designed to support multiple types of games which use 2D tile-based levels and procedural generation. The idea here is that you can start with strata as a procedural generation toolkit and build your game alongside it, whatever type of game it is.
It’s also not a cookie cutter, samey, single approach, single algorithm dungeon generator. You can think of Strata as a set of creative tools, not a replacement for your creativity in designing procedural levels and gameplay.
I have decided to price Strata affordably initially since it's new and I want to get people to try it out, so the target price will be 8$ USD. Due to the modular structure of the project, I intend to introduce new generation algorithms and examples and as I do, I will raise the price.
Full disclosure: I've made a new account for this project to differentiate from my 'official work' for Unity as an Online Evangelist. This is a purely personal project for my independent company Mirrorfish Media Inc which is in no way affiliated with Unity Technologies.