Unity发布WebGL如何把文件下载到本地——后续,详细实现。
前言
以前的问题https://blog.csdn.net/Wrinkle2017/article/details/109257197
这是之前的一篇博客,只是说了自己的大概思路,没有附上详细的实现步骤及代码,现在有时间了,就继续记录一下吧,以下载图片为例。
环境:unity2019.4
一、编写jslib
上一篇也说了,unity本身不支持webgl下载,于是我就有了个想法,通过jslib来调用浏览器的下载,话不多说,下面上代码: ImageDownloader.jslib
//调用浏览器的下载
var ImageDownloaderPlugin = {
ImageDownloader: function (str, fn) {
console.log("start jslib download");
var msg = Pointer_stringify(str);
var fname = Pointer_stringify(fn);
var contentType = 'image/jpeg';
function fixBinary(bin) {
var length = bin.length;
var buf = new ArrayBuffer(length);
var arr = new Uint8Array(buf);
for (var i = 0; i < length; i++) {
arr[i] = bin.charCodeAt(i);
}
return buf;
}
//atob解码使用base64编码的字符串
var binary = fixBinary(atob(msg));
var data = new Blob([binary], { type: contentType });
//创建一个html dom用于触发blob下载
var link = document.createElement('a');
link.download = fname;
link.innerHTML = 'DownloadFile';
link.setAttribute('id', 'ImageDownloaderLink');
link.href = window.URL.createObjectURL(data);
link.onclick = function () {
var child = document.getElementById('ImageDownloaderLink');
child.parentNode.removeChild(child);
};
link.style.display = 'none';
document.body.appendChild(link);
link.click();
window.URL.revokeObjectURL(link.href);
}
};
//并入Unity中,官方写法。
mergeInto(LibraryManager.library, ImageDownloaderPlugin)
这个文件要放到unity 的Plugins文件夹下
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210607153020287.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1dyaW5rbGUyMDE3,size_16,color_FFFFFF,t_70)
二、引入dll,编写C#脚本
直接上代码
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.UI;
public class DownLoadPic : MonoBehaviour
{
/// <summary>
/// 要下载的图片,格式为jpg
/// </summary>
public Sprite picture;
/// <summary>
/// 下载按钮
/// </summary>
public Button buttonDownLoad;
[DllImport("__Internal")]
private static extern void ImageDownloader(string str, string fn);
/// <summary>
/// 下载png图片
/// </summary>
/// <param name="imageData">字节流</param>
/// <param name="imageFileName"></param>
public void DownloadImage(byte[] imageData, string imageFileName)
{
if (imageData != null)
{
Debug.Log("Downloading..." + imageFileName);
ImageDownloader(System.Convert.ToBase64String(imageData), imageFileName);
}
}
private void Start()
{
buttonDownLoad.onClick.AddListener(OnButtonClick);
}
private void OnButtonClick()
{
byte[] photoByte = getImageSprite(); //获取jpeg图像的字节流
if (photoByte != null)
{
DownloadImage(photoByte, picture.name + ".jpg");
}
else
{
Debug.LogError("没成功啊!!");
}
}
private byte[] getImageSprite()
{
if (picture)
{
return picture.texture.EncodeToJPG();
}
return null;
}
}
注释也比较详细,可以自己看下,需要手动拖入按钮和sprite
注意:图片格式为jpg,并且要设置成可读写
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210607153400316.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1dyaW5rbGUyMDE3,size_16,color_FFFFFF,t_70)
三、最终效果
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210607153449526.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1dyaW5rbGUyMDE3,size_16,color_FFFFFF,t_70#pic_center)
左下角已经下载下来图片了
总结
下载其他类型可以根据这个思路自行更改。
就先讲到这里吧,好记性不如烂笔头,如果有问题可以随时联系我。
欢迎大佬多多来给萌新指正,欢迎大家来共同探讨。
如果各位看官觉得文章有点点帮助,跪求各位给点个“一键三连”,谢啦~
声明一下:本博文章若非特殊注明皆为原创,若需转载请保留原文链接
https://blog.csdn.net/Wrinkle2017/article/details/117660124
————————————————————————————————
版权声明
版权声明:本博客为非营利性个人原创
所刊登的所有作品的著作权均为本人所拥有
本人保留所有法定权利,违者必究!
对于需要复制、转载、链接和传播博客文章或内容的
请及时和本博主进行联系
对于经本博主明确授权和许可使用文章及内容的
使用时请注明文章或内容出处并注明网址
转载请附上原文出处链接及本声明