-1

我正在使用 Unity3d,使用 C# 和 ARKit 插件(来自 Github 的 2.0)

在我当前的应用程序中,我使用 ARKit 来测量距离。我正在创建的工具仅出于这个原因才需要此功能,所以我想知道如何在用户需要标尺时启用 ARKit,如果不需要,则禁用它。

我想避免在用户使用非 ARKit 工具时出现一些性能损失。如果我会说 ARKit 仍然在后台工作,那么我是对的,如果你在哪里初始化它一次?我是 ARKit 的新手,所以我对如何处理它没有一个完美的概述。

删除一些代码行没有任何意义,它基本上是项目中的插件导入,以及我自己的依赖于某些功能的脚本 - 我没有更改插件源代码中的任何内容。我编写的测量工具本身运行良好,但我无法确定如何激活和停用 ARKit。

有人可以帮我解决这个问题吗?当我禁用游戏对象时,脚本正在运行它似乎是一种“肮脏”的方法来避免这些功能,但我必须让它干净(例如,背景中的视频地图也需要被禁用 - 我猜那些ARKit 功能不会被暂停或禁用,只是因为某些脚本被禁用,似乎 api 仍然在后台运行,因为当我这样做时它会滞后)

如果您需要更多信息,请告诉我。每一个帮助或建议都会非常好。

非常感谢!

4

2 回答 2

1

当前的 ARKit API 在运行时没有在 Unity 中禁用或启用它的方法。

话虽如此,Unity 有自己的功能来启用和禁用 VR、AR 或 XR 插件。如果 ARKit 构建正确,这个方法应该可以工作。因此,您可以通过设置为来禁用/启用 ARKit,并通过将其设置XRSettings.enabled为来false启用它true

使用空字符串调用也是一个好主意XRSettings.LoadDeviceByName,等待帧,然后再设置XRSettings.enabledfalse禁用它:

IEnumerator DisableAR()
{
    XRSettings.LoadDeviceByName("");
    yield return null;
    XRSettings.enabled = false;
}

然后调用禁用:

StartCoroutine(DisableAR());
于 2018-07-24T11:29:06.130 回答
0

我想我正在回答一个很老的帖子。我找到了一种方法,但我不知道这是否是您所期望的。

就像@Programmer 所说

当前的 ARKit API 在运行时没有在 Unity 中禁用或启用它的方法。

所以我使用的方式是结合程序员的代码,如果你需要相机渲染一些天空盒或纯色,我在非 AR 模式下做了类似的事情,在改变它之前保存当前纹理,作为实时视频以纹理的形式提供给材质,在保存后将纹理更改为 null,当您想要重新启用 AR 时,您将纹理设置回保存的值并正确加载。

    bool ARMode;
    bool isSupported;
    Camera cam;
    UnityARCameraManager ARCameraManager;
    private Texture2D _videoTextureY;
    private Texture2D _videoTextureCbCr;

    private void Awake()
    {
        cam = Camera.main;
        isSupported = FindObjectOfType<UnityARCameraManager>().sessionConfiguration.IsSupported;
        ARMode = isSupported;
        ARCameraManager = FindObjectOfType<UnityARCameraManager>();
    }

    void DisableAR()
    {

        XRSettings.enabled = false;
        ARCameraManager.enabled = false;
        _videoTextureY = (Texture2D)cam.GetComponent<UnityARVideo>().m_ClearMaterial.GetTexture("_textureY");
        _videoTextureCbCr = (Texture2D)cam.GetComponent<UnityARVideo>().m_ClearMaterial.GetTexture("_textureCbCr");

        cam.GetComponent<UnityARVideo>().m_ClearMaterial.SetTexture("_textureY", Texture2D.blackTexture);
        cam.GetComponent<UnityARVideo>().m_ClearMaterial.SetTexture("_textureCbCr", Texture2D.blackTexture);
        cam.clearFlags = CameraClearFlags.SolidColor;
        cam.backgroundColor = Color.black;
        cam.GetComponent<UnityARVideo>().enabled = false;
    }

    void EnableAR()
    {
        ARCameraManager.enabled = true;
        XRSettings.enabled = true;
        cam.clearFlags = CameraClearFlags.Depth;
        cam.GetComponent<UnityARVideo>().m_ClearMaterial.SetTexture("_textureY", _videoTextureY);
        cam.GetComponent<UnityARVideo().m_ClearMaterial.SetTexture("_textureCbCr", _videoTextureCbCr);
        cam.GetComponent<UnityARVideo>().enabled = true;
    }
于 2019-12-04T07:35:19.453 回答