C# 在Unity3d-C中运行时禁用/启用ARKit

C# 在Unity3d-C中运行时禁用/启用ARKit,c#,unity3d,arkit,measurement,rulers,C#,Unity3d,Arkit,Measurement,Rulers,我使用C和Github的ARKit插件2.0与Unity3d合作 在我当前的应用程序中,我使用ARKit测量距离。iam创建的工具之所以需要此功能,就是因为这个原因,所以我想知道,当用户需要标尺时,如何启用ARKit,如果不需要,如何禁用ARKit 我希望避免在用户使用非ARKit工具时出现性能损失。嗯,我是对的,如果我说,ARKit仍然在后台工作,如果你在哪里初始化它一次?我对ARKit的事情还不熟悉,所以我对如何处理它没有一个完美的概述 删除一些代码行没有意义,它基本上是插件导入到项目中,我

我使用C和Github的ARKit插件2.0与Unity3d合作

在我当前的应用程序中,我使用ARKit测量距离。iam创建的工具之所以需要此功能,就是因为这个原因,所以我想知道,当用户需要标尺时,如何启用ARKit,如果不需要,如何禁用ARKit

我希望避免在用户使用非ARKit工具时出现性能损失。嗯,我是对的,如果我说,ARKit仍然在后台工作,如果你在哪里初始化它一次?我对ARKit的事情还不熟悉,所以我对如何处理它没有一个完美的概述

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

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

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


非常感谢

当前的arkitapi没有一种方法可以在运行时在Unity中禁用或启用它

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

最好使用空字符串调用XRSettings.LoadDeviceByName,等待帧,然后将XRSettings.enabled设置为false以禁用它:

IEnumerator DisableAR()
{
    XRSettings.LoadDeviceByName("");
    yield return null;
    XRSettings.enabled = false;
}
然后调用以禁用:

StartCoroutine(DisableAR());

我想我是在回复一个很老的帖子。我找到了一个方法,但我不知道这是否是你所期待的

就像@Programmer告诉我的那样


当前的arkitapi没有一个方法在运行时禁用或启用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;
    }

我以前没有这样做过,但我相信现在你不能用ArkitAPI来做。也许你可以使用Unity的API。能否尝试将XRSettings.enabled设置为true/false,看看是否有效?嗯,感谢您的输入,但我认为这不是我的解决方案。我会对插件有更多的控制。我不理解你的评论。你试过了吗?如果是,结果如何?谢谢!如果可行,我会尝试一下并给你反馈。我不知道ARKit不能通过一个简单的函数或什么来启用或禁用。