Unity打包WebGL平台导出GLB模型到本地

由于WebGL的平台没有文件系统,所以想要通过Windows平台的流操作将文件保存到本地是行不通的。经过查找相关的解决方案,找到了一个可行的方法,现进行记录。

 本文参考了这位大佬的文章:Unity发布WebGL平台导出文件到本地_chunyu90225的博客-CSDN博客

大致思路:

1.在C#中将要保存到本地的数据写入到内存流中,通过内存流将相关的数据转化为字节数组;

2.编写jslib代码,将代码放进Unity中,jslib代码主要作用是提供web端将文件下载到本地的功能;

3.在C#代码中引入这个jslib库,调用相关的接口,将字节数组转化为base64的字符串传递给jslib;

4.打包WebGL,运行之后就可以自动将文件下载到本地磁盘;

本文用到的GLB导出插件为:UnityGLTF

插件的具体使用本文不做详细的记录,需要的小伙伴可以点击这里,在官方的github库里下载,注意下载的时候要从dev分支里面下载,主分支很久没有维护了,代码相对比较老。

详细步骤:

1.将要保存的文件写入到内存流中,然后转化为字节数组。我这里使用的是UnityGLTF插件,插件提供了相关的接口,可以将GLB文件写入到内存流中,并返回相应的字节数组。如果是其他文件的话,需要自己写相关代码。

2.编写jslib代码

在Unity的Assets文件夹下创建plugins文件夹

在plugins文件夹里新建文件,后缀名改为.jslib,并添加以下代码:

mergeInto(LibraryManager.library, {
  Download: function (str, fn) {        
        var msg = UTF8ToString(str);
        var fname = UTF8ToString(fn);
        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;
        }
        var binary = fixBinary(atob(msg));
        var data = new Blob([binary]); 
        var link = document.createElement('a');
        link.download = fname;
        link.href = URL.createObjectURL(data);
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
    }
});

3.在C#代码中引入jslib

using System;
using System.Runtime.InteropServices;
using UnityEngine;
using UnityGLTF;

public class TestExportScript : MonoBehaviour
{
    public Transform goTrans;
    private byte[] by;

    [DllImport("__Internal")]
    private static extern void Download(string base64str, string fileName);

    void Start()
    {
        Export(new Transform[] { goTrans }, goTrans.name);   //导出GLB模型
        string base64str = Convert.ToBase64String(by);    //将字节数组转化为base64字符串
        Download(base64str, "Cube.glb");    //调用下载接口将字符串以“Cube.glb”的名字保存到本地
    }
    
    //通过UnityGLTF插件来导出GLB模型
    private void Export(Transform[] transforms,string sceneName)
    {
        var exportOptions = new ExportOptions { };    //导出前的设置,该类存在于UnityGLTF插件
        var exporter = new GLTFSceneExporter(transforms, exportOptions);    //实例化GLB模型的导出器,传递将要导出的游戏对象,该类同样存在于UnityGLTF插件
        by = exporter.SaveGLBToByteArray(sceneName);    //调用相关的方法得到GLB模型的字节数组
    }

}

4.完成以上步骤之后,将场景进行打包,打包的时候选择BulidAndRun,Unity会在启动一个本地的服务器来运行打包之后的场景。

猜你喜欢

转载自blog.csdn.net/m0_68256659/article/details/125672006
今日推荐