VerseIsland
Feed Learn Leaderboard Guides Reference Explore Search Docs Verse Library
Sign in
Feed Learn 📖 Codex Leaderboard Guides Reference Explore Search Docs Verse Library
Verse Library › Spawning
Browse Verse Library

Library

Devices 634
  • Devices171
  • Triggers & Logic118
  • UI & HUD40
  • Audio39
  • Items & Inventory29
  • Events27
  • Scoring & Objectives25
  • Spawning19
  • Classes & Interfaces18
  • Game Modes17
  • Props & Meshes14
  • Variables & Mutability12
  • Player Management11
  • Modules & Structure10
  • Round Flow8
  • Animation6
  • Concurrency6
  • Functions6
  • Getting Started6
  • Teams & Classes6
  • NPCs & AI5
  • Tutorials5
  • VFX & Particles5
  • Arrays & Maps4
  • Cameras4
  • Debugging4
  • Control Flow3
  • Cinematics2
  • Other2
  • Persistence2
  • Scene Graph2
  • Structs & Enums2
  • Building1
  • Physics1
  • Publishing & Islands1
  • Syntax & Types1
  • Vehicles1
  • Weapons1
Verse Language 257
  • Control Flow35
  • Functions26
  • Arrays & Maps25
  • Classes & Interfaces22
  • Variables & Mutability22
  • Concurrency21
  • Syntax & Types18
  • Modules & Structure12
  • Debugging8
  • Devices8
  • Events7
  • Player Management6
  • Structs & Enums6
  • Triggers & Logic6
  • Game Modes5
  • Failure & Options4
  • Scene Graph4
  • UI & HUD4
  • Getting Started3
  • Round Flow3
  • Spawning3
  • VFX & Particles3
  • Reference2
  • Animation1
  • Best Practices1
  • Other1
  • Props & Meshes1
Materials/VFX 154
  • Triggers & Logic27
  • UI & HUD17
  • Devices16
  • VFX & Particles14
  • Props & Meshes11
  • Scoring & Objectives9
  • Game Modes7
  • Items & Inventory7
  • Functions6
  • Arrays & Maps5
  • Animation3
  • Cinematics3
  • Classes & Interfaces3
  • Control Flow3
  • Events3
  • Modules & Structure3
  • Round Flow3
  • Spawning3
  • Getting Started2
  • Scene Graph2
  • Variables & Mutability2
  • Concurrency1
  • Persistence1
  • Player Management1
  • Structs & Enums1
  • Syntax & Types1
General 153
  • Devices22
  • Events20
  • Triggers & Logic20
  • Classes & Interfaces10
  • Variables & Mutability8
  • Round Flow6
  • Scoring & Objectives6
  • UI & HUD6
  • Functions5
  • Player Management5
  • Game Modes4
  • Getting Started4
  • Props & Meshes4
  • Control Flow3
  • Syntax & Types3
  • VFX & Particles3
  • Arrays & Maps2
  • Best Practices2
  • NPCs & AI2
  • Other2
  • Physics2
  • Scene Graph2
  • Spawning2
  • Structs & Enums2
  • Tutorials2
  • Building1
  • Cameras1
  • Cinematics1
  • Failure & Options1
  • Items & Inventory1
  • Teams & Classes1
Player 133
  • Player Management22
  • Teams & Classes19
  • Classes & Interfaces12
  • Devices11
  • Events9
  • Persistence7
  • Triggers & Logic7
  • Arrays & Maps6
  • Functions4
  • Game Modes4
  • Items & Inventory4
  • Round Flow4
  • Debugging3
  • Getting Started3
  • Modules & Structure3
  • Concurrency2
  • Control Flow2
  • Scoring & Objectives2
  • Spawning2
  • Structs & Enums2
  • Physics1
  • Props & Meshes1
  • UI & HUD1
  • Variables & Mutability1
  • Weapons1
Building & Props 131
  • Variables & Mutability15
  • Props & Meshes14
  • Triggers & Logic12
  • Classes & Interfaces10
  • Devices10
  • UI & HUD10
  • Events7
  • Teams & Classes7
  • Animation5
  • Building5
  • Functions5
  • VFX & Particles5
  • Structs & Enums4
  • Control Flow3
  • Game Modes3
  • Items & Inventory3
  • Round Flow3
  • Scene Graph3
  • Arrays & Maps2
  • Concurrency2
  • Reference2
  • Modules & Structure1
NPCs & AI 76
  • NPCs & AI35
  • Spawning7
  • Animation5
  • Variables & Mutability5
  • Classes & Interfaces3
  • Debugging3
  • UI & HUD3
  • Audio2
  • Concurrency2
  • Game Modes2
  • Props & Meshes2
  • Triggers & Logic2
  • Devices1
  • Functions1
  • Getting Started1
  • Reference1
  • VFX & Particles1
Spawning 73
  • Spawning31
  • Events7
  • Concurrency6
  • Player Management6
  • Vehicles5
  • Props & Meshes4
  • Devices3
  • Scene Graph3
  • Items & Inventory2
  • Teams & Classes2
  • Control Flow1
  • Publishing & Islands1
  • Reference1
  • Scoring & Objectives1
Cinematics 71
  • Cameras19
  • Cinematics15
  • Devices11
  • Audio5
  • Animation4
  • Triggers & Logic4
  • Functions2
  • Game Modes2
  • UI & HUD2
  • Classes & Interfaces1
  • Concurrency1
  • Control Flow1
  • Items & Inventory1
  • Modules & Structure1
  • Scene Graph1
  • Templates1
UI 57
  • UI & HUD35
  • Devices5
  • Scoring & Objectives4
  • Classes & Interfaces3
  • Round Flow2
  • Scene Graph2
  • Arrays & Maps1
  • Props & Meshes1
  • Structs & Enums1
  • Templates1
  • Triggers & Logic1
  • Variables & Mutability1
Scene Graph 40
  • Scene Graph9
  • Items & Inventory8
  • Classes & Interfaces3
  • Events3
  • Props & Meshes3
  • Functions2
  • Arrays & Maps1
  • Building1
  • Control Flow1
  • Debugging1
  • Modules & Structure1
  • Player Management1
  • Reference1
  • Structs & Enums1
  • Syntax & Types1
  • Triggers & Logic1
  • UI & HUD1
  • VFX & Particles1
Vehicles 38
  • Spawning11
  • Devices7
  • Vehicles7
  • Props & Meshes4
  • Functions2
  • Game Modes2
  • Failure & Options1
  • Items & Inventory1
  • Reference1
  • Teams & Classes1
  • Tutorials1
Tutorials 37
  • Game Modes6
  • Triggers & Logic5
  • Classes & Interfaces4
  • Events4
  • Props & Meshes3
  • Building2
  • Devices2
  • Items & Inventory2
  • Scoring & Objectives2
  • Animation1
  • Arrays & Maps1
  • Cameras1
  • Concurrency1
  • Physics1
  • Player Management1
  • Structs & Enums1
Weapons 30
  • Game Modes6
  • Weapons6
  • Devices5
  • Items & Inventory3
  • Scoring & Objectives3
  • Spawning2
  • Teams & Classes2
  • Best Practices1
  • Functions1
  • Triggers & Logic1
Items 28
  • Items & Inventory23
  • Devices2
  • Triggers & Logic2
  • Spawning1
Assets 20
  • Modules & Structure6
  • Arrays & Maps3
  • Functions3
  • Scene Graph2
  • Best Practices1
  • Devices1
  • Events1
  • Failure & Options1
  • Physics1
  • Variables & Mutability1
Animation 19
  • Animation10
  • Variables & Mutability4
  • Devices1
  • Player Management1
  • Props & Meshes1
  • Scene Graph1
  • Syntax & Types1
Release Notes 17
  • Classes & Interfaces5
  • Modules & Structure3
  • Concurrency2
  • Control Flow2
  • Variables & Mutability2
  • Debugging1
  • Devices1
  • Items & Inventory1
Input & Controls 16
  • Functions4
  • UI & HUD3
  • Control Flow2
  • Animation1
  • Arrays & Maps1
  • Cinematics1
  • Debugging1
  • Devices1
  • Events1
  • Items & Inventory1
Publishing 8
  • Control Flow5
  • Arrays & Maps1
  • Devices1
  • Syntax & Types1
Audio 7
  • Audio5
  • UI & HUD2
Landscape 7
  • Other4
  • VFX & Particles2
  • Scene Graph1
Persistence 6
  • Structs & Enums2
  • Items & Inventory1
  • Persistence1
  • Publishing & Islands1
  • Variables & Mutability1
Physics 5
  • Functions2
  • Classes & Interfaces1
  • Devices1
  • Syntax & Types1
Creator Economy 3
  • Publishing & Islands2
  • Modules & Structure1
Discovery 3
  • Devices1
  • NPCs & AI1
  • Structs & Enums1
Editor & Project 3
  • Other1
  • Props & Meshes1
  • Tutorials1

Random Room Spawning using Scene Graph

Module — 3 files
These files compile together (same module folder).
dungeon_room.verse
using { /Fortnite.com/Devices }
using { /Verse.org/SceneGraph }
using { /Verse.org/Simulation }
using { /Verse.org/SpatialMath }

# Defines a room in the dungeon.
dungeon_room := class<abstract>:

    # Whether or not the room contains enemies.
    @editable
    ContainsEnemies:logic = false

    # The physical bounds of the room. Defaults to double the fortnite tile size of 512cm x 384cm x 512cm to represent a 2x2 tile room.
    @editable_vector_number(float):
        ToolTip := RoomBoundsTip
    RoomBounds:vector3 = vector3{Left := 512.0, Up := 256.0, Forward := 512.0}

    # What enemies should spawn in the room.
    @editable
    EnemySpawners:[]guard_spawner_device = array{}

    # Constructs the entity prefab associated with this dungeon room.
    ConstructRoomPrefab()<transacts>:?entity = false

<#
simple_dungeon_room := class<concrete>(dungeon_room):

    # Constructs the entity prefab associated with this dungeon room.
    ConstructRoomPrefab<override>()<transacts>:?entity=
        NewRoom := DungeonCrawler.Prefabs.Prefab_FortSizeRoom{}
        option{NewRoom}
#>
file_2.verse
using { /Verse.org }
using { /Verse.org/Native }
using { /Verse.org/SceneGraph }
using { /Verse.org/Simulation }

# A Verse-authored component that can be added to entities
room_spawn_component<public> := class<final_super>(component):
  
    # Runs when the component should start simulating in a running game.
    # Can be suspended throughout the lifetime of the component. Suspensions
    # will be automatically cancelled when the component is disposed or the
    # game ends.
    OnSimulate<override>()<suspends>:void =

        if:
            InteractableComponent := Entity.GetComponent[interactable_component]
        then:
            InteractableComponent.SucceededEvent.Subscribe(OnRoomSpawnSignalled)

    # Signal the dungeon manager to spawn a new room.
    OnRoomSpawnSignalled(Agent:agent):void=
        if:
            DungeonManager := GlobalDungeon[GetSession()]
            # Print("room_spawn_component: Got the global dungeon manager")
            InteractableComponent := Entity.GetComponent[interactable_component]
            MeshComponent := Entity.GetComponent[mesh_component]
        then:
            InteractableComponent.Disable()
            set MeshComponent.Visible = false
            DungeonManager.RoomSpawnEvent.Signal(Entity)
            

# Represents the entrace entity of a room. Acts as a primitive version of a tag component.
room_entrance_component<public> := class<final_super>(component):

    OnBeginSimulation<override>():void =
        (super:)OnBeginSimulation()

# Represents a location an enemy can spawn from. Acts as a primitive version of a tag component.
enemy_spawn_location<public> := class<final_super>(component):

    OnBeginSimulation<override>():void =
        (super:)OnBeginSimulation()
my_debug_draw.verse
using { /Fortnite.com/Characters }
using { /Fortnite.com/Devices }
using { /UnrealEngine.com/Temporary/SpatialMath}
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Verse.org }
using { /Verse.org/Native }
using { /Verse.org/Random }
using { /Verse.org/SceneGraph }
using { /Verse.org/Simulation }
using { /Verse.org/SpatialMath }


# Stores a global reference to the dungeon_manager_component.
var GlobalDungeon:weak_map (session, dungeon_manager_component) = map{}

my_debug_draw := class(debug_draw_channel) {}

RoomBoundsTip<localizes>:message = "The physical bounds of the room. Defaults to double the fortnite tile size of 512cm x 384cm x 512cm to represent a 2x2 tile room."

# Set the access specifier of the prefabs module to public.
DungeonCrawler := module:
    Prefabs<public> := module:

dungeon_manager_component<public> := class<final_super>(component):

    # The debug draw channel used to render collision checks.
    DebugDraw:debug_draw = debug_draw{Channel := my_debug_draw}

    # Event signalled when a room should be spawned.
    RoomSpawnEvent<public>:event(entity) = event(entity){}
 
    # The array of dungeon rooms to spawn
    @editable
    var RoomsToSpawn:[]dungeon_room = array{}
  
    # Runs when the component should start simulating in a running game.
    OnBeginSimulation<override>():void =
        # Run OnBeginSimulation from the parent class before
        # running this component's OnBeginSimulation logic
        (super:)OnBeginSimulation()

        # Get and set the global dungeon manager, then spawn a loop to monitor room spawning.
        if:
            set GlobalDungeon[GetSession()] = Self
        then:
            # Print("Set the global dungeon manager.")
            spawn{SpawnManagerLoop()}
        

    # Monitor for RoomSpawnEvents and attempt to spawn a room when the event is signalled.
    SpawnManagerLoop()<suspends>:void=
        loop:
            # Print("Waiting to spawn the next room...")
            RoomParentEntity := RoomSpawnEvent.Await()
            # Print("Got the room spawn signal!")
            SpawnRoom(RoomParentEntity)
            Sleep(0.0)

    # Attempt to spawn a room and move it into the correct position.
    SpawnRoom(RoomExit:entity)<suspends>:void=
        # Print("Attempting to spawn a room...")
        if:
            SimulationEntity := RoomExit.GetSimulationEntity[]
            
            # Pick a room to spawn from the dungeon rooms array.
            RoomIndex := GetRandomInt(0, RoomsToSpawn.Length-1)
            ChosenRoom := RoomsToSpawn[RoomIndex]

            not WillRoomOverlap[ChosenRoom.RoomBounds, RoomExit]

            # Get the entity prefab associated with this dungeon room.
            NewRoom := ChosenRoom.ConstructRoomPrefab()?
        then:
            # Print("Attempting to spawn room index {RoomIndex}")
            
            # Add the new room to the scene.
            SimulationEntity.AddEntities(array{NewRoom})

            # Position the new room in the scene relative to the exit of the previous room.
            spawn{PositionDungeonRoom(NewRoom, RoomExit.GetGlobalTransform())}

            # Remove the room exit from its parent to prevent multiple room generation.
            RoomExit.RemoveFromParent()  

            # If the room should have enemies and has spawners assigned, attempt to spawn them.
            if(ChosenRoom.ContainsEnemies? and ChosenRoom.EnemySpawners.Length > 0):
                # Print("Room should contain enemies")
                spawn{SpawnRoomEnemies(NewRoom, ChosenRoom.EnemySpawners)}

    # Spawn the enemies for a given room and move them into the correct position.
    SpawnRoomEnemies(NewRoom:entity, EnemySpawners:[]guard_spawner_device)<suspends>:void=
        if:
            SimulationEntity := NewRoom.GetSimulationEntity[]
            # Find each entrance associated with the new room. Because a room may have multiple entrances, 
            PositionEntities := NewRoom.FindDescendantEntitiesWithComponent(enemy_spawn_location)
        then:
            for:
                # For each enemy node, randomly pick a spawner to use to populate that node.
                PositionEntity:PositionEntities
                SpawnerIndex := GetRandomInt(0, EnemySpawners.Length-1)
                ChosenSpawner := EnemySpawners[SpawnerIndex]
                MoveCreativeDeviceToEntity[PositionEntity, ChosenSpawner]
            do:
                # This sleep is used for timing purposes to allow the guard spawner to move into position
                # before spawning the guard.
                Sleep(0.0)
                # Print("Spawning an enemy from SpawnerIndex {SpawnerIndex}")
                ChosenSpawner.Spawn()

                # --- Alternative Implementation --- 
                # This waits to get the guard spawned from the spawner, and moves the guard into position instead.
                # Make sure to comment out the MoveCreativeDeviceToEntity[] call above if trying this.
                # AgentToMove := ChosenSpawner.SpawnedEvent.Await()
                # MoveAgentToEntity(AgentToMove, PositionEntity)

    # Move the given creative device to the location of the given entity.
    MoveCreativeDeviceToEntity(PositionEntity:entity, CreativeDevice:t where t:subtype(creative_device_base))<decides><transacts>:void=
        if:
            # Create an UnrealEngine transform using the PositionEntity transform.
            SpawnTransform := (/UnrealEngine.com/Temporary/SpatialMath:)transform:
                Translation := FromVector3(PositionEntity.GetGlobalTransform().Translation)
                Rotation := FromRotation(PositionEntity.GetGlobalTransform().Rotation)

            # Add a small vertical offset to prevent teleporting inside of the PositionEntity.
            VerticalOffset := (/UnrealEngine.com/Temporary/SpatialMath:)vector3{X := 0.0, Y:= 0.0, Z:= 128.0}
            # Print("Attempting to teleport to {SpawnTransform.Translation + VerticalOffset}")
            CreativeDevice.TeleportTo[SpawnTransform.Translation + VerticalOffset, SpawnTransform.Rotation]
        then:
            # Print("Teleported Device to location {SpawnTransform.Translation}!")
    
    # Move the given agent to the location of the given entity.
    MoveAgentToEntity(AgentToMove:agent, PositionEntity:entity)<suspends>:void=
        if:
            # Create an UnrealEngine transform using the PositionEntity transform.
            EnemyCharacter := AgentToMove.GetFortCharacter[]
            SpawnTransform := (/UnrealEngine.com/Temporary/SpatialMath:)transform:
                Translation := FromVector3(PositionEntity.GetGlobalTransform().Translation)
                Rotation := FromRotation(PositionEntity.GetGlobalTransform().Rotation)

            # Add a small vertical offset to prevent teleporting inside of the PositionEntity.
            VerticalOffset := (/UnrealEngine.com/Temporary/SpatialMath:)vector3{X := 0.0, Y:= 0.0, Z:= 128.0}
            # Print("Attempting to teleport to {SpawnTransform.Translation + VerticalOffset}")
            EnemyCharacter.TeleportTo[SpawnTransform.Translation + VerticalOffset, SpawnTransform.Rotation]
        then:
            # Print("Teleported Enemy to location {SpawnTransform.Translation}!")

    # Position the given dungeon room so that the entrance of the new room aligns with the exit of the old room.
    # This is done by spawning the room, creating an anchor entity, positioning the anchor at the entrance of the new room,
    # parenting the new room to the anchor, then moving the anchor to the exit of the old room.
    PositionDungeonRoom(NewRoom:entity, ExitLocation:(/Verse.org/SpatialMath:)transform)<suspends>:void=

        # Print("Exit Location is {ExitLocation}")
        if:
            SimulationEntity := NewRoom.GetSimulationEntity[]
            # Find each entrance associated with the new room. Because a room may have multiple entrances, 
            NewRoomEntrances := NewRoom.FindDescendantEntitiesWithComponent(room_entrance_component)
            
        then:
            # Construct an entity to move the new room entrance to the position of the old room exit and add it to the scene. 
            RoomAnchor := entity{}
            TransformComponent := transform_component:
                Entity := RoomAnchor 
            RoomAnchor.AddComponents(array{TransformComponent})
            SimulationEntity.AddEntities(array{RoomAnchor})

            # Because FindDescendantEntitiesWithComponent() returns a generator, need to iterate through it using a for expression.
            # Alternatively, you can convert the generator to an array. An example of this is provided in the WillRoomOverlap function below.
            for:
                NewRoomEntrance:NewRoomEntrances
            do:

                # Print("Added room anchor to scene")
                EntranceGlobal := NewRoomEntrance.GetGlobalTransform()
                RoomAnchor.SetGlobalTransform(EntranceGlobal)
                # Print("Moved anchor to {EntranceGlobal}")
                # Print("New Room Local Transform is {NewRoom.GetLocalTransform()}")
                # Sleep(2.0) - Enable if you want to see the steps the room moves through.
                RoomAnchor.AddEntities(array{NewRoom})                
                # Sleep(2.0) - Enable if you want to see the steps the room moves through.
                RoomAnchor.SetGlobalTransform(ExitLocation)

    # Check if the dungeon room will overlap any other entities when spawned. Uses FindOverlapHits to find and return an array of
    # overlaps, and uses debug draw to visualize the overlap. 
    WillRoomOverlap(RoomBounds:(/Verse.org/SpatialMath:)vector3, ExitLocation:entity)<decides><transacts>:void=

        EntranceTransform := ExitLocation.GetGlobalTransform()

        # Create a collision box using the bounds of the new room.
        CollisionBox:collision_box = collision_box:
            Extents := RoomBounds

        # Find the displacement from the previous room to know where to spawn the new room.
        EntranceAxis:(/Verse.org/SpatialMath:)vector3 = EntranceTransform.Rotation.GetForwardAxis()
        Displacement:(/Verse.org/SpatialMath:)vector3 = EntranceAxis * (RoomBounds + (/Verse.org/SpatialMath:)vector3{Left := 0.0, Up:= 1.0, Forward := 1.0})
        
        # Find the position to simulate the overlap hit from and draw the debug box at.
        SimulateTransform := (/Verse.org/SpatialMath:)transform:
            Translation := EntranceTransform.Translation + Displacement 
            Rotation := EntranceTransform.Rotation
            Scale := (/Verse.org/SpatialMath:)vector3{Left := 1.0, Up:= 1.0, Forward := 1.0}

        DebugDraw.DrawBox(SimulateTransform.Translation, SimulateTransform.Rotation, ?Extent := RoomBounds, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)

        # Find and return each overlap by simulating the CollisionBox at the SimulateTransform.
        FoundOverlaps := ExitLocation.FindOverlapHits(SimulateTransform, CollisionBox)

        # Convert the generator of overlap hits to an array by setting the array with each
        # element returned from the generator. 
        var OverlapArray:[]overlap_hit = array{}

        # Comment this section out if you want to test spawning rooms without worrying about bounds checking.
        set OverlapArray = for:
            Overlap:FoundOverlaps
        do:
            Print("Found overlap at {Overlap.TargetComponent.Entity.GetGlobalTransform()}")
            Overlap
        
        # Return whether or not the OverlapArray contains any members, indicating an overlap occured and that the room will collide with an entity.
        OverlapArray.Length >= 1
Sign in to download module

Copy-paste each file above is always free.

Comments

    Sign in to vote, comment, or suggest an edit. Sign in
    📄
    Source
    @collision_box
    Epic Games Community
    @collision_box

    Created by a member of the Epic Games community. Rights remain with the original author, under Epic's community content terms. Terms ↗

    View original Sources & licensing
    Request removal
    Last updated Jun 23, 2026
    Verse module (3 files)
    Compiles · verified Jun 24, 2026

    Download the full module (zip) from the code panel above.

    Keep exploring
    More in Spawning · 5 of 11
    Prev
    fortnite team selection and counting devices that reference spawn points and teleporters
    Next
    fortnite simple wave spawn system
    Related topics
    • Scene Graph Known Issues In Fortnite Scene Graph
    • Capture The Flag 4 Set Up Spawn Rooms In Unreal Editor For Fortnite Spawning
    • Scene Graph In Unreal Editor For Fortnite Scene Graph
    • Scene Graph Tutorials In Fortnite Scene Graph
    • Getting Started In Scene Graph In Fortnite Scene Graph

    Related

    Open in graph →

    Related topics

    • Scene Graph Known Issues In Fortnite
    • Capture The Flag 4 Set Up Spawn Rooms In Unreal Editor For Fortnite
    • Scene Graph In Unreal Editor For Fortnite
    • Scene Graph Tutorials In Fortnite
    • Getting Started In Scene Graph In Fortnite
    VerseIsland · an archipelago of Verse & UEFN knowledge
    🗺️ Island atlas Learn Guides History About & Press Sources & Licensing Status

    Not affiliated with Epic Games. Fortnite, UEFN, Unreal Engine, and Verse are trademarks of Epic Games, Inc. Content is attributed to its source — see Sources & Licensing.

    🦜

    Scout · your island guide

    The Isle of Verse