Photon PUN 2+ - Scene Setup & Usage

This page explains how to author gameplay scenes using Runtime Spawner with Photon PUN 2+. It focuses on where components live, how triggers behave in multiplayer, and how to structure scenes safely.

If you’re looking for:

  • imports, prefabs, bootstrap → Setup & Configuration

  • runtime errors or desyncs → Troubleshooting


Core Rule (Reinforced)

Only the Master Client executes gameplay logic. All other clients observe replicated results.

This applies to:

  • RuntimeSpawner

  • WaveTriggers

  • LocalAreaSpawners

  • All spawn loops and population logic

Scene setup should assume:

  • triggers exist on all clients

  • only the Master Client drives them


1. RuntimeSpawner Placement

Each gameplay scene that should spawn content needs exactly one RuntimeSpawner.

Typical patterns:

  • One RuntimeSpawner in the main gameplay scene

  • One RuntimeSpawner per additive “map chunk” (advanced)

  • A persistent RuntimeSpawner loaded via a bootstrap scene

Requirements

  • RuntimeSpawner must exist before triggers activate

  • Only the Master Client should call:

Clients should never call these methods.

See the PUN Bootstrap script included with the Runtime Spawner Samples in the Unity Package Manager for example code.


2. WaveTrigger in PUN

WaveTrigger defines when a wave starts. In PUN, it must be paired with a PUNWaveTriggerDriver.

Required Components

On the same GameObject:

  • BoxCollider (isTrigger = true)

  • WaveTrigger

  • PUNWaveTriggerDriver

  • PhotonView

How it works

  • Trigger detection runs only on the Master Client

  • When activated:

    • the driver replicates state to all clients

    • RuntimeSpawner starts the wave (Master only)

  • Clients:

    • receive spawned enemies via Photon

    • receive trigger state via RPCs

Common use cases

  • One-shot ambush rooms

  • Repeatable horde zones

  • Auto-start survival waves

  • Scripted defense encounters


3. LocalAreaSpawner in PUN

LocalAreaSpawner defines where population rules apply.

In PUN, it must be paired with PUNLocalAreaSpawnerDriver.

Required Components

On the same GameObject:

  • BoxCollider (isTrigger = true)

  • LocalAreaSpawner

  • PUNLocalAreaSpawnerDriver

  • (PhotonView not required — uses RaiseEvent)

How it works

  • Any client can detect entry

  • Non-master clients request authority

  • Master Client:

    • validates entry

    • sets region inside/outside state

    • optionally caches state for late joiners

  • Only the Master Client calls:

Why this matters

This prevents:

  • double region activation

  • client-driven spawning

  • late-join population mismatch


4. Additive Scenes & Procedural Content

Runtime Spawner is scene-agnostic.

You may safely:

  • load WaveTriggers additively

  • spawn LocalAreaSpawners at runtime

  • stream encounter prefabs

  • use procgen tiles

As long as:

  • prefabs are registered with the PUN provider

  • the Master Client runs the spawner

Late joiners

  • WaveTriggers replicate activation via RPC

  • LocalAreaSpawners can cache inside/outside state

  • Spawned objects sync automatically through Photon


5. Player Colliders & Trigger Detection

Unity trigger rules still apply:

  • At least one collider must have a Rigidbody

  • Layers and tags must match driver filters

  • Root or attached Rigidbody tags are supported

Recommended:

  • Put Rigidbody on the player root

  • Use consistent player tags

  • Filter activation layers narrowly for performance


6. Scene Authoring Patterns

Pattern A — Simple Encounter Room

  • Place WaveTrigger in the room

  • Assign WaveSpawner

  • Add WaveSpawnPoints

  • Add PUNWaveTriggerDriver

  • Done — no scripting required

Pattern B — Region-Based Population

  • Add LocalAreaSpawner volumes

  • Configure min/max counts

  • Assign region-specific SpawnEntries

  • Add PUNLocalAreaSpawnerDriver

  • RuntimeSpawner handles the rest

Pattern C — Hybrid

Use both:

  • LocalAreaSpawner for ambient population

  • WaveTrigger for spikes / encounters

This is the recommended pattern for:

  • city blocks

  • dungeon rooms

  • open-world POIs


7. Debugging in Scene View

Both PUN drivers expose runtime snapshots in the inspector (play mode only):

  • Is Master Client

  • Inside state (authoritative)

  • Target references

  • PhotonView info (WaveTrigger)

Use these to verify:

  • authority is correct

  • triggers aren’t firing on clients

  • state is being replicated


8. What Not To Do

Avoid:

  • Calling spawner.Init() on clients

  • Letting clients activate waves directly

  • Running spawn logic in Update on networked objects

  • Having multiple RuntimeSpawners active unintentionally

These mistakes lead to:

  • duplicate enemies

  • desyncs

  • late-join bugs

  • hard-to-debug Photon issues

Last updated