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

时间:2018-07-24 07:40:01

标签: c# unity3d arkit measurement rulers

我使用C#和ARKit插件(Github的2.0版)与Unity3d配合使用

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

我要避免在用户使用非ARKit工具时性能下降。我想说的是,如果您在哪里初始化过一次,ARKit仍然可以在后台运行?我是ARKit方面的新手,所以我没有关于如何处理它的完美概述。

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

有人可以帮我这个忙吗?当iam取消GameObjects时,脚本正在运行,这似乎是避免这些功能的“肮脏”方法,但我必须使其干净(例如,还必须禁用后台的视频地图-我猜那些不会因为某些脚本被取消而暂停或禁用ARKit函数,似乎api仍在后台运行,因为我这样做时会滞后)

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

非常感谢!

2 个答案:

答案 0 :(得分:1)

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

话虽这么说,Unity有其自己的功能来启用和禁用VR,AR或XR插件。如果ARKit正确构建,则此方法应该可以工作。因此,您可能可以通过将join设置为<script type="application/javascript"> $('input[type="file"]').change(function(e){ var fileName = e.target.files[0].name; $('.custom-file-label').html(fileName); }); </script> 来禁用/启用ARKit,并通过将其设置为XRSettings.enabled来启用它。

在将false设置为true以将其禁用之前,用空字符串调用XRSettings.LoadDeviceByName也是一个好主意:

XRSettings.enabled

然后调用以禁用:

false

答案 1 :(得分:0)

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

就像@Programmer告诉的那样

  

目前,在运行时,当前的ARKit API还没有一种方法可以在Unity中禁用或启用它。

因此,我使用的方式是合并Programmer的代码,以及如果您需要相机渲染天空盒或纯色,我已经在Non-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;
    }
相关问题