Я создаю приложение, которое использует камеру устройств. Мне нужно реализовать функцию, которая проверяет, разрешил ли пользователь приложению доступ к камерам устройств, если они этого не сделали, сцена, использующая камеру, просто показывает черный экран.
Поскольку Unity поддерживает только Application.HasUserAuthorization в платформе webplayer, мне нужно добавить проверку авторизации в проект через XCode после сборки.
Во-первых, я добавил следующий код для didFinishLaunchingWithOptions в файле UnityAppController.mm:
// Determine camera access on iOS >= 7
if ([AVCaptureDevice respondsToSelector:@selector(requestAccessForMediaType:completionHandler:)]) {
// Completion handler will be dispatched on a separate thread
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
if (YES == granted) {
// User granted access to the camera, continue with app launch
CameraIsAvailable = YES;
CameraCheckDone = YES;
}
else {
CameraIsAvailable = NO;
CameraCheckDone = YES;
}
}];
}
else {
// iOS < 7 (camera access always OK)
CameraCheckDone = YES;
// Continue with app launch...
}
и последующий код для applicationDidBecomeActive
while (!CameraCheckDone) { }
if(!CameraIsAvailable){
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Authorize Camera"
message:@"Instructions go here"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alertView show];
[alertView release];
}
В результате каждый раз, когда приложение запускается, появляется всплывающее окно с инструкцией пользователю активировать камеру, что происходит, но у них все еще есть доступ к сцене, которая показывает черный экран вместо просмотра камеры.
Есть ли способ получить доступ к переменной CameraIsAvilable из Unity?
Любые предложения будут ценны! ТИА!
Я решил проблему, используя функцию UnitySendMessage.
Во-первых, я обновил didFinishLaunchingWithOptions в UnityAppController.mm, вот модифицированный код:
// Determine camera access on iOS >= 7
if ([AVCaptureDevice respondsToSelector:@selector(requestAccessForMediaType:completionHandler:)]) {
// Completion handler will be dispatched on a separate thread
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
if (YES == granted) {
// User granted access to the camera, continue with app launch
CameraIsAvailable = YES;
CameraCheckDone = YES;
// ADDED THE FOLLOWING LINE THAT SENDS VALUE "YES" WHEN CAMERA ALLOWED
UnitySendMessage("iOSManager", "cameraCheck", "YES");
}
else {
CameraIsAvailable = NO;
CameraCheckDone = YES;
// ADDED THE FOLLOWING LINE THAT SENDS VALUE "NO" WHEN CAMERA IS NOT ALLOWED
UnitySendMessage("iOSManager", "cameraCheck", "NO");
}
}];
}
else {
// iOS < 7 (camera access always OK)
CameraCheckDone = YES;
// Continue with app launch...
}
Затем в Unity3D я добавил GameObject под названием " iOSManager " к первой сцене моей игры (примечание: имя GameObject должно соответствовать первому параметру функции UnitySendMessage).
Я создал следующий скрипт с функцией cameraCheck() (имя функции соответствует второму параметру функции UnitySendMessage):
#if UNITY_IOS
void cameraCheck(string value)
{
// DO SOMETHING WITH VALUE
}
#endif
Если строка "value" - это значение, отправленное из UnitySendMessage
Теперь я могу использовать это значение в Unity3D