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

2023-11-08

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文件夹下
在这里插入图片描述

二、引入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.csdn.net/Wrinkle2017/article/details/117660124
————————————————————————————————

版权声明

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 您可以将原始 WebGL 纹理与 Three.js 一起使用吗

    我有一个相当复杂的架构 我在 Three JS 中完成大部分工作 但我也有一个特殊的渲染器 可以直接渲染到原始 WebGL 纹理 是否可以在 Three js 纹理 中使用此 WebGL 纹理 看起来 Three JS 纹理类只是图像 视频
  • SketchUp 导出带有纹理的 obj - 如何

    Windows 7 64 位 SketchUp Make 13 0 4812 Goal 将 SketchUp skp 模型转换为 obj并使用 Three js 加载到 WebGL Problem sketchup 将模型导出到 obj具有
  • 将 webGL html 转换为 SVG

    我正在使用 R 以及 Misc3d 和 rpanel 库 在 webGL 中创建 3D 图像 然后我需要通过 Latex 将图像嵌入到 PDF 中 3D 图像渲染良好并且看起来很棒 但我想我需要将 webGL HTML 文件转换为 SVG
  • 三个 js - 克隆着色器并更改统一值

    我正在努力创建一个着色器来生成带有阴影的地形 我的出发点是克隆兰伯特着色器并使用 ShaderMaterial 最终用我自己的脚本对其进行自定义 标准方法效果很好 var material new MeshLambertMaterial m
  • 如何编写基于网络的音乐可视化工具?

    我正在尝试找到构建音乐可视化工具以在网络浏览器中运行的最佳方法 Unity 是一个选项 但我需要构建一个自定义音频导入 分析插件来获取最终用户的声音输出 Quartz 可以满足我的需要 但只能在 Mac Safari 上运行 WebGL 似
  • 在 WebKit 上的 Mac OS 应用程序中启用 WebGL

    我正在为 Mac OS 编写一个应用程序 WebKit 上的浏览 器 用于 WebGL 上的某些网站 一切准备就绪 应用程序可以正确显示正常的 HTML 站点 但 WebGL 不起作用 如何在我的应用程序中启用 WebGL 一旦有了 Web
  • 在 WebGL 中与 HTML 背景混合

    我正在将平面颜色和纹理绘制到 WebGL 画布中 我的颜色和纹理具有不同的 alpha 值 我希望它们能够正确混合 我想要透明背景 它们应该与画布下的 HTML 内容混合 在 WebGL 中 我使用 gl clearColor 0 0 0
  • 如何添加标签/标签以显示在多个对象的顶部,以便当用户单击对象时标签始终面向相机?

    本质上 我想说的是 我想创建一个出现在对象顶部 表面上的标签或标签 以便当用户单击对象时 即使对象旋转 标签也始终面向相机 我该如何去做呢 我被告知要使用正交相机 但我不确定如何 和 CSS 作为标签 请参阅上一篇文章 如何使我的文本标签始
  • WebGL 中的 AlphaFunctions?

    是否可以实现透明度低于 0 5 的片段被丢弃 而 alpha 高于 0 5 的片段渲染为不透明的效果 从我读到的来看 glEnable GL ALPHA TEST glAlphaFunc GL GREATER 0 5 这将是我正在寻找的 但
  • OpenGL:多个顶点的单个顶点属性?

    我有一个接受以下属性的顶点着色器 a posCoord 顶点位置 a texCoord 纹理坐标 传递给片段着色器 a alpha 透明度因子 传递给片段着色器 我正在渲染的对象都是 广告牌 一对直角三角形组成一个矩形 我正在使用一次调用g
  • 如何快速将一个float打包为4个字节?

    我一直在寻找一种在 WebGL 纹理上存储浮动的方法 我找到了一些解决方案 http aras p info blog 2009 07 30 encoding floats to rgba the final 在互联网上 但那些只处理 0
  • 重复凹凸贴图

    我正在尝试使用 Three js r55 将凹凸贴图应用到平面上 以创建一个模糊的感觉表面 这是我的代码 var mapHeight THREE ImageUtils loadTexture images felt png mapHeigh
  • 在 Three.js 中渲染具有大量对象的多个场景的最佳方式

    想象一下 您想要绘制两个场景 每个场景都有数百个球体 并提供在这些场景之间切换的功能 做到这一点的最佳方法是什么 目前 一个开关大约需要 4 到 5 秒 因为我要删除 创建和绘制每个开关上的所有球体 下面是在场景切换上运行的代码示例 cle
  • 开始使用 Three.js 中的行进立方体

    我是 Three js 的新手 正在寻找教程来帮助我开始了解如何在 Three js 中使用 Marching Cubes 到目前为止 我在 Three js 中看到的一些使用它的项目对我来说有点复杂 所以一个简单的教程会很好 谢谢 像您一
  • 如何清除WebGL中的矩形区域?

    WebGL 有一个clear清除整个表面的方法 清除表面的特定矩形的最佳方法是什么 例如 我想将一个从 50 50 开始的 100x100 像素框设置为全零 ARGB 0 0 0 0 我现在能想到的就是用一个写入零的片段着色器绘制一个四边形
  • 我可以在 WebGL 的 GLSL 中使用什么作为数组索引?

    是否只允许使用常量 或者我可以将其用于循环索引或任何其他动态值 In WebGL GLES2 是的 只允许使用常量 但是 如果您的代码可以展开 无论是由您自己还是由编译器 那么它就被视为一个常量 并且您有一个解决方法 例如 问题 unifo
  • OpenGL ES 中的高效绘图方法

    在我的应用程序中 我通过 OpenGL ES Api 绘制了很多立方体 所有立方体的尺寸相同 只是它们位于空间坐标不同 我可以想到两种绘制它们的方法 但我不确定哪一种是最有效的 我不是OpenGL专家 所以我决定在这里问 方法1 这就是我现
  • Three.js WebGL 从着色器绘制圆形自定义填充和边框颜色

    我将 Three js 与 WebGLRenderer 一起使用 我试图找出或查看如何使用 CircleGeometry 绘制圆圈的示例 并能够从顶点或片段着色器控制其填充和边框颜色 如果不使用图像作为纹理 这是否可能 抱歉 如果这真的很简
  • glClipPlane - webGL 中有等效的吗?

    我有一个 3D 网格 是否有可能像这样呈现剖面图 剪辑 glClipPlane在OpenGL中 我正在使用 Three js r65 我添加的最新着色器是 片段着色器 uniform float time uniform vec2 reso
  • 在 IOS 10 beta 7 (Safari) 中使用 webGL 渲染视频 - 显示奇怪的紫色

    我正在 webGL 中渲染视频 通过传递Video对象作为源texImage2D 这在所有平台 支持 webGL 中都很好用 但是在 IOS 10 beta 7 的 Safari 中 它以奇怪的颜色渲染 在以前的 IOS 版本中看起来还不错

随机推荐

  • 关于kafka——幂等性

    怎么保证幂等性 幂等性 通俗点说 就一个数据 或者一个请求 给你重复来多次 你得确保对应的数据是不会改变的 不能出错 从业务层面考虑 比如你拿个数据要写库 你先根据主键查一下 如果这数据都有了 你就别插入了 update 一下好吧 比如你是
  • 服务器系统盘预留空间,固态硬盘的系统盘需要预留多空间?固态硬盘适不适合分区...

    固态硬盘的对于电脑的提速显而易见 再加少价格降成了萝卜价 所以固态硬盘成为绝大多数人的标配 对于固态硬盘的使用人们也是众说一词 有的人认为固态硬盘不宜多分区 会影响速度 有的人认为固态硬盘和机械硬盘的使用一样 没什么区别 关于这条 我们额外
  • vue 全局过滤器 时间格式 转换

    vue 项目要求将时间戳转成规定的时间格式 可以借助 moment js 完成 现要确定自己的数据是时间戳 安装命令 npm install moment save main js import moment from moment 设置过
  • Oracle日期格式yyyymmdd格式化为yyyy-mm-dd

    问题 日期展示为20200828需要展示为2020 08 28 解决 select TO CHAR TO DATE 20200828 yyyyMMdd YYYY MM DD FKDAT from dual 结果展示 2020 08 28
  • Docker安装Nginx+FTP访问静态资源

    1 拉取Nginx镜像 docker pull nginx latest 2 创建挂载目录 mkdir p server nginx conf mkdir p server nginx log mkdir p server nginx ht
  • 安装Ubuntu的注意事项

    安装win10 Ubuntu elemengtory OS直接进入win10而不出现linnux引导的问题 1 进入BIOS 启动UEFI 关闭Security 2 分区时应该注意的事项 1 swap 2000MB 主分区引导 起始 2 E
  • Pandas 缺失号

    三种缺失符号及其对比 pandas 1 0之前 三种记号 pandas 1 0 np nan None np NaT 时间序列用 类型 float64 Nonetype pandas libs tslibs nattype NaTType
  • mybatis 拼接动态表名、字段名

    转载地址 https blog csdn net xiaoxiangzi520 article details 76719098 今天在项目中遇到个需求是要动态的根据前台传入的字段名称和升降序条件在mybatis里动态拼接sql语句进行查询
  • Java类成员变量的默认值

    1 布尔型 boolean 变量默认值为false byte short int long为0 字符型为 u0000 空字符 浮点型 float double 为0 0 引用类型 String 为null package cn nxl201
  • shell算数运算

    i j k 等价于 i expr j k i j k 等价于 i expr j k i j k 等价于 i expr j k i j k 等价于 i expr j k Let expressions 执行一个或多个表达式 表达式中的变量前不
  • 量化投资学习-15:散户与庄家共赢策略之价值长线策略

    散户的尴尬 在前面的文章 量化投资学习 13 一张图残酷的展现了庄家 量化交易者 散户的盈利空间的对比 中分析过 如果散户追求短期利益 采用短期炒作的操作策略 实际的利润空间非常狭小 只能是尾部或头部空间 稍不留神 就会导致亏损 化解尴尬的
  • 微信小程序接入微信支付(四):接收支付结果通知与沙箱测试

    代码主体写完后 还有不可或缺的部分需要补充完整 即接收支付结果通知 官方文档 https pay weixin qq com wiki doc api wxa wxa api php chapter 9 7 index 8 目录 微信小程序
  • 线程的基本概念,线程的同步互斥机制

    一 线程的概念 1 1 什么是线程 线程 线程是进程的一个实体 是被系统独立调度和分派的基本单位 是一个进程并发执行多个任务的机制 并发 单核CPU多任务同时运行 CPU以ms级进行进程调度 1 2 为什么引入线程 进程间的切换表现为上下文
  • 计算机设备显示感叹号,设备管理器有感叹号和问号未知设备的解决方法

    设备管理器有感叹号和问号未知设备怎么办 因为在Windows操作系统中 设备管理器是管理计算机硬件设备的工具 我们可以借助设备管理器查看计算机中所安装的硬件设备 设置设备属性 安装或更新驱动程序 停用或卸载设备 可以说是功能非常强大 但有时
  • VC 如何使程序运行后自己删除自己

    VC 如何使程序运行后自己删除自己 有时候 我们需要创建一个运行后能够自己删除自己的可执行程序即自删除程序 很明显如果一个进程通过直接调用DeleteFile 来删除自己是不可能的 必须另想办法 经过本人在网上参考很多资料后实际测试并集众家
  • Onnxruntime-CUDA版本对应

    ONNX Runtime CUDA cuDNN 1 14 1 13 1 1 13 11 6 8 2 4 Linux 8 5 0 96 Windows 1 12 1 11 11 4 8 2 4 Linux 8 2 2 26 Windows 1
  • Flink源码-SlidingProcessTimeWindow的创建和触发

    今天研究了下SlidingProcessTimeWindow的源码 把TimeWindow的生成和触发计算 大致搞清楚了 写一篇博客记录下 要点 这里讲的是ProcessTime的滑动窗口 每条数据都会触发窗口的分配 创建 一条数据可能分配
  • 基于鲸鱼算法优化支持向量机SVM的分类预测,基于WOA-SVM的光谱分类

    目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 鲸鱼算法的原理及步骤 SVM应用实例 基于鲸鱼算法改进SVM的光谱分类 代码 结果分析 展望 支持向量机SVM的详细原理 SVM的定义 支持向量机 support vector m
  • 【qt】error: C2248: “QVariant::QVariant”: 无法访问 private 成员(在“QVari

    错误信息 main A a new A engine rootContext gt setContextProperty a a C2248 QVariant QVariant 无法访问 private 成员 在 QVariant 类中声明
  • Unity发布WebGL如何把文件下载到本地——后续,详细实现。

    Unity发布WebGL如何把文件下载到本地 后续 详细实现 前言 一 编写jslib 二 引入dll 编写C 脚本 三 最终效果 总结 版权声明 前言 以前的问题https blog csdn net Wrinkle2017 articl