我正在尝试访问我的Unity程序正在使用的设备的摄像头。我知道该应用程序在访问时可以工作,并在没有检测到摄像头的情况下显示一些错误消息,但当用户不允许我访问设备摄像头时,我遇到了一个问题。Unity会在我可以访问摄像头和无法访问摄像头时检测摄像头。仅当我尝试使用摄像头时(对于backCam.Play();
,其中backCam是WebCamTexture
对象)我是否收到任何有关此问题的错误,其内容如下:ERROR - Could not find specified video device
我试图通过用try
和catch
块封装backCam.Play();
来处理这个问题,并将catch参数设置为Exception e
,因为我已经读到这将捕获所有异常。该捕捉块不触发。我也试过用finally
替换catch
,但似乎finally
即使我有权限访问相机也会触发,这不是我想要的。
我试图找到任何内部命令,可以告诉我,如果我有权访问相机没有运气。我也一直在搜索在线论坛的一个类似的问题,这没有运气。
我对c#和unity库不是很熟悉,所以我可能错过了一些东西。
跟进:我的try - catch
块不工作的原因可能是WebCamTexture
已经在内部捕捉到这个问题,因此我定义的外部块被忽略了。如果是这样,我是否有办法检测到这个事件?
3条答案
按热度按时间hyrbngr71#
如果C#代码无法捕获本机代码中的错误,
Try-catch
可能会失败,因此WebCamTexture.Play()
可能会与任何平台上运行的代码交互。不幸的是,正如你提到的,这是有问题的,因为你无法知道是否相机将工作,直到你尝试。即使你可以验证你有权限,如果另一个应用程序已经在使用该相机,它将失败。
这可能需要报告给Unity,因为没有方法或属性可供检查,以查看您是否可以使用给定的摄像头,并且您不能
try-catch
它,这意味着您不确定是否会避免错误。anauzrmj2#
如果错误不是作为异常抛出,而是Unity创建的“正常”
Debug.LogError
,则try - catch
不会有帮助。finally
的确切用途是,无论之前是否触发了任何catch
块,它都总是运行。您需要做的是先检查
WebCamTexture.devices
。返回可用设备的列表。
如果没有可用的设备,那么你已经知道它不会工作。
然后以后每当做一些与摄像头相关的事情时,首先检查
否则不能使用网络摄像机。
dphi5xsq3#
我今天遇到了这个问题,并为将来遇到这个问题的人整理了一个两步的方便的工作方法。
@derHugo说try-catch没有帮助是正确的,Unity没有针对此问题抛出可捕获的异常:
如果错误不是作为异常抛出的,而是Debug.LogError Unity创建的"正常"错误,那么try-catch将不会有帮助。
所以尝试-捕捉在这里是不可行的,我发现我们需要添加一个简单的日志处理程序来查看日志并手动决定是否暂停。这个解决方案意味着我们基本上可以自定义"catch"并检查 * 所有 * 抛出的错误-选择忽略网络摄像头错误。但我们仍然让Unity暂停任何其他错误/异常,因为Unity通常会启用"Error Pause"(默认情况下为该选项)。
这是Unity控制台区域中的一个按钮,就在打印调试日志和错误的位置上方。禁用此按钮意味着Unity不会因 * 任何 * 错误而暂停。接下来我们需要添加一个脚本,让我们自己控制暂停功能。
这是我在this unity documentation的基础上编写的日志处理程序C#脚本。使用下面的代码创建"LogHandler.cs",并将其放在场景中的一个空对象(我刚刚将其命名为"LogHandler")上,以便它与您的游戏一起运行:
应该够了!
Unity将忽略此网络摄像头设备问题并继续运行。任何其他错误或异常,Unity仍将通过默认设置暂停。()。您还可以添加任何其他您希望忽略的错误。我还在"HandleLog"中添加了一个自定义选项()'函数,该函数将一些红色文本添加到显示 *' ERROR WebCam Device Not Avalable'*的场景中-因此,即使Unity现在忽略该错误,你仍然会得到一些视觉反馈,表明错误已经被触发(这将向用户解释为什么没有网络摄像头视频正在播放)。
希望这对某些人有帮助。不是一个直观的问题,也是一个相当黑客的解决方案-但它适合我的需要。