Getting Started With Into The Realm Of Shadows
I ran into Into The Realm Of Shadows a while back when someone recommended it for procedural dungeon exploration mechanics. What followed was a couple weeks of digging through documentation, trial-and-error with the build pipeline, and a few hours wasted on dependency conflicts that probably wouldn't have happened if I'd read the prerequisites section before installing anything. The core concept is straightforward enough — it's a Unity-based framework for generating shadow-themed roguelike environments with built-in lighting and AI pathing systems — but the actual setup process has a few gotchas that most tutorials skip over. First, make sure you're running Unity 2022.3 LTS or later. The shader graphs in the newer versions are significantly faster and the package manager plays nicer with the dependencies. I tried running it on 2021.3 and hit a wall with the URP compatibility layer within the first ten minutes. Just upgrade. The framework itself is available through the Unity Asset Store under the developer name ShadowRealm Studios, or you can grab the source from their GitHub if you want to modify the core generation algorithms.
Installation and First Build
Once you have the right Unity version, import the package through Window > Package Manager > My Assets. It installs as a standard project package. After that, open the sample scene called "ShadowRealm_Demo.unity" from the Assets/ShadowRealm/Samples folder. If the scene doesn't load properly — which happened to me the first time because I had a leftover PostProcessing volume from an old project — just create a fresh Unity project and import clean. The first real test is hitting Play. The demo should generate a small dungeon with dynamic shadow casting, enemy patrols, and a basic player movement script. If you get a missing script error on the ShadowLightController object, you need to assign the main directional light in the Inspector. I missed that step twice and spent about an hour wondering why my shadows weren't rendering at all. The fix is selecting the ShadowLightController component and dragging your scene's primary light into the "Main Light Source" slot.
Customizing the Generation Parameters
The real value here is in tweaking the dungeon generator. Open ShadowRealm > Editor > DungeonGeneratorSettings in the Project window. You'll see parameters for room count, corridor width, shadow density, and enemy spawn rates. The default values produce a fairly balanced experience, but here's what I learned after running about forty test builds: the shadow density slider doesn't just affect aesthetics. Higher shadow density actually increases enemy detection range because the AI uses occlusion-based line-of-sight calculations. If you crank it past 0.7 without adjusting the patrol pathfinding, enemies start pathing through walls because the navmesh bakes differently under heavy shadow passes. To work around that, I found that baking the navmesh before setting shadow density to above 0.5, then re-baking after the lighting is locked in, keeps the AI behaving correctly. There's a checkbox in the generator settings called "Pre-bake Navigation" that does this automatically, but it's disabled by default and easy to miss. Room count and corridor width interact in a way that isn't immediately obvious. Running more than twelve rooms with a corridor width below two tiles creates bottlenecks where the procedural generation gets stuck trying to connect rooms without overlapping. I resolved this by setting a minimum corridor width of three tiles when targeting fifteen or more rooms, which added about forty seconds to the build time per dungeon but eliminated the generation hangs entirely. For fast iteration during development, keep room count under eight and corridor width at two tiles — generation takes roughly three to five seconds per run.
Get the Full Details

Common Pitfalls and Workarounds
Here's something nobody mentions in the docs: the lighting system uses GPU-based shadow mapping, which means performance drops noticeably on integrated graphics. If you're developing on a laptop without a dedicated GPU, you'll want to switch to the "CPU Fallback Lighting" profile in Edit > Project Settings > ShadowRealm. This reduces visual fidelity but keeps frame rates usable. I tested on a machine with a 5600X and an RTX 3060 and got solid 60fps at 1080p with default settings. The same project ran at about 18fps on my older MacBook Pro with integrated graphics until I enabled the CPU fallback. Another issue that caught me off guard: if you enable multiple biomes in the same scene, the shader variants multiply. Two biomes mean roughly double the shader compilation time on first play. Three biomes nearly tripled it. The workaround is to use the "Shader Variants Stripping" tool in ShadowRealm > Tools > Optimize Shaders. It runs a analysis pass and removes unused variants from your build. It cut my Android export size from 340MB down to 120MB and trimmed editor startup from about ninety seconds to forty-five. There's also a known limitation with save data when using the built-in persistence system. The save format stores room seed values, but if you change the dungeon generator settings after creating a save file, loading that save will produce a mismatched layout. I lost about thirty minutes of test progress this way. The practical fix is versioning your generator settings alongside your save files or simply not changing generation parameters mid-session. The framework doesn't validate setting changes against existing saves, so there's no built-in warning.
Advanced Usage: Custom Enemy Behaviors
Once you've gotten past the basics, the enemy AI system is where things get interesting. Each enemy type extends the ShadowEnemy base class, and you can override the OnShadowDetected, OnLightExposed, and OnPatrol routes methods to create custom behaviors. I built a shadow-stalking enemy that only moves when the player is in darkness by overriding the movement update loop with a simple light-check condition. It took about two hours of writing and testing, but the result was an enemy that felt genuinely threatening in dark corridors while remaining passive in lit areas. The tradeoff with custom behaviors is that the built-in performance profiler doesn't track them well. You'll need to add your own timers or use Unity's Profiler manually to check if your custom logic is expensive. The default patrol system is already optimized with spatial partitioning, so replacing it entirely for a dozen enemies can add significant overhead. If you're building a larger project with many custom enemies, consider implementing your behavior updates in a coroutine or job system rather than in Update.
Export Considerations
If you're targeting PC, the framework works out of the box. Mobile requires some attention to the shadow map resolution. I found that setting shadow map size to 1024 on mobile and enabling cascaded shadow maps only for the main light keeps performance stable at 30fps on most mid-range devices. Going to 2048 shadow maps on mobile dropped frame rates to around 20fps on a Pixel 6. Console exports haven't been thoroughly tested by the community as far as I know, and the developer notes mention that further optimization would be needed for Switch-class hardware. Multiplayer isn't supported in the current version. The generation is client-side only and there's no netcode integration built in. If you need multiplayer, you'll have to implement your own synchronization layer or wait for a future update. The developer has mentioned server-authoritative generation on their roadmap, but there's noETA as of the last public changelog entry.
