这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战
概述
上一篇文章讲到使用ZXing创建二维码,那么本篇文章主要讲解下如何在不使用dll的情况下创建二维码。但是这种方法有一个坏处就是没有办法在离线状态下使用。
解决思路
本方法的大概思路就是通过访问二维码生成网站,调用网站的生成方法创建一个二维码,然后使用WWW或UnityWebRequest进行下载。通过上网查找,可以发现有好多的二维码生成网站,而在这写网站中,我只找到了一个网站的的API是开放的,可以直接更改网址中的内容进行二维码的生成。这个网站就是草料二维码
草料二维码API
API详解
首先让我们来看一下草料二维码的官方API,网址在这里,省得大家自己找了,具体路径是,首页的更多工具中,然后滑到最下方,有一个其他-二维码美化API
让我们来看一下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
显示的界面如下
我们按下F12可以看到,该网页的结构。其中二维码的图片地址也可以看到,我们复制一下图片地址,发现就是一张图片。这样我们就可以直接通过Unity获取此图片地址进行下载。
点击图片地址查看
获取二维码模板id
首先需要先登录账号,然后我们点击调整美化模板按钮
在弹出的窗口中,我们可以自己设计想要的二维码样式,设计完成后点击确定。
这时左侧的链接就会发生变化,我们可以看到
mhid=后面的内容就是模板id,只需要将其复制然后在使用的时候替换即可
在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);
}
我们可以发现,获取到的是整个网页的内容,而非单纯的图片地址
通过上述图片我们可以看到很简单,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);
我们复制截取到的连接在浏览器中打开,发现就是我们刚刚创建的二维码,接下来就直接下载二维码并将其显示在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();
}
}
总结
这种方法唯一的好处就是能够生成彩色的二维码,样式多,缺点就是没有办法离线使用。
写在最后
所有分享的内容均为作者在日常开发过程中使用过的各种小功能点,分享出来也变相的回顾一下,如有写的不好的地方还请多多指教。Demo源码会在之后整理好之后分享给大家。欢迎大家相互学习进步。下一篇文章将介绍在Unity中如何扫描识别二维码中的内容。