Upgrade Guide: 1.5.1 → 1.6.0
This guide covers upgrading Runtime Spawner from 1.5.1 to 1.6.0.
The most important changes are:
WaveTrigger is now API-driven (activation state is no longer settable externally).
LocalAreaSpawner now has a canonical driver API and no longer relies on
OnTriggerStayspam to signal occupancy.Both components now support ActivationMode (
UnityPhysicsvsExternal) to enable deterministic networking drivers.Both components now expose UnityEvents for designers plus static C# events for systems.
1) WaveTrigger Changes (Breaking Change)
What changed
In 1.5.1, WaveTrigger activation was driven by Unity triggers and a writable boolean:
IsActivatedhad a public setter.OnTriggerEntersetisActivated = trueand invokedonWaveTriggerActivated.Reset was a coroutine that flipped
isActivatedback to false and invokedonWaveTriggerReset.RuntimeSpawnertypically listened toWaveTrigger.onWaveTriggerActivated.
In 1.6.0, WaveTrigger is an offline-first component with a public activation API:
IsActivatedis read-only externally (private set).Activation is routed through:
StartWave()/StopWave()ExternalActivate(...)/ExternalReset()SetTriggerInside(bool)(occupancy replication)
Trigger behavior is explicitly separated into:
Occupancy (“inside”) state (
IsInside) with trigger UnityEventsWave activation lifecycle with wave UnityEvents
Old → New API Mapping
wt.IsActivated = true;
wt.StartWave();
wt.IsActivated = false;
wt.StopWave(); (or ExternalReset() depending on intent)
Rely on OnTriggerEnter for activation
Keep UnityPhysics mode, or use External mode with a driver (see Networking Integrations)
ResetTrigger() always starts coroutine
ResetTrigger() is still available, plus deterministic ExternalReset()
No occupancy concept
IsInside + SetTriggerInside(bool) + trigger UnityEvents
Required code changes (common)
If you had UI/tools/drivers doing this:
Change to:
Networking setup (recommended)
For networked projects, set WaveTrigger to:
activationMode = ActivationMode.External
And add the corresponding Network Driver for your component.
Then the networking driver will call:
Replicate enter/exit →
wt.SetTriggerInside(bool)Activate from authority →
wt.ExternalActivate(scheduleLocalReset:false)orwt.StartWave()Reset deterministically →
wt.ExternalReset()
New Events (WaveTrigger)
In 1.6.0, WaveTrigger adds UnityEvents:
Trigger occupancy (generic):
OnTriggerEnterEventOnTriggerStayEventOnTriggerExitEventOnTriggerStateChanged(bool inside)
Wave lifecycle (domain specific):
OnWaveActivatedOnWaveCompletedOnWaveDeactivatedOnWaveReset
Static C# events still exist:
WaveTrigger.onWaveTriggerActivatedWaveTrigger.onWaveTriggerReset
2) LocalAreaSpawner Changes (Breaking + Behavior)
What changed
In 1.5.1, LocalAreaSpawner signaled “player inside” like this:
OnTriggerStayfired every physics tick while inside.Every
OnTriggerStayinvoked:onPlayerIsInRegion(this, true)
OnTriggerExitinvoked:onPlayerIsInRegion(this, false)
This creates two problems:
Event spam: enter state is broadcast repeatedly, not only when it changes.
Networking mismatch: “stay” does not map cleanly to replicated state.
In 1.6.0, LocalAreaSpawner has a canonical, edge-triggered API:
State is stored as
isActiveSpawnerand exposed as:IsInside(property)IsActiveSpawner()(back-compat helper)
Unity trigger messages call
EnterRegion/ExitRegion(UnityPhysics mode).Networking drivers call
SetPlayerInRegion(bool)(External mode).Events fire only when state changes.
Old → New API Mapping
region.IsActiveSpawner()
region.IsInside (preferred) or IsActiveSpawner() (still supported)
OnTriggerStay used to signal inside
Inside state changes fire once; stay is optional UnityEvent
No explicit API to set inside
region.SetPlayerInRegion(bool)
No activation mode
activationMode = UnityPhysics or External
Only static event
Static event + UnityEvents for trigger + region lifecycle
Required behavior awareness (important)
If you had systems that accidentally depended on the spammy nature of 1.5.1 OnTriggerStay, you must update them.
In 1.5.1 you might have been doing something like:
“While inside, keep refreshing a timer / keep region alive”
“Every OnTriggerStay, re-add this region to active list”
In 1.6.0, the region will emit:
onPlayerIsInRegion(region, true)once when enteringonPlayerIsInRegion(region, false)once when exiting
If you truly need “continuous inside” behavior, use:
OnTriggerStayEventUnityEvent (invoked every frame while inside), orPoll
region.IsInsidefrom your own Update loop.
New Events (LocalAreaSpawner)
Static C# event (canonical system hook):
LocalAreaSpawner.onPlayerIsInRegion(LocalAreaSpawner region, bool inside)
UnityEvents added:
Trigger occupancy (generic):
OnTriggerEnterEventOnTriggerStayEvent(invoked every frame while inside)OnTriggerExitEventOnTriggerStateChanged(bool inside)
Region lifecycle (domain):
OnRegionEnteredOnRegionExitedOnRegionStateChanged(bool inside)
Networking setup (recommended)
For networked projects, set LocalAreaSpawner to:
activationMode = ActivationMode.External
Then your driver should replicate inside state and call:
3) ActivationMode: UnityPhysics vs External
Both WaveTrigger and LocalAreaSpawner now have:
ActivationMode.UnityPhysicsUses Unity physics callbacks (
OnTriggerEnter/Exit/Stay)Good for offline, editor testing, single player
ActivationMode.ExternalDesigned for Fusion/PUN drivers (deterministic replication)
Driver calls public API methods to set state and activate
4) Upgrade Steps Checklist
Step A — Update WaveTrigger callsites
Search for:
IsActivated =direct invocation of wave activation/reset events
spawner notify patterns
Replace with:
StartWave()/StopWave()ExternalActivate(...)/ExternalReset()for networking drivers
Step B — Update LocalAreaSpawner assumptions
Search for:
systems that relied on
OnTriggerStay-driven spamlogic that treats “enter” as a per-frame signal
Adjust:
Use state change events (
onPlayerIsInRegion) for enter/exitUse
OnTriggerStayEventif you need continuous inside tickOr poll
IsInsidewhen necessary
Step C — Networking projects
Set triggers/regions to
ActivationMode.ExternalAdd the new Fusion/PUN drivers
Ensure authority drives activation and replicated state:
Fusion: StateAuthority
PUN: MasterClient (or your chosen authority)
5) Quick “Before / After” Snippets
WaveTrigger manual activation
Before (1.5.1):
After (1.6.0):
LocalAreaSpawner “keep alive while inside”
Before (1.5.1): implicitly happened via OnTriggerStay spam.
After (1.6.0):
Use
OnTriggerStayEventif you want continuous callbacks, orPoll
region.IsInsideand run your own loop.
Last updated