2014-10-06 5 views
1

Я создаю приложение, которое использует устройства камеры. Мне нужно реализовать функцию, которая проверяет, разрешил ли пользователь приложению доступ к камерам устройств, если они этого не сделали, сцена, использующая камеру, просто показывает черный экран.Доступ к переменной доступа Unity3D через Xcode

Поскольку 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... 
} 

и follwoing кода в к 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]; 

    } 

Результатом является то, что каждый когда приложение запускается, появляется всплывающее окно с инструкцией пользователю активировать камеру, whi ch - прогресс, но у них все еще есть доступ к сцене, которая показывает черный экран вместо просмотра камеры.

Есть ли способ получить доступ к переменной CameraIsAvilable изнутри Unity?

Любые предложения были бы высоко оценены! ТИА!

ответ

2

Я решил проблему, используя функцию 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 

Если строка «значение» является значение, отправленное из UnitySendMessage

Теперь я могу использовать это значение в Unity3D

+0

Awesome. Это то, что мне нужно! – jsherk

+0

Рад, что это вам помогло! :) –

Смежные вопросы