INSODIMENSIONStudios
AtmosGuides

Day Cycles and Look Presets

Author reusable atmosphere looks, place them on a day-cycle timeline, and control transitions

Day Cycles and Look Presets

Agentic Atmos separates the time a look appears from the settings that create it. Use one sky actor, a day-cycle timeline, and reusable look presets. This guide walks through that authoring model in Unreal Engine 5.8.

Start with a working sky setup. Duplicate supplied cycles and looks into your own project content before creating variants.


What you author

ObjectTypeWhat it owns
Sky actorAAtmosSkyActorthe sun, moon, sky light, sky atmosphere, height fog, volumetric clouds, sky dome and post-process components. One per level.
Day cycleUAgenticDayCycleidentity (CycleName, Description, Author), the Segments array, a BaseLook, and the RenderProfile its looks resolve content against.
SlotFLightingSegment, an entry in Segmentswhen a look is used, and which look. Authored appearance belongs in its preset.
Look presetUAtmosLookPresetone instanced modifier per category, plus an ordered Effects array.

A modifier is where authored numbers actually live: UAtmosSunModifier carries a FDirectionalLightSettings Sun, UAtmosFogModifier carries an FExponentialFogSettings Fog, and so on for each slot on the preset — Sun, Moon, SkyLight, SkyAtmosphere, Fog, Clouds, SkyDome, PostProcess, LocalFog, GroundFog, Wind, Weather.

Keep timing and appearance separate:

  • A slot is not a look. The only look field you set on a slot is LookPreset. If a preset is not producing the frame you expect, the preset is missing a modifier — never reach for a slot field to force it.
  • An empty modifier slot makes no assertion for that category. It never inherits the previous segment. The category falls through to the cycle's BaseLook, then the actor's defaults; a lower layer can still enable it.

Precedence, most specific first:

slot's look preset  →  cycle BaseLook  →  the sky actor's own defaults

A null LookPreset is legitimate — the slot asserts nothing and BaseLook composes. A null BaseLook is legitimate too. That ladder is what keeps an only-partly-configured level rendering something sensible instead of black.


Author a look preset

  1. Content Browser → right-click → Miscellaneous → Data Asset, and pick Atmos Look Preset as the class. Name it for the moment it describes (LP_Dawn, LP_Overcast_Noon), not for the level it first appeared in.
  2. Open it. The Modifiers category shows one row per sky category. Each row is empty until you create the modifier inline from the dropdown — that object is a sub-object of this preset, so it saves with the preset and is not shared with any other asset.
  3. Fill in the modifier's typed settings. For the sun and moon, the two switches worth understanding before anything else live on FDirectionalLightSettings:
    • Drive = Authored uses the Intensity and Color you typed. Drive = Ephemeris lets the lighting model solve them from the sun/moon position; your dials (IntensityStops, the temperature pair) still apply on top in both modes.
    • In Ephemeris mode, bWritePreAtmosphereRadiometry (default on) writes the body's illuminance before atmospheric extinction so the engine can redden and dim it. Disable it only when you want the model's post-atmosphere result written directly. The sun and moon can choose independently.
  4. Leave a slot null on purpose, and say so in the preset's notes or your own changelog. A ground-fog-only library look with every lighting slot empty is a perfectly good asset — it composes over a cycle's BaseLook. A null slot with no explanation reads as an oversight to the next person.
  5. Fill AuthoredAtSunElevationDeg if you tuned the look at a particular sun height. Nothing reads it; it is provenance, and it is what stops someone judging a 5° golden-hour preset at noon and calling it broken.
  6. Give it a Thumbnail so the Content Browser tile is legible at a glance.

There is a shortcut if you would rather start from physics than from zero: select the sky actor, point Seed Look Preset From Physics (SeedLookPresetFromPhysics) at your preset, and it evaluates the lighting model at the current clock and writes the light groups for you. It marks the package dirty — you still save. It refuses outright, with a log line and no partial write, if the world has no clock; a half-seeded preset is worse than none.


Assemble the cycle

  1. Content Browser → Data Asset → Agentic Day Cycle. Set CycleName, Description and Author, then point RenderProfile at the UAtmosRenderProfile whose renderer entries your looks' RendererTags expect. A null profile is legal and mounts nothing: a physically lit sky with no cloud layer and no celestial imagery.
  2. Optionally set BaseLook to a preset holding the things every slot in this cycle shares.
  3. Add entries to Segments. Per slot you set only:
    • SegmentName — a label for you and for the tools.
    • TimeRange — an interval in HHMM clock units, so 1730 is 17:30. It defaults to the empty range (0, 0), deliberately, so authoring tools must type real bounds.
    • LookPreset — the look.
    • TransitionMinutes, and optionally a TransitionCurve.
  4. Assign the finished cycle to the sky actor's DayCycle property, then save both.

Time ranges do not wrap

A slot whose minimum is greater than or equal to its maximum matches nothing, at any time, and contributes no coverage. So a night that spans midnight is two slots — for example 0–700 and 2000–2400 — both pointing at the same preset. That is one authored look with two windows on it, not duplicated content.

The day is still a ring: the array is sorted ascending by start time, and the last slot's outgoing transition targets the first. That is the 2400 → 0000 boundary.

Check coverage before tuning the lighting:

  • Check for gaps. CoversFullDayCycle and FindCoverageGaps on the cycle are the authority; an empty Segments array reports the whole day as one gap.
  • A one-slot cycle can resolve its one look at every hour. Coverage checks still inspect the authored range: use a 0–2400 window for an explicitly full-day look. Read the saved slot table before changing modifiers when an hour shows an unexpected look.

Transitions

TransitionMinutes uses clock minutes rather than HHMM arithmetic — 60 is one in-game hour — and it describes the outgoing crossfade: the window is the last TransitionMinutes before this slot's TimeRange maximum. It is not centred on the boundary and it is not an incoming fade. Zero is a hard cut. TransitionCurve (a UCurveFloat, null = linear) reshapes the ramp.

Two things do not blend, by construction, and both switch at the transition midpoint:

  • Anything without a continuous identity — a formula class, the Drive mode, the radiometric convention, a shadow-cascade count, a renderer tag selection. A storm that mounts its own cloud pack mounts it whole; there is no half-mounted pack.
  • The post-process grade is handed over as a pair, not a lerp. The colour/contrast/bloom blob has no interpolator, so the two sides ride on two post-process components at weights 1 and the transition alpha. You get a dissolve, not a pop — but if a light mode pops mid-crossfade, that means two adjacent presets disagree about Drive or bWritePreAtmosphereRadiometry. Make them agree, or accept the switch at the midpoint.

Set the last slot's TransitionMinutes to 0 when it shares a preset with the first slot — otherwise it crossfades into itself.


Effects adjust; categories state

Effects on a preset is an ordered array of UAtmosEffectModifier. It is deliberately not part of the composed look: composition is a pure function of authored data, while effects are applied per refresh and weight-scaled by where the transition sits. A god-ray dial folded into the composed look would fade with nothing and blend with nothing.

Effects run top to bottom, and two effects touching one field is legal — array order decides. Put baseline lighting in a category modifier; use effects for adjustments.


The weather look layer

A UAtmosWeatherType can carry its own LookPreset. When that weather is active, the resolver lerps per category between the composed day look and the weather look, weighted by severity, and only for the categories the weather look actually asserts. Continuous settings blend; discrete selections retain their switch behavior. So an overcast look that asserts only SkyLight and Clouds flattens the ambience and thickens the deck at full severity while leaving your authored sun grade alone.

Severity 0 is an exact identity — a clear sky is bit-identical to the same instant with no weather look at all — so you can leave the weather system running while you author.


Console commands

Author with the clock held still; judge one time at a time.

CommandWhat it does
AT.Time.Pause 1 / AT.Time.Pause 0freeze / resume the world clock
AT.Time.Set 06:30jump within the current day; accepts HH, HH:MM, HH:MM:SS
AT.Time.Advance 3600advance by N in-game seconds; negative moves backward
AT.Time.Dilation 10.0set the clock's rate multiplier
AT.Time.Dumpprint world time, apparent time, day, time source, dilation, pause state, day length

If an external system owns the clock, a manual AT.Time.Set holds only while the clock stays paused — resuming lets that driver overwrite it on its next push. Move the driver for a durable change.

Edited a preset and the viewport did not move? Click Refresh Now on the sky actor. The apply path can skip unchanged state, while supported editor property changes also have refresh notifications. Confirm the current slot's LookPreset points at the asset you edited and the clock is inside the intended window; an unreferenced preset does not affect the frame.


Author through the toolsets

The editor module registers toolsets that an agent (or your own editor scripts) can drive. The authoring-relevant ones:

  • AtmosAuthor — CreateDayCycle (lands with no segments, deliberately: a fabricated dawn/noon/dusk set would be authored content masquerading as a default), CreateSkyProfile, SetAssetField for one reflected field on a saved asset (RenderProfile, BaseLook, CycleName, the moon-path pin), SetAssetThumbnail, ListAssets.
  • AtmosSegment — ListSegments and GetSegment to read, AddSegment / SetSegmentTime / RemoveSegment to write (HHMM window, transition in real minutes), and DiffSegments — the cheapest way to answer "did my write land, and did it touch anything else". PromoteSegmentLooksToPresets migrates a legacy cycle whose looks were authored inline onto real presets; always dry-run it first.
  • AtmosValidate — ValidateAsset for schema and semantic lint (it catches slot overlap and gaps in the 0–2400 ring), EstimateSegmentCost for cost buckets, and DiagnoseAuthority for "who is actually driving this frame", before changing a value.

A preset's modifier slots are sub-objects rather than content paths, so SetAssetField cannot reach into them. Create the modifiers in the details panel, or from editor Python with unreal.new_object(<modifier class>, outer=<preset>) — the outer is mandatory, or the object is not saved with the preset.

Discover the live tool ids and argument schemas from the editor's toolset registry rather than assuming a spelling; the registry is the authority.


Next steps

Add a weather look, tune exposure, or use the agent workflow. For help, visit Discord support.