using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using UnityEngine; /// /// This sample shows you how to implement a scene manager with the following features: /// * Fetch all room scene anchors /// * Fetch all child scene anchors of a room /// * Set the location, and name of the object as label /// * Spawn primitive geometry to match the scene anchor's plane, volume or mesh data /// /// There is a fallback for running scene capture if no rooms were found. /// public class BasicSceneManager : MonoBehaviour { void Start() { SceneManagerHelper.RequestScenePermission(); LoadSceneAsync(); } async void LoadSceneAsync() { // fetch all rooms, with a SceneCapture fallback var rooms = new List(); await OVRAnchor.FetchAnchorsAsync(rooms); if (rooms.Count == 0) { var sceneCaptured = await SceneManagerHelper.RequestSceneCapture(); if (!sceneCaptured) return; await OVRAnchor.FetchAnchorsAsync(rooms); } // fetch room elements, create objects for them var tasks = rooms.Select(async room => { var roomObject = new GameObject($"Room-{room.Uuid}"); if (!room.TryGetComponent(out OVRAnchorContainer container)) return; var children = new List(); await container.FetchChildrenAsync(children); await CreateSceneAnchors(roomObject, children); }).ToList(); await Task.WhenAll(tasks); } async Task CreateSceneAnchors(GameObject roomGameObject, List anchors) { // we create tasks to iterate all anchors in parallel var tasks = anchors.Select(async anchor => { // can we locate it in the world? if (!anchor.TryGetComponent(out OVRLocatable locatable)) return; await locatable.SetEnabledAsync(true); // get semantic classification for object name var label = "other"; if (anchor.TryGetComponent(out OVRSemanticLabels labels)) label = labels.Labels; // create and parent Unity game object var gameObject = new GameObject(label); gameObject.transform.SetParent(roomGameObject.transform); // set location and create objects for 2D, 3D, triangle mesh var helper = new SceneManagerHelper(gameObject); helper.SetLocation(locatable); if (anchor.TryGetComponent(out OVRBounded2D b2d) && b2d.IsEnabled) helper.CreatePlane(b2d); if (anchor.TryGetComponent(out OVRBounded3D b3d) && b3d.IsEnabled) helper.CreateVolume(b3d); }).ToList(); await Task.WhenAll(tasks); } }