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 OnTriggerStay spam to signal occupancy.

  • Both components now support ActivationMode (UnityPhysics vs External) 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:

  • IsActivated had a public setter.

  • OnTriggerEnter set isActivated = true and invoked onWaveTriggerActivated.

  • Reset was a coroutine that flipped isActivated back to false and invoked onWaveTriggerReset.

  • RuntimeSpawner typically listened to WaveTrigger.onWaveTriggerActivated.

In 1.6.0, WaveTrigger is an offline-first component with a public activation API:

  • IsActivated is 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 UnityEvents

    • Wave activation lifecycle with wave UnityEvents

Old → New API Mapping

1.5.1
1.6.0

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:

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) or wt.StartWave()

  • Reset deterministically → wt.ExternalReset()

New Events (WaveTrigger)

In 1.6.0, WaveTrigger adds UnityEvents:

Trigger occupancy (generic):

  • OnTriggerEnterEvent

  • OnTriggerStayEvent

  • OnTriggerExitEvent

  • OnTriggerStateChanged(bool inside)

Wave lifecycle (domain specific):

  • OnWaveActivated

  • OnWaveCompleted

  • OnWaveDeactivated

  • OnWaveReset

Static C# events still exist:

  • WaveTrigger.onWaveTriggerActivated

  • WaveTrigger.onWaveTriggerReset


2) LocalAreaSpawner Changes (Breaking + Behavior)

What changed

In 1.5.1, LocalAreaSpawner signaled “player inside” like this:

  • OnTriggerStay fired every physics tick while inside.

  • Every OnTriggerStay invoked:

    • onPlayerIsInRegion(this, true)

  • OnTriggerExit invoked:

    • 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 isActiveSpawner and 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

1.5.1
1.6.0

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 entering

  • onPlayerIsInRegion(region, false) once when exiting

If you truly need “continuous inside” behavior, use:

  • OnTriggerStayEvent UnityEvent (invoked every frame while inside), or

  • Poll region.IsInside from your own Update loop.

New Events (LocalAreaSpawner)

Static C# event (canonical system hook):

  • LocalAreaSpawner.onPlayerIsInRegion(LocalAreaSpawner region, bool inside)

UnityEvents added:

Trigger occupancy (generic):

  • OnTriggerEnterEvent

  • OnTriggerStayEvent (invoked every frame while inside)

  • OnTriggerExitEvent

  • OnTriggerStateChanged(bool inside)

Region lifecycle (domain):

  • OnRegionEntered

  • OnRegionExited

  • OnRegionStateChanged(bool inside)

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.UnityPhysics

    • Uses Unity physics callbacks (OnTriggerEnter/Exit/Stay)

    • Good for offline, editor testing, single player

  • ActivationMode.External

    • Designed 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 spam

  • logic that treats “enter” as a per-frame signal

Adjust:

  • Use state change events (onPlayerIsInRegion) for enter/exit

  • Use OnTriggerStayEvent if you need continuous inside tick

  • Or poll IsInside when necessary

Step C — Networking projects

  • Set triggers/regions to ActivationMode.External

  • Add 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 OnTriggerStayEvent if you want continuous callbacks, or

  • Poll region.IsInside and run your own loop.

Last updated