관리 메뉴

caLAB

[유니티 개발]유니티 바코드 인식 본문

Unity/유니티 개발

[유니티 개발]유니티 바코드 인식

도이(doi) 2022. 8. 21. 17:08
728x90

해당 글에는 QR코드에 원하는 데이터를 json형태로 만들어서 생성하고,

이를 유니티 프로젝트에서 인식시켰을 때 json데이터를 parsing해서 유니티에서 읽어오는 것을 다룬다.

 

json데이터 QR코드 만들기

아래 예시와 같이 원하는 정보를 json 데이터로 만든다. 

나는 이름과 아이디를 데이터로 만들었다. 
https://ko.qr-code-generator.com/

 

QR Code Generator | 무료 QR 코드 만들기

URL, vCard 등을 위한 QR Code Generator입니다. 로고, 색상, 프레임을 추가하고 높은 인쇄 품질로 다운로드할 수 있습니다. 지금 무료 QR 코드를 받으세요!

ko.qr-code-generator.com

 

유니티 QR코드 인식 zxing 활용.

해당 github 프로젝트를 다운 받아서. 

https://github.com/micjahn/ZXing.Net

 

GitHub - micjahn/ZXing.Net: .Net port of the original java-based barcode reader and generator library zxing

.Net port of the original java-based barcode reader and generator library zxing - GitHub - micjahn/ZXing.Net: .Net port of the original java-based barcode reader and generator library zxing

github.com

Unity Demo에 있는 zxing.unity.dll 파일을 유니티 프로젝트의 Asset의 하위에 둔다.

*위치 중요. 폴더에 들어가 있을 경우 인식 못하는 경우 발견.

스크립트는 아래와 같이 작성하였다.

jsonLoader는 json데이터를 유니티에서 읽을 수 있는 데이터로 parsing하는 것이고

TestQRcode 스크립트에서는 QR코드의 데이터를 식별한다.

 

해당 QR코드에 기록되어 있는 json데이터를 확인 후 name값이 CannedBi일 경우에 이벤트가 발생하게 하였다.

*한 번 체크한 후 더이상 값을 체크하지 않는 기능을 넣어야 됨. 중복 체크 됨.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class JsonLoader : MonoBehaviour
{
    public static JsonInfo loadJson(string jsonText)
    {
        JsonInfo data = JsonUtility.FromJson<JsonInfo>(jsonText);
        return data;
    }
}

public class JsonInfo
{
    public int id;
    public string name;
}
using System.Collections.Generic;
using System.Collections;
using System;
using UnityEngine;
using ZXing;    //ZXing.dll 임포트 후 선언.
using UnityEngine.UI;
using UnityEngine.Events;
using MoreMountains.Feedbacks;

public class TestQRcode : MonoBehaviour
{
    private Rect screenRect;
    private WebCamTexture camTexture;
    static string strBarcodeRead;
    public RawImage image;
    public GameObject webcam;
    public float waitTime = 1.5f;

    [Header("Feedbacks")]
    public UnityEvent feedBack;

    void Start()
    {
        //카메라 화면 크기 조정 //기본 값 스크린 너비, 높이
        camTexture = new WebCamTexture();
        camTexture.requestedHeight = Screen.height;
        camTexture.requestedWidth = Screen.width;
        screenRect = new Rect(0, 0, Screen.width, Screen.height);
        strBarcodeRead = null;

        //읽어 들이는 웹 캠 텍스쳐 값이 널이 아니면
        if (camTexture != null)
        {
            //QR코드 인식 후 씬이 넘어간다면 반드시 Stop을 해주어야 카메라가 꺼진다.
            //만약 정지 시키고 싶다면 -> camTexture.Stop(); 
            //카메라 동작 플레이.  
            camTexture.Play();
        }

        image.texture = camTexture;
    }

    private void Update()
    {
        if(camTexture.isPlaying)
        {
            try
            {
                //Decode를 통한 QRcode 읽어 들이기. 
                //만약 결과 값이 널이 아니면
                IBarcodeReader barcodeReader = new BarcodeReader();
                var result = barcodeReader.Decode(camTexture.GetPixels32(), camTexture.width, camTexture.height);
                if (result != null)
                {
                    //인식한 QRcode의 텍스트 값을 로그.
                    Debug.Log(result.Text);
                    strBarcodeRead = result.Text;

                    JsonInfo data = JsonLoader.loadJson(result.Text);
                    if (data.name == "CannedBi")
                    {
                        Debug.Log("this is cannedBi get character : " + data.id);
                        //DB.Instance.addData(data.qr_id, data.name);
                        //camTexture.Stop();
                        StartCoroutine("Loading", waitTime);
                    }
                }
            }
            catch (Exception ex)
            {
                Debug.LogWarning(ex.Message);
            }
        }
    }

    IEnumerator Loading(float time)
    {
        yield return new WaitForSeconds(time);
        feedBack.Invoke();
        //ActiveManager.Instance.SetCurrentPage(mPageInfo.selectPage);
    }
}

 

728x90
반응형
Comments