最近开发项目,其中有一个需求是要调用安卓相机实现扫描功能。完了,懵逼了,没搞过,那就问度娘呗。百度出来的答案,基本上都是使用 AndroidStudio 开发一个 jar 包,然后放到 Unity3D 里面使用。这种 方法实现肯定没问题,但是我觉得很不友好,Unity3D 开发人员,平常使用的都是 C# 语言,用 Java 去开发,总少不了踩一堆坑,如果是大佬,那另说。而且有的时候,网上的教程不一定符合自己的需求,改起来也困难重重。
还好 Unity3D 给我们提供了接口,这可省了不少麻烦。而且不仅可以调用手机的相机,电脑的相机也可以调用。逻辑很简单,注释我也写的很详细,下面就直接上代码了:
1 using UnityEngine; 2 using UnityEngine.UI; 3 4 public class Test : MonoBehaviour 5 { 6 #region --变量定义 7 [SerializeField] private Vector2 webCamSize = new Vector2(1920, 1080); 8 [SerializeField] private int webCamFPS = 20; 9 [SerializeField] private RawImage targetImage; 10 private WebCamTexture webCamTexture; 11 #endregion 12 13 #region --系统函数 14 private void Start() 15 { 16 StartCamera(); 17 } 18 #endregion 19 20 #region --自定义函数 21 /// <summary> 22 /// 启用相机 23 /// </summary> 24 public void StartCamera() 25 { 26 //发起使用相机设备权限的请求 27 Application.RequestUserAuthorization(UserAuthorization.WebCam); 28 //如果请求授权成功。 29 if (Application.HasUserAuthorization(UserAuthorization.WebCam)) 30 { 31 //获取相机设备。有的设备有多个相机,所以这里返回的是个数组。 32 WebCamDevice[] devices = WebCamTexture.devices; 33 //生成一张相机实时渲染的纹理图。 34 webCamTexture = new WebCamTexture(devices[0].name, (int)webCamSize.x, (int)webCamSize.y, webCamFPS); 35 //将相机画面渲染的UI的RawImage上。 36 targetImage.texture = webCamTexture; 37 //开始渲染。 38 webCamTexture.Play(); 39 } 40 } 41 #endregion 42 }
就这么几句话就能调用相机,比上面说的打包 jar 包去调用相机简直不知道简单多少倍。
如果是开发手机端的朋友,肯定会发现,上面这段代码调用相机后,相机的画面显示会有点问题,画面旋转了90度,其实只需要将我们显示用的 RawImage 旋转90度即可。