Photo by Sebastian Unrau on Unsplash. Illustrative landscape, not a generated game world.
A player finds a forest, builds a bridge and saves. Tomorrow, the trees return in the right places—but the bridge is gone.
That is the difference between reproducing a generated starting world and restoring a played world. Both matter, and one integer should not quietly stand in for both.
Here is a proposed save-record sketch for a small procedural prototype:
{
"world_recipe": {
"seed": 42,
"generator_version": "forest-v3",
"content_version": "assets-v7"
},
"player_changes": [
{
"entity_id": "bridge-river-crossing-01",
"operation": "built",
"position": [12, 0, 8]
}
],
"quest_state": {
"river_crossing": "complete"
}
}
This is a design example, not an engine API or a production-ready save format. Its useful property is separation: the initial recipe and subsequent changes have different responsibilities.
What the seed actually buys you
Unity's Random.InitState documentation explains that a seed selects the starting point of a pseudorandom sequence. Its procedural-level example uses a preset seed to reproduce a pattern.
That is powerful for sharing worlds and investigating generation bugs. A player can report a seed instead of trying to describe every tree near a troublesome crossing.
But matching the seed does not mean every future game build will generate the same map. Your generator still interprets the sequence. Change its rules, its content inputs or the order in which it consumes random values, and the resulting world can change.
Recording a generator version makes that dependency visible. Actually supporting old saves still requires a policy: retain compatible generation, migrate the record, or preserve enough generated data to restore the world. A version label alone does none of those things.
Starting over and continuing are different actions
“Start a new world with seed 42” should recreate an initial configuration under the supported recipe.
“Continue my world” should also restore relevant player changes, quest outcomes and evolving simulation state. Depending on the game, that might mean a snapshot, an event history, or a generated baseline plus saved differences.
A bridge has to keep a stable identity if later records refer to it. If the same identifier starts pointing to a tree after a generator update, applying the saved changes is no longer meaningful. Stable identifiers and migration rules are part of the design, not housekeeping to add at the end.
Unity's same documentation also distinguishes the seed from the generator's internal state, which can be stored through Random.state. Saving an RNG state can help continue a random sequence; it still does not store the bridge, the player's inventory or the quest result.
A small acceptance test before a bigger world
For the prototype above, I would make these checks explicit:
- Generate twice with the same supported recipe and compare the relevant starting-world data.
- Build the bridge, finish the crossing quest, save, close and reload. Verify both changes persist.
- Start a fresh world with the same recipe. Verify the bridge is absent and the quest is incomplete.
- Load the save under a changed generator version. Require an intentional compatibility result, not silent reinterpretation.
These are proposed tests, not results from a shipped game. Exact reproducibility also depends on the implementation and runtime; a seed does not automatically control physics, network timing or other nondeterministic systems.
Where AI belongs in this picture
Procedural generation does not require generative AI. If a prototype adds model-generated quests or dialogue, a local world seed is not a promise that a remote model will repeat an earlier response.
Persist accepted outputs and the authoritative game outcomes that depend on them when continuity matters. Keep the playful variation, but give returning players a dependable way back to the world they changed.
Which would you test first in a procedural prototype: sharing a starting seed, or restoring one player-built object?
Download Altered Brilliance: https://play.google.com/store/apps/details?id=tech.krizek.alteredbrilliance
Global website: https://global.krizek.tech
Pre-register for Arzenal Human Health: https://play.google.com/store/apps/details?id=tech.krizek.arzenal
Join The Power Of Gaming: https://discord.gg/sbYSPcCqJn
Top comments (0)