猿问

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

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

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

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

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

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

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


阿晨1998
浏览 351回答 2
2回答

红颜莎娜

当前的 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());

慕容森

我想我正在回答一个很老的帖子。我找到了一种方法,但我不知道这是否是您的期望。就像@Programmer 说的当前的 ARKit API 没有在运行时在 Unity 中禁用或启用它的方法。所以我使用的方法是结合程序员的代码,如果你需要相机来渲染一些天空盒或纯色,我在非 AR 模式下做了类似的事情,通过在更改之前保存当前纹理,作为实时视频将纹理作为材质提供,保存后将纹理更改为空,当您想要重新启用 AR 时,您将纹理设置回保存的值,并正确加载。&nbsp; &nbsp; bool ARMode;&nbsp; &nbsp; bool isSupported;&nbsp; &nbsp; Camera cam;&nbsp; &nbsp; UnityARCameraManager ARCameraManager;&nbsp; &nbsp; private Texture2D _videoTextureY;&nbsp; &nbsp; private Texture2D _videoTextureCbCr;&nbsp; &nbsp; private void Awake()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; cam = Camera.main;&nbsp; &nbsp; &nbsp; &nbsp; isSupported = FindObjectOfType<UnityARCameraManager>().sessionConfiguration.IsSupported;&nbsp; &nbsp; &nbsp; &nbsp; ARMode = isSupported;&nbsp; &nbsp; &nbsp; &nbsp; ARCameraManager = FindObjectOfType<UnityARCameraManager>();&nbsp; &nbsp; }&nbsp; &nbsp; void DisableAR()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; XRSettings.enabled = false;&nbsp; &nbsp; &nbsp; &nbsp; ARCameraManager.enabled = false;&nbsp; &nbsp; &nbsp; &nbsp; _videoTextureY = (Texture2D)cam.GetComponent<UnityARVideo>().m_ClearMaterial.GetTexture("_textureY");&nbsp; &nbsp; &nbsp; &nbsp; _videoTextureCbCr = (Texture2D)cam.GetComponent<UnityARVideo>().m_ClearMaterial.GetTexture("_textureCbCr");&nbsp; &nbsp; &nbsp; &nbsp; cam.GetComponent<UnityARVideo>().m_ClearMaterial.SetTexture("_textureY", Texture2D.blackTexture);&nbsp; &nbsp; &nbsp; &nbsp; cam.GetComponent<UnityARVideo>().m_ClearMaterial.SetTexture("_textureCbCr", Texture2D.blackTexture);&nbsp; &nbsp; &nbsp; &nbsp; cam.clearFlags = CameraClearFlags.SolidColor;&nbsp; &nbsp; &nbsp; &nbsp; cam.backgroundColor = Color.black;&nbsp; &nbsp; &nbsp; &nbsp; cam.GetComponent<UnityARVideo>().enabled = false;&nbsp; &nbsp; }&nbsp; &nbsp; void EnableAR()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; ARCameraManager.enabled = true;&nbsp; &nbsp; &nbsp; &nbsp; XRSettings.enabled = true;&nbsp; &nbsp; &nbsp; &nbsp; cam.clearFlags = CameraClearFlags.Depth;&nbsp; &nbsp; &nbsp; &nbsp; cam.GetComponent<UnityARVideo>().m_ClearMaterial.SetTexture("_textureY", _videoTextureY);&nbsp; &nbsp; &nbsp; &nbsp; cam.GetComponent<UnityARVideo().m_ClearMaterial.SetTexture("_textureCbCr", _videoTextureCbCr);&nbsp; &nbsp; &nbsp; &nbsp; cam.GetComponent<UnityARVideo>().enabled = true;&nbsp; &nbsp; }
随时随地看视频慕课网APP
我要回答