【问题标题】:Disable/enable ARKit during runtime in Unity3d - C#在 Unity3d 运行时禁用/启用 ARKit - C#
【发布时间】:2018-07-24 07:40:00
【问题描述】:

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

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

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

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

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

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

非常感谢!

【问题讨论】:

  • 我以前没有这样做过,但我相信你现在不能用 ARKIT API 做到这一点。也许你可以使用 Unity 的 API。您可以尝试将XRSettings.enabled 设置为真/假,看看是否有效?
  • 嗯,谢谢您的意见,但我认为这不是我的解决方案。我会对插件有更多的控制权。
  • 我不明白你的评论。你试过了吗?如果有,结果如何?

标签: c# unity3d arkit measurement rulers


【解决方案1】:

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

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

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

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

然后调用禁用:

StartCoroutine(DisableAR());

【讨论】:

  • 谢谢!如果可行,我会尝试一下并给您反馈。我不知道 ARKit 不能通过简单的功能或其他东西来启用或禁用。
【解决方案2】:

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

就像@Programmer 所说的那样

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

所以我使用的方式是结合程序员的代码以及如果您需要相机渲染一些天空盒或纯色,我在非 AR 模式下通过在更改之前保存当前纹理来完成类似的操作,如实时视频以纹理的形式提供给材质,保存后将纹理更改为空,当您想要重新启用 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;
    }

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多