它对相机硬件不是太“了解”
用它的API,3000块钱的手机和500块钱的手机的拍照效果相差不大。造成这种差异的原因是,unity的相机方面的API,他没有获取相机参数的方式,对于相机的硬件设备,它只是单方面的要求,没有互动,它的模式是,我需要什么样的图片,那么我就要求相机返回什么样的图片给我,而不关心它是否真的能有能力返回给我。通俗的讲就是,在它看来,黄金和铁都是金属,它没法利用黄金比铁高出来的价值,而只认为它们都只是金属而已。
camtexture = new WebCamTexture(cameraDevs[0].name, Screen.height, Screen.width, 60);
camtexture.Play();
它没有获得相机Info相应的方法
甚至于他没法在拍照的时候在正确的时机开启闪光灯。
它的拍照原理是对当前显示texture的截图
Texture2D mTexture = new Texture2D(camtexture.width, camtexture.height, TextureFormat.RGB24, false);
mTexture.SetPixels(camtexture.GetPixels(0, 0, camtexture.width, camtexture.height));
mTexture.Apply();
byte[] bt = mTexture.EncodeToJPG(100);
string mPhotoName = DateTime.Now.ToString("yyyyMMddHHmmss") + ".jpg";
string mPhotoDir = Application.persistentDataPath + "/" + "iezviewCamera" + "/";
if (!Directory.Exists(mPhotoDir)) {
Directory.CreateDirectory(mPhotoDir);
}
string mPhotoPath = mPhotoDir+ mPhotoName;
System.IO.File.WriteAllBytes(mPhotoPath, bt);
Debug.Log("照片路径 " + mPhotoPath);
这样造成的结果就是,如果你想让拍照拍出来的图片质量越好,那么就需要你预览的时候要求它输出的质量越好,而预览的时候输出质量好的代价,就是手机的性能,你就会发现预览界面一卡一卡的,好了,拍照的质量和预览的流畅度中间,少年,该做个了断了。:) 而如果使用AndroidAPI,则可以输出达到3120*4160分辨率的图片,unity方面API输出分辨率经测试最大值仅为1536*2048。
它的对焦方式只能是自动对焦
它的对焦方式是自动对焦,并且没法在一个时间点捕捉它的对焦状态。除非你有别的黑科技途径。
当然你可以尝试让相机同时输出到两个texture里面,一个用来预览,另外的一个专门用来拍照时play()->截取图片->存储—->拍完stop(),这样不就能解决我上面说到的问题了吗。可以预料到这样的话他在预览的时候是流畅的,而仅仅是在拍照的时候会有一个卡顿,但总会好上那么一点点吧,结果是他在拍照时候的卡顿非常之久,显然这种方式显然也是不好的。
优点,跨平台能力
unity的跨平台能力是很棒的,因此如果你用unity能开发出一个满足要求的相机,就能在多平台运行,这不管对于开发的效率还是对后期的维护成本都是十分有利的。并且它支持导出Android和IOS,开发一个这样的插件用作这两个平台是很不错的选择。
总结
总结来说就是:unity开发的相机虽然能在多个平台上面运行,但是它也被迫的放弃了一些东西,它在相机方面的API没有很好的发挥出相机的硬件优势。我推测unity 相机方面的API的初衷应该是适用于给AR开发提供轻量级的图像流,数据量小,兼容性强,跨平台,这对于普遍性能较低的移动设备是喜闻乐见的。