在Unity中创建二维码(Zxing)

using System.Threading;
using UnityEngine;
using UnityEngine.UI;
using ZXing;
using ZXing.QrCode;

public class BarcodeCam : MonoBehaviour
{
   
    //二维码的纹理储存
   private Texture2D encoded;

    //显示在UI中的二维码 
    [Tooltip("放入一张rawimage的图片")]
    public RawImage codeimage;

    // 识别二维码使用的摄像头
   private WebCamTexture camTexture;

    // 线程
   private Thread qrThread;

    //颜色
   private Color32[] c;
    //宽高
   private int W, H;
      
    //屏幕的rect
   private Rect screenRect;

    //是否退出
   private bool isQuit;

    //最后得到的结果
    [Tooltip("此处检测url,不必填写")]
    public string LastResult;

    //是否能够编码
   private bool shouldEncodeNow;

    //是否能够使用
    private bool Isuse=false;

   void OnGUI()
   {
      GUI.DrawTexture(screenRect, camTexture, ScaleMode.ScaleToFit);
   }

    #region  此方法是用于识别
    /// <summary>
    /// 此方法是用于识别
    /// </summary>
    void OnEnable()
   {
      if (camTexture != null)
      {
      //     camTexture.Play();
         W = camTexture.width;
         H = camTexture.height;
      }
   }

   void OnDisable()
   {
      if (camTexture != null)
      {
         camTexture.Pause();
      }
   }

    void OnDestroy()
   {
        if(qrThread != null)
        {
            qrThread.Abort();
        }

        if(camTexture != null)
        {
            camTexture.Stop();
        }
   }
    #endregion

    /// <summary>
    ///程序退出
    /// </summary>
    void OnApplicationQuit()
   {
      isQuit = true;
   }

    /// <summary>
    /// 更新
    /// </summary>
   void Update()
   {
      // encode the last found
      //是否使用
      if(Isuse)
        { 
            //获取最后的url
          var textForEncoding = LastResult;

            //能够解码并且文本不为空
          if (shouldEncodeNow && textForEncoding != null)
          {
             //获取制作后的二维码
             var color32 = Encode(textForEncoding, encoded.width, encoded.height);
             //像素设置
             encoded.SetPixels32(color32);
             //应用
             encoded.Apply();
             //二维码图片赋值
             codeimage.GetComponent<RawImage>().texture = encoded;
             //不用再次解析
             shouldEncodeNow = false;
          }
        }
    }

   void DecodeQR()
   {
        // 创建一个自定义的读者源亮度
        var barcodeReader = new BarcodeReader {AutoRotate = false, TryHarder = false};

      while (true)
      {
         if (isQuit)
            break;
         try
         {
            // 解码当前帧
            var result = barcodeReader.Decode(c, W, H);
                //判断当前是否为空
            if (result != null)
            {
               //获取结果文本
               LastResult = result.Text;
               //能够显示
               shouldEncodeNow = true;
               //网址
               print(result.Text);
            }

            //睡眠一点和设置的信号获取下一帧
            Thread.Sleep(200);
            c = null;
         }
         catch
         {
         }
      }
   }

    /// <summary>
    /// 制作二维码
    /// </summary>
    /// <param name="textForEncoding"></param>
    /// <param name="width"></param>
    /// <param name="height"></param>
    /// <returns></returns>
   private static Color32[] Encode(string textForEncoding, int width, int height)
   {
      var writer = new BarcodeWriter
      {
         Format = BarcodeFormat.QR_CODE,
         Options = new QrCodeEncodingOptions
         {
            Height = height,
            Width = width
         }
      };
      return writer.Write(textForEncoding);
   }

    /// <summary>
    /// 改变最后的url
    /// </summary>
    /// <param name="str"></param>
    public void ChangeLastResult(string str)
    {
        //能够使用为true
        Isuse = true;
        //设置纹理
        encoded = new Texture2D(256, 256);
        //获取最后的url
        LastResult = str;
        //现在就能够解码
        shouldEncodeNow = true;

        //screenRect = new Rect(0, 0, Screen.width, Screen.height);

        //camTexture = new WebCamTexture();
        //camTexture.requestedHeight = Screen.height; // 480;
        //camTexture.requestedWidth = Screen.width; //640;
        //OnEnable();

        //开启线程
        qrThread = new Thread(DecodeQR);
        qrThread.Start();
    }
}

Zxing这个本来是用来扫描二维码的功能,然后对代码进行了一定的修改,去掉WebCamTexture 的功能,用来实现同ing过url来实现在线生成二维码的功能,下面看一下如何实现的演示吧。

 

第一步:

        创建一个Test的脚本,调用BarcodeCam类。

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

public class Test : MonoBehaviour
{

    public BarcodeCam barcode;

    public string url = "https://www.baidu.com/";

    void Start()
    {
        barcode.ChangeLastResult(url);
    }
}

第二步:

   生成一个Rawimage,为什么用Rawimage,这个是因为创建的二维码是texture2D,并不是sprite。

在Unity中创建二维码(Zxing)

第三步:

 相关的设置。

在Unity中创建二维码(Zxing)

然后运行就能够得到一个百度的二维码了。

在Unity中创建二维码(Zxing)

Demo下载:https://download.****.net/download/piplup/10980509