Unity实用功能之创建二维码(二)

787 阅读4分钟

这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战

概述

上一篇文章讲到使用ZXing创建二维码,那么本篇文章主要讲解下如何在不使用dll的情况下创建二维码。但是这种方法有一个坏处就是没有办法在离线状态下使用。

解决思路

本方法的大概思路就是通过访问二维码生成网站,调用网站的生成方法创建一个二维码,然后使用WWW或UnityWebRequest进行下载。通过上网查找,可以发现有好多的二维码生成网站,而在这写网站中,我只找到了一个网站的的API是开放的,可以直接更改网址中的内容进行二维码的生成。这个网站就是草料二维码

草料二维码API

API详解

首先让我们来看一下草料二维码的官方API,网址在这里,省得大家自己找了,具体路径是,首页的更多工具中,然后滑到最下方,有一个其他-二维码美化API

image.png

image.png

image.png

让我们来看一下API中的内容,进入界面很容易就能看看到一个URL https://cli.im/api/qrcode/code?text=二维码内容&mhid=美化模板id 上面有两个中文的的地方,写的很清楚一个是二维码内容,一个是美化模板id。可以看出来,我们只要把这两个地方改成我们自己内容就可以生成一个二维码。而且API界面也有一个官方实例。我尝试了一下将内容改了一下 https://cli.im/api/qrcode/code?text=https://juejin.cn/user/4143372312773549&mhid=sELPDFnok80gPHovKdI 显示的界面如下

image.png 我们按下F12可以看到,该网页的结构。其中二维码的图片地址也可以看到,我们复制一下图片地址,发现就是一张图片。这样我们就可以直接通过Unity获取此图片地址进行下载。

image.png 点击图片地址查看 image.png

获取二维码模板id

首先需要先登录账号,然后我们点击调整美化模板按钮

image.png 在弹出的窗口中,我们可以自己设计想要的二维码样式,设计完成后点击确定。 image.png 这时左侧的链接就会发生变化,我们可以看到mhid=后面的内容就是模板id,只需要将其复制然后在使用的时候替换即可

image.png

在Unity中实现

首先,我们在Unity中访问
https://cli.im/api/qrcode/code?text=https://juejin.cn/user/4143372312773549&mhid=sELPDFnok80gPHovKdI 查看是不是能够直接返回图片地址。untiy中分旧版和新版,使用的方法不同,旧版是WWW,新版为UnityWebRequest
注意:这里面的地址只需要将cli.im/api/qrcode/… 中的二维码内容更改为自己的内容即可,后面的美化模板id"sELPDFnok80gPHovKdI"需要按照上方的获取二维码模板id方法获取之后替换,也可以使用默认的黑色二维码,使用这个的话随便填或空的即可
旧版

private IEnumerator LoadWWW()
{
    WWW w = new WWW("https://cli.im/api/qrcode/code?text=https://juejin.cn/user/4143372312773549&mhid=sELPDFnok80gPHovKdI");
    yield return w;
    Debug.Log(w.text);
     }

新版

IEnumerator LoadQRCode()
{ 
    UnityWebRequest uwr = UnityWebRequest.Get("https://cli.im/api/qrcode/code?text=https://juejin.cn/user/4143372312773549&mhid=sELPDFnok80gPHovKdI");
    yield return uwr.SendWebRequest();
    Debug.Log(uwr.downloadHandler.text);
}

我们可以发现,获取到的是整个网页的内容,而非单纯的图片地址

image.png

通过上述图片我们可以看到很简单,body中有一个img标签,src代表图片地址,我们只要截取到地址,就可以获得我们的二维码了。 截取数据:

string str = uwr.downloadHandler.text;
//获取'src=" //' 后所有的数据
string s = str.Substring(str.IndexOf("<img src=") + 12, str.Length - (str.IndexOf("<img src=") + 12));
//截取src="" 内部的链接地址,不包括'//'
string result = s.Substring(0, s.IndexOf("\""));
Debug.Log(result);

image.png 我们复制截取到的连接在浏览器中打开,发现就是我们刚刚创建的二维码,接下来就直接下载二维码并将其显示在Unity中就可以了 旧版

    IEnumerator LoadImage(string url)
    {
        WWW www = new WWW(url);
        yield return www;
        Texture2D tex2d = www.texture;
        Sprite m_sprite = Sprite.Create(tex2d, new Rect(0, 0, tex2d.width, tex2d.height), new Vector2(0, 0));
        image.sprite = m_sprite;
        image.SetNativeSize();
    }

新版

    IEnumerator DownSprite(string url)
    {
        UnityWebRequest wr = new UnityWebRequest(url);
        DownloadHandlerTexture texD1 = new DownloadHandlerTexture(true);
        wr.downloadHandler = texD1;
        yield return wr.SendWebRequest();
        int width = 400;
        int high = 400;
        if (!wr.isNetworkError)
        {
            Texture2D tex = new Texture2D(width, high);
            tex = texD1.texture;
            Sprite sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f));
            image.sprite = sprite;
            image.SetNativeSize();
        }
    }

展示1.gif

总结

这种方法唯一的好处就是能够生成彩色的二维码,样式多,缺点就是没有办法离线使用。

写在最后

所有分享的内容均为作者在日常开发过程中使用过的各种小功能点,分享出来也变相的回顾一下,如有写的不好的地方还请多多指教。Demo源码会在之后整理好之后分享给大家。欢迎大家相互学习进步。下一篇文章将介绍在Unity中如何扫描识别二维码中的内容。