当前位置: 首页 > news >正文

【Unity3D日常开发】Unity3D中打包WEBGL后读取本地文件数据

推荐阅读

  • CSDN主页
  • GitHub开源地址
  • Unity3D插件分享
  • 简书地址
  • 我的个人博客
  • QQ群:1040082875

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

有粉丝问我,怎么在打包后WEBGL读取本地文件数据呢?

我一想,这不是很简单的嘛,直接刷刷几行代码的事:

using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;

public class LoadFile : MonoBehaviour
{
    void Start()
    {
        string path = Application.streamingAssetsPath + "/TextRead.txt";
        //文件流形式读取文档
        using (FileStream fs = File.OpenRead(path))
        {
            byte[] bytes = new byte[fs.Length];
            fs.Read(bytes, 0, bytes.Length);
            fs.Close();
            string str = Encoding.UTF8.GetString(bytes);
            Debug.Log(str);
        }
    }
}

在这里插入图片描述
在这里插入图片描述
运行后也没有问题:
在这里插入图片描述
然后打包WEBGL:
在这里插入图片描述
报错:无法找到路径,其实不是路径的问题,而是WEBGL不支持IO

在这里插入图片描述
接下来,就来说一下WEBGL读取本地文件的方法吧。

二、解决方案

2-1、使用Resources.Load加载文件

将要读取的文件放到Resources文件夹下:

在这里插入图片描述
代码:

using UnityEngine;

public class LoadFile : MonoBehaviour
{
    void Start()
    {
        TextAsset data = Resources.Load("TextRead") as TextAsset;
        Debug.Log(data);
    }
}

运行结果:
在这里插入图片描述
注意:这种方式只能读取文本文件,比如txt、XML、Json,特殊文本文件csv也可以读取。
Excel文件不支持。

2-2、使用UnityWebRequest加载文件

还有一种方案是使用UnityWebRequest去加载本地文件,代码参考如下:

using System.Collections;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;

public class LoadFile : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(ReadData());
    }

    IEnumerator ReadData()
    {
        string path = Path.Combine(Application.streamingAssetsPath, "TextRead.txt");
        Debug.Log(path);
        UnityWebRequest request = UnityWebRequest.Get(path);
        yield return request.SendWebRequest();
        if (request.isNetworkError || request.isHttpError)
        {
            Debug.Log(request.error);
        }
        else
        {
            Debug.Log(request.downloadHandler.text);
        }
    }
}

运行结果:
在这里插入图片描述
打包WEBGL后也运行正常:
在这里插入图片描述

三、后记

下面讨论一下如何加载更多格式的文件。

因为这种方式只能加载特定格式,比如txt、XML、Json,csv,那视频跟图片以及特殊格式该怎么加载呢?


3-1、加载图片资源

以图片jpg格式为例:

using System.Collections;
using System.IO;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Networking;
using UnityEngine.UI;

public class LoadFile : MonoBehaviour
{
    public Image img;
    void Start()
    {
        StartCoroutine(ReadTexture(LoadImg));
    }

    void LoadImg(Texture texture)
    {
        Sprite ImgSprite =Sprite.Create((Texture2D)texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
        img.sprite = ImgSprite;
    }

    IEnumerator ReadTexture(UnityAction<Texture> action)
    {
        string path= Path.Combine(Application.streamingAssetsPath, "1.jpg");
        Debug.Log(path);
        UnityWebRequest request = UnityWebRequestTexture.GetTexture(path);
        yield return request.SendWebRequest();
        if (request.isNetworkError || request.isHttpError)
        {
            Debug.Log(request.error);
        }
        else
        {
            byte[] imgdata = request.downloadHandler.data;

            action(DownloadHandlerTexture.GetContent(request));
        }
    }
}

在SteamingAssets文件中放一种图片:
在这里插入图片描述
新建一个Image:
在这里插入图片描述
将Image拖入卡槽中:
在这里插入图片描述
运行结果:

在这里插入图片描述

3-2、加载多媒体资源

其实代码都大同小异,参考如下:

using System.Collections;
using System.IO;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Networking;
using UnityEngine.UI;

public class LoadFile : MonoBehaviour
{
    public AudioSource AudioSource;

    void Start()
    {
        StartCoroutine(LoadMultimedia(LoadAuido));
    }

    //加载多媒体
    IEnumerator LoadMultimedia(UnityAction<AudioClip> action)
    {
        string path = Path.Combine(Application.streamingAssetsPath, "1.wav");
        Debug.Log(path);
        UnityWebRequest request = UnityWebRequestMultimedia.GetAudioClip(path,AudioType.WAV);
        yield return request.SendWebRequest();
        if (request.isNetworkError || request.isHttpError)
        {
            Debug.Log(request.error);
        }
        else
        {
            action(DownloadHandlerAudioClip.GetContent(request));
        }
    }

    void LoadAuido(AudioClip audioClip)
    {
        AudioSource.clip = audioClip;
        AudioSource.Play();
    }
}

运行结果:

在这里插入图片描述
可以听到声音,没有问题。

3-2、加载其他格式资源

没有办法。。。


你的点赞就是对博主的支持,有问题记得留言:

博主主页有联系方式。

博主还有跟多宝藏文章等待你的发掘哦:

专栏方向简介
Unity3D开发小游戏小游戏开发教程分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
Unity3D从入门到进阶入门从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
Unity3D之UGUIUGUIUnity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据文件读取使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合数据集合数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发虚拟仿真总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件插件主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发日常记录主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG日常记录记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。

相关文章:

  • 【SDS V6 专题】开放内容平台,XOCP 助力数据常青
  • 鲜花绿植学生网页设计模板 静态HTML鲜花学生网页作业成品 DIV CSS网上鲜花植物主题静态网页
  • 国庆在家没事干?教大家用Python做一个任何视频都能看的软件, 当然,只能看正经的
  • NumPy数据分析基础:NumPy特性以及Python内置数据结构对比详解
  • (附源码)ssm学生管理系统 毕业设计 141543
  • Java8的新特性
  • Oracle-RAC集群不同节点数据查询不一致
  • 【017】基于vue.js的网易云web端(实现播放、登录)(Node接口实现)
  • 界面控件DevExpress WPF即将发布Windows 11深色主题,期待吗?
  • 【JAVA程序设计】基于SSM(非maven)图书馆座位预约管理系统
  • 基于多尺度卷积神经网络特征融合的植株叶片检测技术
  • 我的大学期末网页作业 仿学校网站制作实现 HTML+CSS西北大学新闻网带psd带js
  • vue基于web的化妆品美妆商城电子商务python flask django
  • 2022.9.29
  • 说个好事!
  • 「译」Node.js Streams 基础
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • css属性的继承、初识值、计算值、当前值、应用值
  • Docker 笔记(2):Dockerfile
  • Elasticsearch 参考指南(升级前重新索引)
  • JavaScript新鲜事·第5期
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Linux CTF 逆向入门
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Python - 闭包Closure
  • 彻底搞懂浏览器Event-loop
  • 警报:线上事故之CountDownLatch的威力
  • 面试总结JavaScript篇
  • 你真的知道 == 和 equals 的区别吗?
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 设计模式 开闭原则
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 赢得Docker挑战最佳实践
  • ​flutter 代码混淆
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • # 安徽锐锋科技IDMS系统简介
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (0)Nginx 功能特性
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (二)丶RabbitMQ的六大核心
  • (二十四)Flask之flask-session组件
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (三)mysql_MYSQL(三)
  • (转)关于pipe()的详细解析
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .a文件和.so文件
  • .NET Core引入性能分析引导优化
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .Net Redis的秒杀Dome和异步执行
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)