我正在尝试访问我的unity程序正在运行的设备的摄像头。我知道该应用程序在有访问权限时可以工作,如果没有检测到摄像头,我会收到一些错误消息,但当用户不允许我访问设备摄像头时,我遇到了问题。Unity在我可以接触到相机和无法接触到相机时都会检测到相机。只有当我尝试使用相机时(使用backCam.Play();
,其中backCam是WebCamTexture
对象),我才会收到关于该问题的任何错误,其内容为:ERROR - Could not find specified video device
我试图通过用try
和catch
块封装backCam.Play();
来处理这个问题,并将catch参数设置为Exception e
,因为我已经读到这将捕获所有异常。执行时,此catch块不会触发。我也尝试过用finally
替换catch
,但似乎即使我可以使用相机,finally
也会触发,这不是我想要的。
我试图找到任何内部命令,告诉我是否可以访问相机,但运气不佳。我也一直在网上论坛上搜索类似的问题,但运气不佳。
我对c#和unity库不是很熟悉,所以在这一过程中我可能错过了一些东西。
后续:我的try - catch
块不起作用的原因可能是WebCamTexture
已经在内部发现了这个问题,因此我定义的外部问题被忽略了。如果是这样的话,我有没有办法检测到这个事件?
我今天遇到了这个问题,并为将来遇到这个问题的人整理了一个两步方便的解决方案。
@derHugo说尝试接球没有帮助是正确的,Unity没有为这个问题抛出一个可接球的例外:
如果错误不是作为异常抛出的,而是作为"异常"抛出的;正常的";Debug.LogError Unity创建,然后尝试捕获不会有帮助,没有
因此,由于try-catch在这里是不可行的解决方案,我发现我们需要添加一个简单的日志处理程序来查看日志,并手动决定是否暂停。这个解决方案意味着我们基本上可以自定义"catch"并检查抛出的所有错误-选择忽略网络摄像头错误。但我们仍然可以让Unity暂停任何其他错误/异常,就像Unity通常在启用"错误暂停"时一样(默认情况下)。
步骤1-禁用"错误暂停">
这是Unity控制台区域中的一个按钮,就在调试日志和错误打印位置的上方。禁用此选项意味着Unity不会因任何错误而暂停。接下来我们需要添加一个脚本,让我们自己控制暂停功能。
步骤2-日志处理程序
这是我根据这个统一文档编写的日志处理程序C#脚本。用下面的代码创建"LogHandler.cs",并将其放在场景中的一个空对象上(我刚刚称之为"LogHandler"),这样它就可以与你的游戏一起运行:
using UnityEngine;
using UnityEditor;
using System.Collections;
public class LogHandler : MonoBehaviour
{
public string output = "";
public string stack = "";
void OnEnable()
{
Application.logMessageReceived += HandleLog;
}
void OnDisable()
{
Application.logMessageReceived -= HandleLog;
}
void HandleLog(string logString, string stackTrace, LogType type)
{
output = logString;
stack = stackTrace;
//Check if incoming log is an ERROR or EXCEPTION
if(type == LogType.Error || type == LogType.Exception) {
//Catch our custom webcam error (add more here if needed)
if (output == "ERROR - Could not find specified video device") {
Debug.Log("Caught a custom webcam error! [Not Pausing]");
//trigger anything custom for the error here, like printing error text to the screen or something
//otherwise this will ignore and not pause - as we want
} else {
//debug pause as normal for all other errors
Debug.Break();
}
}
}
}
那就行了!
Unity将忽略此网络摄像头设备问题并继续运行。任何其他错误或异常,Unity仍将通过LogHandler中的Default.Break()暂停。您还可以添加任何其他要忽略的错误。我在"HandleLog()"函数中添加了一个自定义选项,该选项在显示"RROR WebCam Device Not Available">的场景中添加了一些红色文本-因此,即使Unity现在忽略了该错误,你仍然会得到一些视觉反馈,表明该错误已被触发(这将向用户解释为什么没有网络摄像头视频播放)。
希望这能帮助到别人。这不是一个直观的问题,也是一个相当棘手的解决方案,但它符合我的需求。
Try-catch
如果C#代码无法从本机代码中捕获错误,则可能会在此处失败,因此WebCamTexture.Play()
可以与它运行的任何平台的代码接口。
不幸的是,正如你所提到的,这是有问题的,因为在你尝试之前,你无法知道相机是否能工作。即使你可以验证你是否有权限,如果另一个应用程序已经在使用该相机,它也会失败。
这可能需要向Unity报告,因为没有方法或属性可以检查你是否可以使用给定的相机,而你不能try-catch
,这意味着你不确定你会避免错误。
如果错误不是作为异常抛出的,而是作为一个"正常的";Debug.LogError
Unity创建一个try - catch
没有帮助,没有。
finally
的确切目的是,无论之前是否触发任何catch
块,它都会运行始终。
您想做的是先检查WebCamTexture.devices
。
返回可用设备的列表。
如果没有可用的设备,那么您已经知道它无法工作。
private WebCamTexture webCam;
private void Awake()
{
var devices = WebCamTexture.devices;
if(devices.Length == 0)
{
Debug.LogWarning("No webcam available!", this);
}
else
{
webCam = new WebCamTexture();
// this basically equals
//webCam = new WebCamTexture(devices[0].name);
}
}
然后以后每当做一些与网络摄像头相关的事情时,首先检查
if(webCam)
否则无法使用网络摄像头。