|
问题需求
今天碰到一个需求,发布webgl的工程需要把生成的数据图片下载到本地,资料也查了一些,webgl不支持I/O,所有我在内存中拿到了数据流,发现写不到本地,最后确定了一个方案,也实现了,思路大概是这样的:
需要写个jslib脚本,来实现调取电脑浏览器的下载,把这个脚本作为unity的Plugins,需要下载文件时,用unity去调取浏览器的下载,不知道这个方案算不算是另辟蹊径的。。。。。
<hr/>一、编写jslib
上一篇也说了,unity本身不支持webgl下载,于是我就有了个想法,通过jslib来调用浏览器的下载,话不多说,下面上代码:
ImageDownloader.jslib
//调用浏览器的下载
var ImageDownloaderPlugin = {
ImageDownloader: function (str, fn) {
console.log(&#34;start jslib download&#34;);
var msg = Pointer_stringify(str);
var fname = Pointer_stringify(fn);
var contentType = &#39;image/jpeg&#39;;
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 = 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(&#39;a&#39;);
link.download = fname;
link.innerHTML = &#39;DownloadFile&#39;;
link.setAttribute(&#39;id&#39;, &#39;ImageDownloaderLink&#39;);
link.href = window.URL.createObjectURL(data);
link.onclick = function () {
var child = document.getElementById(&#39;ImageDownloaderLink&#39;);
child.parentNode.removeChild(child);
};
link.style.display = &#39;none&#39;;
document.body.appendChild(link);
link.click();
window.URL.revokeObjectURL(link.href);
}
};
//并入Unity中,官方写法。
mergeInto(LibraryManager.library, ImageDownloaderPlugin)这个文件要放到unity 的Plugins文件夹下
<hr/>二、引入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(&#34;__Internal&#34;)]
private static extern void ImageDownloader(string str, string fn);
/// <summary>
/// 下载png图片
/// </summary>
/// <param name=&#34;imageData&#34;>字节流</param>
/// <param name=&#34;imageFileName&#34;></param>
public void DownloadImage(byte[] imageData, string imageFileName)
{
if (imageData != null)
{
Debug.Log(&#34;Downloading...&#34; + 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, Chevereto image hosting + &#34;.jpg&#34;);
}
else
{
Debug.LogError(&#34;没成功啊!!&#34;);
}
}
private byte[] getImageSprite()
{
if (picture)
{
return picture.texture.EncodeToJPG();
}
return null;
}
}注释也比较详细,可以自己看下,需要手动拖入按钮和sprite
注意:图片格式为jpg,并且要设置成可读写
<hr/>三、最终效果
左下角已经下载下来图片了
<hr/>总结
下载其他类型可以根据这个思路自行更改。
就先讲到这里吧,好记性不如烂笔头,如果有问题可以随时联系我。
欢迎大佬多多来给萌新指正,欢迎大家来共同探讨。
**如果各位看官觉得文章有点点帮助,跪求各位给点个“一键三连”,谢啦~**
版权声明
版权声明:
所刊登的所有作品的著作权均为本人所拥有
本人保留所有法定权利,违者必究!
对于需要复制、转载、链接和传播博客文章或内容的
请及时和本人进行联系
对于经本人明确授权和许可使用文章及内容的
使用时请注明文章或内容出处并注明网址
转载请附上原文出处链接及本声明 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|