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
| Object | Type | What it owns |
|---|---|---|
| Sky actor | AAtmosSkyActor | the sun, moon, sky light, sky atmosphere, height fog, volumetric clouds, sky dome and post-process components. One per level. |
| Day cycle | UAgenticDayCycle | identity (CycleName, Description, Author), the Segments array, a BaseLook, and the RenderProfile its looks resolve content against. |
| Slot | FLightingSegment, an entry in Segments | when a look is used, and which look. Authored appearance belongs in its preset. |
| Look preset | UAtmosLookPreset | one 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 defaultsA 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
- 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. - 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.
- Fill in the modifier's typed settings. For the sun and moon, the two switches worth
understanding before anything else live on
FDirectionalLightSettings:Drive=Authoreduses theIntensityandColoryou typed.Drive=Ephemerislets the lighting model solve them from the sun/moon position; your dials (IntensityStops, the temperature pair) still apply on top in both modes.- In
Ephemerismode,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.
- 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. - Fill
AuthoredAtSunElevationDegif 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. - Give it a
Thumbnailso 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
- Content Browser → Data Asset → Agentic Day Cycle. Set
CycleName,DescriptionandAuthor, then pointRenderProfileat theUAtmosRenderProfilewhose 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. - Optionally set
BaseLookto a preset holding the things every slot in this cycle shares. - 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, so1730is 17:30. It defaults to the empty range(0, 0), deliberately, so authoring tools must type real bounds.LookPreset— the look.TransitionMinutes, and optionally aTransitionCurve.
- Assign the finished cycle to the sky actor's
DayCycleproperty, 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.
CoversFullDayCycleandFindCoverageGapson the cycle are the authority; an emptySegmentsarray 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–2400window 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
Drivemode, 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
1and the transition alpha. You get a dissolve, not a pop — but if a light mode pops mid-crossfade, that means two adjacent presets disagree aboutDriveorbWritePreAtmosphereRadiometry. 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.
| Command | What it does |
|---|---|
AT.Time.Pause 1 / AT.Time.Pause 0 | freeze / resume the world clock |
AT.Time.Set 06:30 | jump within the current day; accepts HH, HH:MM, HH:MM:SS |
AT.Time.Advance 3600 | advance by N in-game seconds; negative moves backward |
AT.Time.Dilation 10.0 | set the clock's rate multiplier |
AT.Time.Dump | print 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,SetAssetFieldfor one reflected field on a saved asset (RenderProfile,BaseLook,CycleName, the moon-path pin),SetAssetThumbnail,ListAssets. - AtmosSegment —
ListSegmentsandGetSegmentto read,AddSegment/SetSegmentTime/RemoveSegmentto write (HHMM window, transition in real minutes), andDiffSegments— the cheapest way to answer "did my write land, and did it touch anything else".PromoteSegmentLooksToPresetsmigrates a legacy cycle whose looks were authored inline onto real presets; always dry-run it first. - AtmosValidate —
ValidateAssetfor schema and semantic lint (it catches slot overlap and gaps in the 0–2400 ring),EstimateSegmentCostfor cost buckets, andDiagnoseAuthorityfor "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.