Sdílet prostřednictvím


Konfigurace pozorovatelů sítě prostřednictvím kódu – MRTK2

Tento článek popisuje některé klíčové mechanismy a rozhraní API pro programovou konfiguraci systému Spatial Awareness a souvisejících zprostředkovatelů dat Mesh Observer .

Přístup k pozorovatelům sítě

Třídy Mesh Observer, které implementují IMixedRealitySpatialAwarenessMeshObserver rozhraní, poskytují data sítě specifická pro platformu systému Spatial Awareness. V profilu Spatial Awareness je možné nakonfigurovat více pozorovatelů.

Přístup k poskytovatelům dat v systému Spatial Awareness je většinou stejný jako přístup k jakékoli jiné službě Mixed Reality Toolkit. Služba Spatial Awareness se musí přetypovat do IMixedRealityDataProviderAccess rozhraní pro přístup prostřednictvím GetDataProvider<T> rozhraní API, která se pak dají využít pro přístup k objektům Mesh Observer přímo za běhu.

// Use CoreServices to quickly get access to the IMixedRealitySpatialAwarenessSystem
var spatialAwarenessService = CoreServices.SpatialAwarenessSystem;

// Cast to the IMixedRealityDataProviderAccess to get access to the data providers
var dataProviderAccess = spatialAwarenessService as IMixedRealityDataProviderAccess;

var meshObserver = dataProviderAccess.GetDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

Pomocná rutina CoreServices.GetSpatialAwarenessSystemDataProvider<T>() zjednodušuje tento model přístupu, jak je znázorněno níže.

// Get the first Mesh Observer available, generally we have only one registered
var meshObserver = CoreServices.GetSpatialAwarenessSystemDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

// Get the SpatialObjectMeshObserver specifically
var meshObserverName = "Spatial Object Mesh Observer";
var spatialObjectMeshObserver = dataProviderAccess.GetDataProvider<IMixedRealitySpatialAwarenessMeshObserver>(meshObserverName);

Spouštění a zastavování pozorování sítě

Jedním z nejběžnějších úkolů při práci se systémem Spatial Awareness je dynamické vypnutí nebo zapnutí funkce za běhu. To se provádí pro pozorovatele IMixedRealitySpatialAwarenessObserver.Resume prostřednictvím rozhraní API a IMixedRealitySpatialAwarenessObserver.Suspend .

// Get the first Mesh Observer available, generally we have only one registered
var observer = CoreServices.GetSpatialAwarenessSystemDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

// Suspends observation of spatial mesh data
observer.Suspend();

// Resumes observation of spatial mesh data
observer.Resume();

Tuto funkci kódu lze také zjednodušit prostřednictvím přímého přístupu prostřednictvím systému Spatial Awareness.

var meshObserverName = "Spatial Object Mesh Observer";
CoreServices.SpatialAwarenessSystem.ResumeObserver<IMixedRealitySpatialAwarenessMeshObserver>(meshObserverName);

Spouštění a zastavování všech pozorování sítě

Obecně je vhodné spustit/zastavit všechna pozorování sítě v aplikaci. Toho lze dosáhnout pomocí užitečných rozhraní API ResumeObservers() systému Prostorového povědomí a SuspendObservers().

// Resume Mesh Observation from all Observers
CoreServices.SpatialAwarenessSystem.ResumeObservers();

// Suspend Mesh Observation from all Observers
CoreServices.SpatialAwarenessSystem.SuspendObservers();

Vytvoření výčtu sítí a přístup k okům

Přístup k sítím je možné provést pomocí pozorovatele a pak vytvořit výčet přes sítě, které tento pozorovatel sítě zná prostřednictvím IMixedRealitySpatialAwarenessMeshObserver rozhraní API.

Při spuštění v editoru AssetDatabase.CreateAsset() můžete použít k uložení objektu Mesh do souboru prostředku.

Pokud běží na zařízení, je k dispozici mnoho modulů plug-in komunity a Store, které serializují MeshFilter data do typu souboru modelu.

// Get the first Mesh Observer available, generally we have only one registered
var observer = CoreServices.GetSpatialAwarenessSystemDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

// Loop through all known Meshes
foreach (SpatialAwarenessMeshObject meshObject in observer.Meshes.Values)
{
    Mesh mesh = meshObject.Filter.mesh;
    // Do something with the Mesh object
}

Zobrazení a skrytí prostorové sítě

Pomocí následujícího vzorového kódu je možné sítě skrýt nebo zobrazit prostřednictvím kódu programu:

// Get the first Mesh Observer available, generally we have only one registered
var observer = CoreServices.GetSpatialAwarenessSystemDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

// Set to not visible
observer.DisplayOption = SpatialAwarenessMeshDisplayOptions.None;

// Set to visible and the Occlusion material
observer.DisplayOption = SpatialAwarenessMeshDisplayOptions.Occlusion;

Registrace událostí pozorování sítě

Komponenty mohou implementovat IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject> a pak se zaregistrovat do systému Spatial Awareness pro příjem událostí pozorování sítě.

Užitečným DemoSpatialMeshHandler příkladem a výchozím bodem pro naslouchání událostem pozorovatele sítě je skript (Assets/MRTK/Examples/Demos/SpatialAwareness/Scripts).

Toto je zjednodušený příklad skriptu DemoSpatialMeshHandler a naslouchání událostí pozorování sítě.

// Simplify type
using SpatialAwarenessHandler = IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject>;

public class MyMeshObservationExample : MonoBehaviour, SpatialAwarenessHandler
{
    private void OnEnable()
    {
        // Register component to listen for Mesh Observation events, typically done in OnEnable()
        CoreServices.SpatialAwarenessSystem.RegisterHandler<SpatialAwarenessHandler>(this);
    }

    private void OnDisable()
    {
        // Unregister component from Mesh Observation events, typically done in OnDisable()
        CoreServices.SpatialAwarenessSystem.UnregisterHandler<SpatialAwarenessHandler>(this);
    }

    public virtual void OnObservationAdded(MixedRealitySpatialAwarenessEventData<SpatialAwarenessMeshObject> eventData)
    {
        // Do stuff
    }

    public virtual void OnObservationUpdated(MixedRealitySpatialAwarenessEventData<SpatialAwarenessMeshObject> eventData)
    {
        // Do stuff
    }

    public virtual void OnObservationRemoved(MixedRealitySpatialAwarenessEventData<SpatialAwarenessMeshObject> eventData)
    {
        // Do stuff
    }
}

Viz také