#c# #unity3d
Вопрос:
Я пытаюсь получить доступ к камере устройства, над которым работает моя программа unity. Я знаю, что приложение работает, когда у него есть доступ, и у него есть некоторые сообщения об ошибках на случай, если камеры не будут обнаружены, но я сталкиваюсь с проблемой, когда пользователь не позволяет мне получить доступ к камере устройства. Unity обнаруживает камеры, когда у меня есть к ним доступ, и когда у меня его нет. Только когда я пытаюсь использовать камеру (с backCam.Play();
помощью которой backCam является WebCamTexture
объектом), я получаю какую-либо ошибку о проблеме, которая гласит:: ERROR - Could not find specified video device
Я попытался решить эту проблему backCam.Play();
try
catch
, заключив в блок и, и установил аргумент catch Exception e
в значение, как я читал, что это будет перехватывать все исключения. При выполнении этот блок catch не срабатывает. Я также попытался заменить catch
на finally
, но, похоже, это finally
срабатывает, даже если у меня есть доступ к камере, а это не то, чего я хочу.
Я попытался найти какие-либо внутренние команды, которые могли бы сказать мне, есть ли у меня доступ к камере, но безуспешно. Я также искал на онлайн-форумах вопрос, похожий на этот, но безуспешно.
Я не очень хорошо знаком с библиотеками c# и unity, поэтому, возможно, что-то упустил на этом пути.
Последующие действия: Возможно, причина, по которой мой try - catch
блок не работает, связана с WebCamTexture
тем, что эта проблема уже обнаружена внутри, и, следовательно, внешняя, определенная мной, игнорируется. Если это так, есть ли у меня вообще способ обнаружить это событие?
Комментарии:
1. Как насчет попытки получить 1-й кадр с камеры, если у вас нет к ней доступа, в этот момент должно возникнуть исключение, и вы сможете с этим справиться?
2. Разве не это происходит, когда я пытаюсь использовать
backCam.Play();
?3. Try-catch может не сработать здесь, если код C# не может поймать ошибки из собственного кода, поэтому WebCamTexture. Функция Play() может взаимодействовать с кодом для любой платформы, на которой она работает. К сожалению, как вы уже упоминали, это проблематично, поскольку вы не можете знать, будет ли работать камера, пока не попробуете. Даже если вы сможете убедиться, что у вас есть разрешение, оно не сработает, если другая программа уже использует эту камеру. Вероятно, об этом нужно сообщить Unity, так как нет методов или свойств, которые нужно сначала проверить, и вы не можете попытаться это поймать.
4. На самом деле это кажется лучшим вариантом действий. Не хотели бы вы дать ответ вместо комментария, чтобы я отметил его как ответ @johnfernow?
5. Спасибо @Divinor. Если в будущем я увижу, что Unity добавляет новые методы или свойства для проверки, я обновлю ответ.
Ответ №1:
Try-catch
здесь может произойти сбой, если код C# не может перехватывать ошибки из собственного кода, поэтому WebCamTexture.Play()
может взаимодействовать с кодом для любой платформы, на которой он работает.
К сожалению, как вы уже упоминали, это проблематично, поскольку вы не можете знать, будет ли работать камера, пока не попробуете. Даже если вы сможете убедиться, что у вас есть разрешение, оно не сработает, если другая программа уже использует эту камеру.
Вероятно, об этом необходимо сообщить в Unity, так как нет методов или свойств, которые можно было бы проверить, можете ли вы использовать данную камеру, и вы не можете try-catch
этого сделать, а это означает, что у вас нет уверенности в том, что вы избежите ошибок.
Ответ №2:
Если ошибка возникает не как исключение, а скорее как «нормальная» Debug.LogError
ошибка Unity, то a 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)
в противном случае веб-камера не может быть использована.
Комментарии:
1. Возможно, я недостаточно ясно дал это понять в посте, я немного отредактирую его соответственно. Даже если у меня нет доступа к камере устройства, запуск
WebCamTexture.devices
все равно заполняет мой массив устройств камерами (к которым у меня нет доступа). Как и у вас, у меня также естьif
место, где я проверяю размер массива. Кроме того, я пробовалif(webCam)
, но без шансов, если все еще срабатывает, даже если у меня нет доступа к камере2. Не могли бы вы провести тест и распечатать названия всех «доступных» устройств …. Я думаю, что это может быть связано с названием устройства, которое не указано, например, здесь, Как мне получить доступ к веб-камере, если Unity не сообщит о своем имени? .. к сожалению, кажется, что для этого случая нет реального решения, так как Unity идет по имени устройства
3. Имена всех устройств в
devices
массиве при наличии разрешения: веб-камера USB2.0 HD UVC, USB-камера. Если разрешение не дано: Веб-камера USB2.0 HD UVC, USB-камера. Я проверил это раньше, надеясь, что имена будут пустыми