Unity+Vuforia+ZXing解析二维码

来源:互联网 发布:什么软件有耽美动漫 编辑:程序博客网 时间:2024/04/30 05:50

unity中扫描二维码最常用的是EasyCodeScan,但使用后还是觉得太过麻烦。这需要对IOS和Android都有一定了解才能根据自己的想法做更改,这对很多半路出家的unity新手们来说就有些困难了(当然我也是新手)。
我做的项目主要AR,所以我就想办法将vuforia与二维码扫描结合到一起。

using UnityEngine;using System.Collections;using System;using Vuforia;using System.Threading;using ZXing;using ZXing.QrCode;using ZXing.Common;using UnityEngine.SceneManagement;public class CameraImageAccess : MonoBehaviour{    private Image.PIXEL_FORMAT m_PixelFormat = Image.PIXEL_FORMAT.GRAYSCALE;    private bool m_RegisteredFormat = false;    public bool reading;    public string QRMessage;    public UnityEngine.UI.Text labelQrc;    public AudioSource audioSource;    Thread qrThread;    private Color32[] c;    private int W, H;    Image QCARoutput;    bool updC;    bool gotResult = false;    void Start()    {    }    void OnEnable()    {                                VuforiaARController.Instance.RegisterTrackablesUpdatedCallback (OnTrackablesUpdated);        }        var isAutoFocus = CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);        if (!isAutoFocus)        {            CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_NORMAL);        }        );        qrThread = new Thread(DecodeQR);        qrThread.Start();    }    void OnDisable()    {        qrThread.Abort();        qrThread = null;    }    public void OnTrackablesUpdated()    {           Vuforia.CameraDevice cam = Vuforia.CameraDevice.Instance;        if (!m_RegisteredFormat)        {            Vuforia.CameraDevice.Instance.SetFrameFormat(m_PixelFormat, true);            m_RegisteredFormat = true;        }        QCARoutput = cam.GetCameraImage(m_PixelFormat);        if (QCARoutput != null)        {            reading = true;            updC = true;        }        else        {            reading = false;            Debug.Log(m_PixelFormat + " image is not available yet");        }    }    void Update()    {        CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);        if (reading)        {            if (QCARoutput != null)            {                if (updC)                {                    updC = false;                    Invoke("ForceUpdateC", 1f);                    if (QCARoutput == null)                    {                        return;                    }                    c = null;                    c = ImageToColor32(QCARoutput);                    if (W == 0 | H == 0)                    {                        W = QCARoutput.BufferWidth;                        H = QCARoutput.BufferHeight;                    }                    QCARoutput = null;                }            }        }        labelQrc.text = QRMessage;        if (gotResult) {            audioSource.Play ();            gotResult=false;        }    }    void DecodeQR()    {        var barcodeReader = new BarcodeReader { AutoRotate = false, TryHarder = false };        barcodeReader.ResultFound += OnResultF;        while (true)        {            if (reading && c != null)            {                try                {                    ZXing.Result result = barcodeReader.Decode(c, W, H);                    c = null;                    if (result != null)                    {                        QRMessage = result.Text;                    }                }                catch(Exception e)                {                    Debug.LogError(e.Message);                }            }        }    }    void OnResultF(Result result)    {        Debug.Log(result.Text);        gotResult = true;    }    void ForceUpdateC()    {         updC = true;    }    Color32[] ImageToColor32(Vuforia.Image a)    {        if (!a.IsValid()) return null;        Color32[] r = new Color32[a.BufferWidth * a.BufferHeight];        for (int i = 0; i < r.Length; i++)        {            r[i].r = r[i].g = r[i].b = a.Pixels[i];        }        return r;    }}

直接复制就可以用,当然可能因为unity和vuforia的版本问题,会有一些报错的情况,这就需要查看文档自行更改了。

0 0
原创粉丝点击