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.

circle-info

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