为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
阿晨1998 2021-10-24 17:51:45
我正在使用 Unity3d,使用 C# 和 ARKit 插件(来自 Github 的 2.0)在我当前的应用程序中,我使用 ARKit 来测量距离。我创建的工具仅出于这个原因才需要此功能,所以我想知道如何启用 ARKit,当用户需要标尺并禁用它时,如果不需要。我想避免在用户使用非 ARKit 工具时出现一些性能损失。我是对的,如果我要说,ARKit 仍然在后台工作,如果你在哪里初始化它一次?我是 ARKit 的新手,所以我对如何处理它没有一个完美的概述。删除一些代码行没有任何意义,它基本上是项目中的插件导入,以及我自己的依赖于某些功能的脚本 - 我没有更改插件的源代码中的任何内容。我编程的测量工具本身运行良好,但我无法确定如何激活和停用 ARKit。有人可以帮我解决这个问题吗?当我禁用游戏对象时,正在运行的脚本似乎是一种避免这些功能的“肮脏”方法,但我必须使其干净(例如,背景中的视频地图也需要禁用 - 我猜那些ARKit 函数不会被暂停或禁用,只是因为某些脚本被禁用,api 似乎仍在后台运行,因为它在我这样做时滞后)如果您需要更多信息,请告诉我。每一个帮助或建议都会非常好。
查看完整描述

2 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

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


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


这也是一个好主意,叫XRSettings.LoadDeviceByName一个空字符串,等待帧,设置前XRSettings.enabled要false禁用它:


IEnumerator DisableAR()

{

    XRSettings.LoadDeviceByName("");

    yield return null;

    XRSettings.enabled = false;

}

然后调用禁用:


StartCoroutine(DisableAR());


查看完整回答
反对 回复 2021-10-24
?
慕容森

TA贡献1853条经验 获得超18个赞

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


就像@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;

    }


查看完整回答
反对 回复 2021-10-24
  • 2 回答
  • 0 关注
  • 350 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信