内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

Unity實(shí)現(xiàn)多平臺(tái)二維碼掃描的方法

小編給大家分享一下Unity實(shí)現(xiàn)多平臺(tái)二維碼掃描的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比仁和網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式仁和網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋仁和地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴。

在unity里做掃二維碼的功能,雖然有插件,但是移動(dòng)端UI一般不能自定義,所以后來(lái)自已做了一個(gè),直接在c#層掃描解析,UI上就可以自己發(fā)揮了。

上代碼:

這個(gè)是調(diào)用zxing的腳本。

using UnityEngine;
using System.Collections;
using ZXing;
using ZXing.QrCode;
 
public class QR {
  /// <summary>
  /// 解析二維碼
  /// </summary>
  /// <param name="tex"></param>
  /// <returns></returns>
  public static string Decode(Texture2D tex) {
    return DecodeColData(tex.GetPixels32(), tex.width, tex.height); //通過(guò)reader解碼 
  }
  public static string DecodeColData(Color32[] data, int w, int h) {
    BarcodeReader reader = new BarcodeReader();
    Result result = reader.Decode(data, w, h); //通過(guò)reader解碼 
    //GC.Collect();
    if (result == null)
      return "";
    else {
      return result.Text;
    }
  }
  /// <summary>
  /// 生成二維碼
  /// </summary>
  /// <param name="content"></param>
  /// <param name="len"></param>
  /// <returns></returns>
  public static Texture2D GetQRTexture(string content, int len = 256) {
    var bw = new BarcodeWriter();
    bw.Format = BarcodeFormat.QR_CODE;
    bw.Options = new ZXing.Common.EncodingOptions() {
      Height = len,
      Width = len
    };
    var cols = bw.Write(content);
    Texture2D t = new Texture2D(len, len);
    t.SetPixels32(cols);
    t.Apply();
    return t;
  }
}

然后是封裝:

using UnityEngine;
using System.Collections;
using System;
using UnityEngine.UI;
using System.Timers;
/// <summary>
/// 二維碼解析工具
/// 關(guān)鍵函數(shù):
///   public static QRHelper GetInst()                   --得到單例
///   public event Action<string> OnQRScanned;               --掃描回調(diào)
///   public void StartCamera(int index)                  --啟動(dòng)攝像頭
///   public void StopCamera()                       --停止攝像頭
///   public void SetToUI(RawImage raw,int UILayoutW,int UILayoutH)     --把攝像機(jī)畫(huà)面設(shè)置到一個(gè)rawimage上并使它全屏顯示
/// </summary>
public class QRHelper {
 
  public event Action<string> OnQRScanned;
 
  private static QRHelper _inst;
  public static QRHelper GetInst() {
    if (_inst == null) {
      _inst = new QRHelper();
    }
    return _inst;
  }
  private int reqW = 640;
  private int reqH = 480;
  private WebCamTexture webcam;
 
  Timer timer_in, timer_out;
  /// <summary>
  /// 啟動(dòng)攝像頭
  /// </summary>
  /// <param name="index">手機(jī)后置為0,前置為1</param>
  public void StartCamera(int index) {
    StopCamera();
    lock (mutex) {
      buffer = null;
      tbuffer = null;
    }
    var dev = WebCamTexture.devices;
    webcam = new WebCamTexture(dev[index].name);
    webcam.requestedWidth = reqW;
    webcam.requestedHeight = reqH;
    webcam.Play();
    stopAnalysis = false;
 
    InitTimer();
    timer_in.Start();
    timer_out.Start();
  }
  /// <summary>
  /// 停止
  /// </summary>
  public void StopCamera() {
    if (webcam!=null) {
      webcam.Stop();
      UnityEngine.Object.Destroy(webcam);
      Resources.UnloadUnusedAssets();
      webcam = null;
      stopAnalysis = true;
 
      timer_in.Stop();
      timer_out.Start();
      timer_in = null;
      timer_out = null;
    }
  }
  /// <summary>
  /// 把攝像機(jī)畫(huà)面設(shè)置到一個(gè)rawimage上并使它全屏顯示
  /// </summary>
  /// <param name="raw">rawimage</param>
  /// <param name="UILayoutW">UI布局時(shí)的寬度</param>
  /// <param name="UILayoutH">UI布局時(shí)的高度</param>
  public void SetToUI(RawImage raw,int UILayoutW,int UILayoutH){
    raw.GetComponent<RectTransform>().sizeDelta = GetWH(UILayoutW,UILayoutH);
    int d = -1;
    if (webcam.videoVerticallyMirrored) {
      d = 1;
    }
    raw.GetComponent<RectTransform>().localRotation *= Quaternion.AngleAxis(webcam.videoRotationAngle, Vector3.back);
    float scaleY = webcam.videoVerticallyMirrored ? -1.0f : 1.0f;
    raw.transform.localScale = new Vector3(1, scaleY * 1, 0.0f);
    raw.texture = webcam;
    raw.color = Color.white;
  }
  //在考慮可能旋轉(zhuǎn)的情況下計(jì)算UI的寬高
  private Vector2 GetWH(int UILayoutW, int UILayoutH) {
    int Angle = webcam.videoRotationAngle;
    Vector2 init = new Vector2(reqW, reqH);
    if ( Angle == 90 || Angle == 270 ) {
      var tar = init.ScaleToContain(new Vector2(UILayoutH,UILayoutW));
      return tar;
    }
    else {
      var tar = init.ScaleToContain(new Vector2(UILayoutW, UILayoutH));
      return tar;
    }
  }
  private void InitTimer() {
    timer_in = new Timer(500);
    timer_in.AutoReset = true;
    timer_in.Elapsed += (a,b) => {
      ThreadWrapper.Invoke(WriteDataBuffer);
    };
    timer_out = new Timer(900);
    timer_out.AutoReset = true;
    timer_out.Elapsed += (a,b)=>{
      Analysis();
    };
  }
  private Color32[] buffer = null;
  private Color32[] tbuffer = null;
  private object mutex = new object();
  private bool stopAnalysis = false;
 
  int dw, dh;
  private void WriteDataBuffer() {
    lock (mutex) {
      if (buffer == null && webcam!=null) {
        buffer = webcam.GetPixels32();
        dw = webcam.width;
        dh = webcam.height;
      }
    }
  }
  //解析二維碼
  private void Analysis() {
    if (!stopAnalysis) {
      lock (mutex) {
        tbuffer = buffer;
        buffer = null;
      }
      if (tbuffer == null) {
        ;
      }
      else {
        string str = QR.DecodeColData(tbuffer, dw, dh);
        tbuffer = null;
        if (!str.IsNullOrEmpty() && OnQRScanned != null) {
          ThreadWrapper.Invoke(() => {
            if (OnQRScanned!=null)
              OnQRScanned(str);
          });
        }
      }
    }
    tbuffer = null;
  }
}

調(diào)用方式如下,用了pureMVC,可能理解起來(lái)有點(diǎn)亂,也不能直接用于你的工程,主要看OnRegister和OnRemove里是怎么啟動(dòng)和停止的,以及RegQRCB、RemoveQRCB、OnQRSCcanned如何注冊(cè)、移除以及響應(yīng)掃描到二維碼的事件的。在onregister中,由于ios上畫(huà)面有鏡象,所以把rawimage的scale的y置為了-1以消除鏡像:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using PureMVC.Patterns;
using PureMVC.Interfaces;
/// <summary>
/// 掃描二維碼界面邏輯
/// </summary>
public class ScanQRMediator : Mediator {
 
  AudioProxy audio;
 public QRView TarView {
    get {
      return base.ViewComponent as QRView;
    }
  }
  public ScanQRMediator()
    : base("ScanQRMediator") {
  }
  string NextView = "";
  bool isInitOver = false;
  int cameraDelay = 1;
  public override void OnRegister() {
    base.OnRegister();
 
    if (Application.platform == RuntimePlatform.IPhonePlayer) {
      cameraDelay = 5;
    }
    else {
      cameraDelay = 15;
    }
 
    audio = AppFacade.Inst.RetrieveProxy<AudioProxy>("AudioProxy");
 
    TarView.BtnBack.onClick.AddListener(BtnEscClick);
    
    QRHelper.GetInst().StartCamera(0);
    TarView.WebcamContent.rectTransform.localEulerAngles = Vector3.zero;
    CoroutineWrapper.EXEF(cameraDelay, () => {
      RegQRCB();
      QRHelper.GetInst().SetToUI(TarView.WebcamContent, 1536, 2048);
      if (Application.platform == RuntimePlatform.IPhonePlayer) {
        TarView.WebcamContent.rectTransform.localScale = new Vector3(1, -1, 0);
      }
      isInitOver = true;
    });
    UmengStatistics.PV(TarView);
    //暫停背景音樂(lè)
    audio.SetBGActive(false);
  }
 
  public override void OnRemove() {
    base.OnRemove();
    TarView.BtnBack.onClick.RemoveListener(BtnEscClick);
    if (NextView != "UnlockView") {
      audio.SetBGActive(true);
    }
    NextView = "";
    isInitOver = false;
  }
  bool isEsc = false;
  void BtnEscClick() {
    if (isEsc || !isInitOver) {
      return;
    }
    isEsc = true;
 
    TarView.WebcamContent.texture = null;
    TarView.WebcamContent.color = Color.black;
    RemoveQRCB();
    QRHelper.GetInst().StopCamera();
 
    CoroutineWrapper.EXEF(cameraDelay, () => {
      isEsc = false;
      if (Application.platform == RuntimePlatform.IPhonePlayer) {
        ToUserInfoView();
      }
      else {
        string origin = TarView.LastArg.SGet<string>("origin");
        if (origin == "ARView") {
          ToARView();
        }
        else if (origin == "UserInfoView") {
          ToUserInfoView();
        }
        else {
          ToARView();
        }
      }
    });
  }
  void ToARView() {
    AppFacade.Inst.RemoveMediator(this.MediatorName);
    ViewMgr.GetInst().ShowView(TarView, "ARView", null);
  }
  void ToUserInfoView() {
    AppFacade.Inst.RemoveMediator(this.MediatorName);
    ViewMgr.GetInst().ShowView(TarView, "UserInfoView", null);
    var v = ViewMgr.GetInst().PeekTop();
    var vc = new UserInfoMediator();
    vc.ViewComponent = v;
    AppFacade.Inst.RegisterMediator(vc);
  }
  int reg = 0;
  void RegQRCB() {
    if (reg == 0) {
      QRHelper.GetInst().OnQRScanned += OnQRScanned;
      reg = 1;
    }
  }
  void RemoveQRCB() {
    if (reg == 1) {
      QRHelper.GetInst().OnQRScanned -= OnQRScanned;
      reg = 0;
    }
  }
  bool isQRJump = false;
  void OnQRScanned(string qrStr) {
    if (isQRJump) {
      return;
    }
    isQRJump = true;
 
    TarView.WebcamContent.texture = null;
    TarView.WebcamContent.color = Color.black;
    RemoveQRCB();
    QRHelper.GetInst().StopCamera();
    NextView = "UnlockView";
    CoroutineWrapper.EXEF(cameraDelay, () => {
      isQRJump = false;
      AppFacade.Inst.RemoveMediator(this.MediatorName);
      audio.PlayScanedEffect();
#if YX_DEBUG
      Debug.Log("qr is :"+qrStr);
      Toast.ShowText(qrStr,1.5f);
#endif
      ViewMgr.GetInst().ShowView(TarView, "UnlockView", HashtableEX.Construct("QRCode", qrStr, "origin", TarView.LastArg.SGet<string>("origin")));
      var v = ViewMgr.GetInst().PeekTop();
      var vc = new UnlockMediator();
      vc.ViewComponent = v;
      AppFacade.Inst.RegisterMediator(vc);
    });
  }
}

最后,放上zxing.unity.dll,放在plugins里就可以了。

以上是“Unity實(shí)現(xiàn)多平臺(tái)二維碼掃描的方法”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

當(dāng)前標(biāo)題:Unity實(shí)現(xiàn)多平臺(tái)二維碼掃描的方法
標(biāo)題URL:http://m.rwnh.cn/article40/jipcho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、品牌網(wǎng)站設(shè)計(jì)、App開(kāi)發(fā)、企業(yè)網(wǎng)站制作、網(wǎng)站內(nèi)鏈用戶體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
肇源县| 乐陵市| 满城县| 江津市| 明水县| 太和县| 阳泉市| 阳山县| 延边| 岳阳县| 宜君县| 平陆县| 玛曲县| 邹城市| 汤阴县| 定襄县| 遂平县| 武邑县| 平远县| 宁阳县| 盐边县| 滁州市| 松滋市| 邵阳县| 西乌珠穆沁旗| 古交市| 高雄县| 合水县| 开远市| 张北县| 牙克石市| 田阳县| 桐庐县| 承德市| 临邑县| 东乌| 镇宁| 乃东县| 建水县| 威宁| 汽车|