unity3d 调用安卓手机摄像头

相信如果使用U3d做过PC端摄像头程序开发的朋友对WebCamTexture类一定不陌生,特别是做AR、Kinect方面的开发视像的捕捉都是通过WebCamTexture类,使用WebCamTexture我们可以很方便地使用摄像头捕捉到的数据实现对象的动态贴图。但不知道有多少朋友试过在移动平台上使用WebCamTexture类进行开发(特别是Android平台)?加入曾经接触过,那肯定有一段狂抓史,哪怕是短暂的。  unity3d 调用安卓手机摄像头_第1张图片 


Android的兼容性被总被诟病,特别是涉及到一些相对底层的开发,相机开发也是一件让人懊恼的事,特别是当系统版本从2.x跨越到4.0,U3d导出的apk如果没有经过适当的设置可能出现黑屏现象。下面我将为大家介绍一下如何使用U3d实现Android后置相机的全屏取景(程序运行效果如上图所示),相机的全屏取景主要在开发AR应用时会用到,我们需要把后置相机的取景作为屏幕的背景,当然更高级的AR开发技巧我将会在后续的文章里面为大家分享。

unity3d 调用安卓手机摄像头_第2张图片 

第一步 ,我们需要先创建一个新的U3d工程,在场景中拖入一个GUITexture对象(用于显示相机的取景),并将这个GUITexture对象命名为myCam(当然这里的命名不是唯一的,大家可以根据自己的喜好进行命名,主要是为了好管理)。


第二步,创建一个命名为WebCameraScript.cs的c#脚本文件,代码如下:

using UnityEngine;
using System.Collections;
using System.IO;
using System;

public class WebCameraScript : MonoBehaviour
{

    public GUITexture textrue;
    private WebCamTexture webCameraTexture;

    void Start()
    {

        //检查有多少,哪些相机可在设备上
        for (int cameraIndex = 0; cameraIndex < WebCamTexture.devices.Length; cameraIndex++)
        {
            //我们希望后面的相机
            if (!WebCamTexture.devices[cameraIndex].isFrontFacing)
            {
                //webCameraTexture = new WebCamTexture(cameraIndex, Screen.width, Screen.height);
                webCameraTexture = new WebCamTexture(cameraIndex, 200, 200);
                // 这里我们翻转GuiTexture通过应用一个localScale变换
                // 只有在横向模式工作
                textrue.transform.localScale = new Vector3(1, 1, 1);
            }
        }

        // 将图片显示在GUITextrue上
        textrue.texture = webCameraTexture;

        // 开始拍照
        webCameraTexture.Play();
    }

    public void ShowCamera()
    {
        textrue.guiTexture.enabled = true;
        webCameraTexture.Play();
    }

    public void HideCamera()
    {
        textrue.guiTexture.enabled = false;
        webCameraTexture.Stop();
    }

    void OnGUI()
    {
     if (GUI.Button(new Rect(0, 0, 100, 100), "ON/OFF"))
        {
            if (webCameraTexture.isPlaying)
                this.HideCamera();
            else
                this.ShowCamera();
        }
    }
上述代码有部分地方需要注意:

myCameraTexture.transform.localScale = new Vector3(1,1,1);


如果当前的Android系统版本为2.x,上述的代码需要改为 myCameraTexture.transform.localScale = new Vector3(-1,-1,1);否则会出现黑屏,内容无法显示。


unity3d 调用安卓手机摄像头_第3张图片 


第三步,我们需要把脚本文件 WebCameraScript.cs绑定在Main Camera对象中,把myCam对象拖到WebCameraScript脚本的myCameraTexture属性中。
unity3d 调用安卓手机摄像头_第4张图片 

最后一步 ,导出apk,菜单栏file->Build Settings...弹出窗口,并选择Plaer Settings。在属性栏中找到Per-Platform Settings中的Resolution and Presentation设置设备的运行姿态,选择Landscape Left或者是Landscape Right,设备显示姿态必须为横向,否则显示的图像就会出现扭曲。
unity3d 调用安卓手机摄像头_第5张图片 
在Other Settings中Bundle Identifier必须输入三级目录,否则生成会失败。加入目标设备为4.X则Minimum API Level一栏要选择Android 4.0,如果选择不正确屏幕会黑屏。在Unity3d 3.5.2f版本中,输出的apk可能会出现屏幕黑屏的情况,但后来我换上Unity3d 4.0.1版本后输出就正常了,可能是U3d不同版本的BUG吧。
unity3d 调用安卓手机摄像头_第6张图片 

你可能感兴趣的:(unity3d,摄像头)