项目一直在赶进度,写博的时间愈来愈少了~从事Unity开发也快两个月了,AR方向~ 使用的是高通家的SDK Vuforia。。。从工程融合一直到对unity和Vuforia的深层次的开发,新东西,毕竟坑多。。国内作AR开发的没有自家的SDK通常都是用国外的SDK或则国内其余家的一些SDK吧~ 使用这些SDK作AR开发都有共同的一个特性,都喜欢在Unity里面作开发。Unity以前一直是游戏引擎,直到Unity5.0版本出来后Unity官方有一个方向转变,不单单是游戏引擎并且Unity能够作应用级别的开发,可是Unity应用级的开发是一个刚刚起步的开发,Unity里支持的东西不够全面,扩张性不够强,脚本语言的控制和原生设备的兼容性也不够,就是由于这些缘由,有了工程融合,iOS、Android的工程和Unity的工程融合在一块儿开发,使得Unity的支持面更广,扩张性更强,不少Unity作不到的,或则难作的,就可让原生来开发,这时候~unity就是一个万金油~code
** 好了,本文主要讲解的是Unity对Vuforia的开发中在原生调用摄像头上遇到的坑~Unity中调用设备摄像头打开或则关闭,或则开关扫描识别问题等等一些状况~ 下面先说说趟过的坑,再说说解决办法,或则目前没有解决的问题 **blog
先说说状况,移动端App的iOS的项目中有三个界面,其中一个就是扫描界面,扫面界面当让是Unity对Vuforia的开发导出的工程融合在原生的项目中的~当我程序退出扫描界面后Unity和Vuforia应该处于暂停状态OnPause,笔者研究了一段时间,在iOS中使用UnityInterface.h中暴露的暂停接口根本就没有让扫描暂停~以下图接口
笔者尝试了一次又一次的interface中的方法,相机就根本不能暂停,,原来童话里都是骗人的~可能 有人会想到暂停不了也没有什么大不了的 吧~ 我研究了一下国内的App,是有几款App没有暂停~例如幻视,,问题又来了,,既然相机不能暂停就不让他暂停呗~ 但是咱们的项目中有这样一个需求,见下图~游戏
拍照功能~扫描界面不能暂停Camera,其余界面如今要调用Camera,,作过移动端开发的都知道,,Camera是实例化出来的,并且是单例,,若是再一次实例化这时候,程序 ~ 崩~开发
因此不把 摄像头暂停确定不行~ 这时候笔者经过UnityInterface.h 的方法是Camera 暂停了,,这时候~ 新的问题又出来了,,经过这样的方法使Camera暂停了,但是Vuforia仍是在继续调用摄像头再继续扫面,,,虽然Camera 是关闭了,界面上看不到,这时候其实Vuforia仍是在调用摄像头继续扫面,这时候~ 笔者想到的惟一办法就是 经过Unity内部去控制Vuforia,再向原生暴露须要调用的接口~ 因此有了如下方法~it
// 关闭相机 public void CloseCameraDevice () { CameraDevice.Instance.Stop(); CameraDevice.Instance.Deinit(); } // 打开相机 public void OpenCameraDevice () { CameraDevice.Instance.Init(CameraDevice.CameraDirection.CAMERA_DEFAULT); CameraDevice.Instance.Start(); } // 关闭识别 public void CloseCloudReco () { CloudRecoBehaviour cloudRecoBehaviour = GameObject.FindObjectOfType(typeof(CloudRecoBehaviour)) as CloudRecoBehaviour; cloudRecoBehaviour.CloudRecoEnabled = false; } // 打开识别 public void OpenCloudReco () { CloudRecoBehaviour cloudRecoBehaviour = GameObject.FindObjectOfType(typeof(CloudRecoBehaviour)) as CloudRecoBehaviour; cloudRecoBehaviour.CloudRecoEnabled = true; }
上面这些方法是在Unity里面实现的,写在一个脚本里,挂在一个GameObject上供原生调用~io
Android在扫描界面打开闪关灯,由于扫描界面Unity调用了Camera,安坐的闪关灯是经过实例化相机来打开的~这时候Android拿不到Camera,由于Unity把Camera暂用了,,在扫描界面不能打开闪关灯~ 解决方法~以下兼容性
public void OpenFlash () { CameraDevice.Instance.SetFlashTorchMode (true); } public void CloseFlash () { CameraDevice.Instance.SetFlashTorchMode (false); }