创建相机设置提供程序 — MRTK2

相机系统是一个可扩展的系统,用于为平台特定的相机配置提供支持。 若要添加对新相机配置的支持,可能需要一个自定义设置提供程序。

注意

此示例中使用的完整源代码可在 MRTK/Providers/UnityAR 文件夹中找到

命名空间和文件夹结构

可通过以下两种方式之一分发数据提供程序:

  1. 第三方加载项
  2. Microsoft 混合现实工具包的组件

向 MRTK 提交新数据提供程序的审批过程因具体情况而异,在提交最初提案时进行相互沟通。 可以通过创建新的“功能请求”类型问题来提交提案

第三方加载项

命名空间

数据提供程序需有一个命名空间来缓解潜在的名称冲突。 建议在命名空间中包含以下组件。

  • 生成加载项的公司名称
  • 功能区域

例如,由 Contoso 公司创建和交付的相机设置提供程序可以是“Contoso.MixedReality.Toolkit.Camera”

文件夹结构

建议将数据提供程序的源代码按文件夹层次结构进行布局,如下图所示。

Example folder structure

其中,ContosoCamera 文件夹包含数据提供程序的实现,Editor 文件夹包含检查器(以及 Unity 编辑器特定的任何其他代码),Profiles 文件夹包含一个或多个预创建的配置文件可编脚本对象

MRTK 提交

命名空间

如果将相机设置提供程序提交到混合现实工具包存储库,命名空间必须以 Microsoft.MixedReality.Toolkit 开头(例如 Microsoft.MixedReality.Toolkit.CameraSystem)

文件夹结构

所有代码必须位于 MRTK/Providers 下的文件夹中(例如 MRTK/Providers/UnityAR)。

定义相机设置对象

创建相机设置提供程序的第一步是确定它将提供给应用程序的数据类型(例如网格或平面)。

所有空间数据对象必须实现 IMixedRealityCameraSettingsProvider 接口。

实现设置提供程序

指定接口和/或基类继承

所有相机设置提供程序必须实现 IMixedRealityCameraSettingsProvider 接口,该接口指定相机系统所需的最低功能。 MRTK 基础包括 BaseCameraSettingsProvider 类,该类提供所需功能的默认实现。

namespace namespace Microsoft.MixedReality.Toolkit.Experimental.UnityAR
{
    public class UnityARCameraSettings : BaseCameraSettingsProvider
    { }
}

应用 MixedRealityDataProvider 属性

创建相机设置提供程序的关键步骤是将 MixedRealityDataProvider 属性应用到类。 在相机系统配置文件以及名称、文件夹路径等项中进行选择时,此步骤可为数据提供程序设置默认配置文件和平台。

    [MixedRealityDataProvider(
        typeof(IMixedRealityCameraSystem),
        SupportedPlatforms.Android | SupportedPlatforms.IOS,
        "Unity AR Foundation Camera Settings",
        "UnityAR/Profiles/DefaultUnityARCameraSettingsProfile.asset",
        "MixedRealityToolkit.Providers")]
    public class UnityARCameraSettings : BaseCameraSettingsProvider
    { }

实现 IMixedRealityDataProvider 方法

定义类后,下一步是提供 IMixedRealityDataProvider 接口的实现。

注意

BaseDataProvider 类通过 BaseService 类为 IMixedRealityDataProvider 方法提供空实现。 这些方法的详细信息通常特定于数据提供程序。

数据提供程序应实现的方法为:

  • Destroy()
  • Disable()
  • Enable()
  • Initialize()
  • Reset()
  • Update()

注意

并非所有设置提供程序都需要所有这些方法的实现。 强烈建议至少实现 Destroy()Initialize()

实现数据提供程序逻辑

下一步是通过实现 IMixedRealityCameraSettingsProvider 来添加设置提供程序的逻辑。 数据提供程序的此部分通常特定于相机配置。

创建配置文件和检查器

在混合现实工具包中,数据提供程序使用配置文件进行配置。

定义配置文件

配置文件内容应镜像可供开发人员选择的配置选项。 每个接口中定义的任何可供用户配置的属性也应包含在配置文件中。

using UnityEngine.SpatialTracking;

namespace namespace Microsoft.MixedReality.Toolkit.Experimental.UnityAR
{
    [CreateAssetMenu(
        menuName = "Mixed Reality Toolkit/Profiles/Unity AR Camera Settings Profile",
        fileName = "UnityARCameraSettingsProfile",
        order = 100)]
    public class UnityARCameraSettingsProfile : BaseCameraSettingsProfile
    {
        [SerializeField]
        [Tooltip("The portion of the device (ex: color camera) from which to read the pose.")]
        private ArTrackedPose poseSource = TrackedPoseDriver.TrackedPose.ColorCamera;

        /// <summary>
        /// The portion of the device (ex: color camera) from which to read the pose.
        /// </summary>
        public ArTrackedPose PoseSource => poseSource;

        [SerializeField]
        [Tooltip("The type of tracking (position and/or rotation) to apply.")]
        private ArTrackingType trackingType = TrackedPoseDriver.TrackingType.RotationAndPosition;

        /// <summary>
        /// The type of tracking (position and/or rotation) to apply.
        /// </summary>
        public ArTrackingType TrackingType => trackingType;

        [SerializeField]
        [Tooltip("Specifies when (during Update and/or just before rendering) to update the tracking of the pose.")]
        private ArUpdateType updateType = TrackedPoseDriver.UpdateType.UpdateAndBeforeRender;

        /// <summary>
        /// Specifies when (during Update and/or just before rendering) to update the tracking of the pose.
        /// </summary>
        public ArUpdateType UpdateType => updateType;
    }
}

CreateAssetMenu 属性可应用于配置文件类,使客户能够使用“创建”>“资产”>“混合现实工具包”>“配置文件”菜单创建配置文件实例。

实现检查器

配置文件检查器是用于配置和查看配置文件内容的用户界面。 每个配置文件检查器应扩展 BaseMixedRealityToolkitConfigurationProfileInspector 类。

CustomEditor 属性向 Unity 告知检查器应用到的资产类型。

namespace namespace Microsoft.MixedReality.Toolkit.Experimental.UnityAR
{
    [CustomEditor(typeof(UnityARCameraSettingsProfile))]
    public class UnityARCameraSettingsProfileInspector : BaseMixedRealityToolkitConfigurationProfileInspector
    { }
}

创建程序集定义

混合现实工具包使用程序集定义 (.asmdef) 文件来指定组件之间的依赖关系以及帮助 Unity 缩短编译时间。

建议为所有数据提供程序及其编辑器组件创建程序集定义文件。

如果使用前面示例中的文件夹结构,ContosoCamera 数据提供程序将有两个 .asmdef 文件。

第一个程序集定义用于数据提供程序。 在此示例中,此定义名为 ContosoCamera,位于示例的 ContosoCamera 文件夹中。 此程序集定义必须指定对 Microsoft.MixedReality.Toolkit 及其所依赖的任何其他程序集的依赖关系。

ContosoCameraEditor 程序集定义指定配置文件检查器和编辑器特定的任何代码。 此文件必须位于编辑器代码的根文件夹中。 在此示例中,该文件位于 ContosoCamera\Editor 文件夹中。 此程序集定义包含对 ContosoCamera 程序集的引用,以及:

  • Microsoft.MixedReality.Toolkit
  • Microsoft.MixedReality.Toolkit.Editor.Inspectors
  • Microsoft.MixedReality.Toolkit.Editor.Utilities

注册数据提供程序

数据提供程序在创建后可注册到相机系统,可在应用程序中使用。

Selecting the camera settings provider

打包和分发

作为第三方组件分发的数据提供程序的具体打包和分发细节由开发人员决定。 最常见的解决方案可能是生成一个 .unitypackage,通过 Unity Asset Store 进行分发。

如果数据提供程序作为“Microsoft 混合现实工具包”包的一部分提交和接受,Microsoft MRTK 团队会将其打包,作为 MRTK 产品/服务的一部分进行分发。

另请参阅