Unity发布WebGL如何把文件下载到本地——后续,详细实现。

本文介绍了如何在Unity WebGL中利用jslib调用浏览器下载功能,实现文件下载到本地。首先,编写ImageDownloader.jslib,通过JavaScript实现下载功能;然后,引入DLL并编写C#脚本,利用DllImport调用jslib,提供下载图片的接口。最终,通过按钮点击触发下载,成功下载图片到本地。示例代码详细,适合Unity开发者参考。

Unity发布WebGL如何把文件下载到本地——后续,详细实现。


前言

以前的问题https://blog.youkuaiyun.com/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文件夹下
在这里插入图片描述

二、引入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://blog.youkuaiyun.com/Wrinkle2017/article/details/117660124
————————————————————————————————

版权声明

版权声明:本博客为非营利性个人原创
所刊登的所有作品的著作权均为本人所拥有
本人保留所有法定权利,违者必究!
对于需要复制、转载、链接和传播博客文章或内容的
请及时和本博主进行联系
对于经本博主明确授权和许可使用文章及内容的
使用时请注明文章或内容出处并注明网址
转载请附上原文出处链接及本声明

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值