【Unity实战】WebGL读取本机硬盘上的文件

7 篇文章 0 订阅

由于浏览器的安全设置,System.IO的大部分功能都会受限。本文假设你要在Unity做一个头像上传的功能,这里我提供一个通过Unity和JavaScript实现的方法。

先在工程里起一个Plugins文件夹,用文本编辑器新建一个FileUploader.jslib。

var ImageUploaderPlugin = {
  ImageUploaderCaptureClick: function() {
    if (!document.getElementById('ImageUploaderInput')) {
      var fileInput = document.createElement('input');
      fileInput.setAttribute('type', 'file');
      fileInput.setAttribute('id', 'ImageUploaderInput');
      fileInput.style.visibility = 'hidden';
      fileInput.onclick = function (event) {
        this.value = null;
      };
      fileInput.onchange = function (event) {
        SendMessage('FileOpenDialog', 'OnFileSelected', URL.createObjectURL(event.target.files[0]));
      }
      document.body.appendChild(fileInput);
    }
    var OpenFileDialog = function() {
      document.getElementById('ImageUploaderInput').click();
      document.getElementById('canvas').removeEventListener('click', OpenFileDialog);
    };
    document.getElementById('canvas').addEventListener('click', OpenFileDialog, false);
  }
};
mergeInto(LibraryManager.library, ImageUploaderPlugin)

在工程里起一个WebGLTemplate文件夹,在里头再新建一个文件夹,名字随意,这里存放着WebGL打包用到的HTML模板。你可以先把Unity自带的先复制进去。

不管你最后基于哪个模板改,你都得在html里再加个JavaScript函数

function onFileSelected(event) {
      var file = event.target.files[0];
      var jsonObject = {
          Path: URL.createObjectURL(file),
          Filename: file.name
        };
      unityInstance.SendMessage('FileOpenDialog', 'OnFileSelected', JSON.stringify(jsonObject));
    }

    document.getElementById('upload').addEventListener('change', onFileSelected);

其中FileOpenDialog是GameObject名(这个就相当于Unity里GameObject.SendMessage),OnFileSelected顾名思义是回调,我们把本地中的文件以JSON形式发送给Unity,里头包含blob地址和文件名。

然后还得再加个隐藏的Input元素来接收选择的文件,例如:

<input id="upload" type="file" style="display:none" onchange="onFileSelected(event)">

这样,就可以在其他地方直接调用`OpenFileDialog`方法来打开文件选择对话框。

调用方式见如下:

// 通过JavaScript函数来触发文件选择对话框
        Application.ExternalEval(@"
            document.getElementById('upload').click();
        ");

回调以及文件内容的读取可以参考这个:

    // 在文件选择对话框中选择完成后的回调函数
    public void OnFileSelected(string info)
    {
        FileInfo result = JsonConvert.DeserializeObject<FileInfo>(info);
        Debug.Log("Selected File: " + result.Filename + ", path: " + result.Path);
        StartCoroutine(LoadData(result.Path));
    }

    IEnumerator LoadData(string url)
    {
        UnityWebRequest request = UnityWebRequest.Get(url);
        DownloadHandlerBuffer handler = new DownloadHandlerBuffer();
        request.downloadHandler = handler;
        yield return request.SendWebRequest();
        if (request.result != UnityWebRequest.Result.Success)
        {
            Debug.Log(request.error);
            yield break;
        }
        Debug.Log("File loaded! " + url);
        byte[] data = handler.data;
        // 根据需要进行处理 data 的操作
    }

    [Serializable]
    public class FileInfo
    {
        public string Path;
        public string Filename;
    }

拿到的blob地址一定要用UnityWebRequest去读并拿到二进制数据,切记!

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值