在使用新的 MRTK2 放置游戏对象后,我希望禁用空间映射。我被困在命名空间或服务中究竟要调用什么以在运行时执行此操作。
我试过了:MixedRealityToolkit.SpatialAwarenessSystem.SuspendObservers();
这没有效果。我可以禁用整个“空间感知系统”游戏对象,但这将是一个 hack。
我需要的是可以完全禁用系统的正确调用,以便在不再有用时释放资源?
此外,了解我们如何正确访问服务系统将有很大帮助。
您可以使用以下代码来禁用/启用空间感知系统:
if (disable)
{
// disable
MixedRealityToolkit.SpatialAwarenessSystem.Disable();
}
else
{
// enable
MixedRealityToolkit.SpatialAwarenessSystem.Enable()
}
您可以使用以下代码仅启用/禁用可视化,但保持对撞机开启:
foreach(var observer in MixedRealityToolkit.SpatialAwarenessSystem.GetObservers())
{
var meshObserver = observer as IMixedRealitySpatialAwarenessMeshObserver;
if (meshObserver != null)
{
meshObserver.DisplayOption = SpatialAwarenessMeshDisplayOptions.None;
}
}
[AddComponentMenu("Scripts/MRTK/Examples/ClearSpatialObservations")]
public class ClearSpatialObservations : MonoBehaviour
{
/// <summary>
/// Indicates whether observations are to be cleared (true) or if the observer is to be resumed (false).
/// </summary>
private bool clearObservations = true;
/// <summary>
/// Toggles the state of the observers.
/// </summary>
public void ToggleObservers()
{
var spatialAwarenessSystem = CoreServices.SpatialAwarenessSystem;
if (spatialAwarenessSystem != null)
{
if (clearObservations)
{
spatialAwarenessSystem.SuspendObservers();
spatialAwarenessSystem.ClearObservations();
clearObservations = false;
}
else
{
spatialAwarenessSystem.ResumeObservers();
clearObservations = true;
}
}
}
}
我本来希望 SuspendObservers() 方法不会显示新的网格。您是否看到暂停后网格发生了变化?
在应用程序通过 IMixedRealitySpatialAwarenessMeshObserver.DisplayOption 属性明确将其可见性设置为无之前,网格保持可见是设计使然。
谢谢!
请注意,由于最近对 MRTK 框架的更改,先前的答案不起作用。
此处为 SpatialAwareness DataProviders 的链接
从所述链接粘贴的代码:
IMixedRealityDataProviderAccess dataProviderAccess =
CoreServices.SpatialAwarenessSystem as IMixedRealityDataProviderAccess;
if (dataProviderAccess != null)
{
IReadOnlyList<IMixedRealitySpatialAwarenessMeshObserver> observers =
dataProviderAccess.GetDataProviders<IMixedRealitySpatialAwarenessMeshObserver>();
foreach (IMixedRealitySpatialAwarenessMeshObserver observer in observers)
{
// Set the mesh to use the occlusion material
observer.DisplayOption = SpatialMeshDisplayOptions.Occlusion;
}
}