> ## Documentation Index
> Fetch the complete documentation index at: https://docs-unity.molca.id/llms.txt
> Use this file to discover all available pages before exploring further.

# Tour areas and spots

> TourAreaManager, TourSpotController, and TourProgressHelper.

**Folder:** `Assets/_MolcaSDK/_VR/Scripts/Scenario/Tour/`

| Type                   | Role                                                                                       |
| ---------------------- | ------------------------------------------------------------------------------------------ |
| **TourAreaManager**    | Lifecycle for a tour **area** (spots, materials, additive scene binding)                   |
| **TourSpotController** | Teleport target + material presentation at a **spot**                                      |
| **TourProgressHelper** | Static helpers: spot **completion ratio** and material counts from **`SessionInfo.tours`** |

## Code

**Area registration** — Spots call **`RegisterSpot`** / **`UnregisterSpot`** on **`TourAreaManager`** (see **`TourSpotController`**). **`spotId`** must match **`TourSpotData`** in **`tourData`**.

**Teleport / progress from gameplay:**

```csharp theme={null}
using Molca;
using MolcaSDK.VR.Scenario.Session;
using MolcaSDK.VR.Scenario.Tour;

// Teleport (requires TeleportationAnchor + provider):
spot.TeleportHere();

// After user views content — post completion (org IDs must be populated from session/config):
await spot.CompleteMaterialAsync(materialLocalId);

// Read resumed progress from SessionInfo:
var session = RuntimeManager.GetSubsystem<ScenarioSessionManager>();
float p = TourProgressHelper.CalculateSpotProgress(session.SessionInfo, orgTourId);
var counts = TourProgressHelper.GetSpotMaterialCounts(session.SessionInfo, orgTourId);
```

## Troubleshooting

* **RegisterSpot warning — no matching data** — **`TourAreaManager.tourData`** must list a **`TourSpotData`** with the same **`id`** as **`spotId`** on **`TourSpotController`**.
* **CompleteMaterialAsync fails** — **`ScenarioSessionManager`** active, non-zero **`orgId`** on spot/material, valid **`OrgScenarioId`** on **`TourScenarioData`**, and **`ScenarioManager`** instance for elapsed time (see source guards).
* **`TourProgressHelper` returns 0** — **`SessionInfo.tours`** empty or **`org_tour_id`** mismatch; refresh session after content load.

## Related

* [TourSubsystem](/vr/tour/tour-subsystem)
* [Session loading & events](/vr/session-loading-and-events)
* [ScenarioManager](/vr/scenario-manager)

## Unity Editor

<Frame hint="Hierarchy: TourAreaManager with spots; or TourSpotController on POI object." caption="Tour area / spot in scene">
  <img src="https://mintlify.s3.us-west-1.amazonaws.com/ptmolcateknologinusantara/images/features/vr/tour/tour-spot-hierarchy.png" alt="Unity Hierarchy showing tour area and spot objects" />
</Frame>
