【问题标题】:Unity3D access variable set through Xcode通过 Xcode 设置 Unity3D 访问变量
【发布时间】:2014-10-06 12:00:56
【问题描述】:

我正在创建一个使用设备相机的应用程序。 我需要实现一个函数来检查用户是否允许应用访问设备摄像头,如果没有,使用摄像头的场景只会显示黑屏。

由于Unity在webplayer平台只支持Application.HasUserAuthorization,所以需要在构建后通过XCode给项目添加授权检查。

首先,我在 UnityAppController.mm 文件中的 didFinishLaunchingWithOptions 中添加了以下代码:

// 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];

    }

结果是,每次运行应用程序时,都会出现一个弹出窗口,指示用户激活摄像头,这是一个进度,但他们仍然可以访问显示黑屏的场景,而不是摄像头视图。

有什么方法可以让我在 Unity 中访问 CameraIsAvilable 变量?

任何建议将不胜感激!蒂亚!

【问题讨论】:

    标签: c# ios xcode unity3d


    【解决方案1】:

    我使用 UnitySendMessage 函数解决了这个问题。

    首先我在UnityAppController.mm中更新了didFinishLaunchingWithOptions,下面是修改后的代码:

    // 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 中,我在游戏的第一个场景中添加了一个名为“iOSManager”的 GameObject(注意:GameObject 名称必须与 UnitySendMessage 函数的第一个参数匹配)。

    我用 cameraCheck() 函数创建了以下脚本(函数名与 UnitySendMessage 函数的第二个参数匹配):

    #if UNITY_IOS
    void cameraCheck(string value)
    {
        // DO SOMETHING WITH VALUE
    }
    #endif
    

    其中字符串“value”是从 UnitySendMessage 发送的值

    现在我可以在 Unity3D 中使用这个值

    【讨论】:

    • 太棒了。这就是我需要的!
    • 很高兴它帮助了你! :)
    猜你喜欢
    • 2016-12-06
    • 2011-07-14
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多