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


    推荐阅读

    大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新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);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述
    在这里插入图片描述
    运行后也没有问题:
    在这里插入图片描述
    然后打包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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    运行结果:
    在这里插入图片描述
    注意:这种方式只能读取文本文件,比如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);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    运行结果:
    在这里插入图片描述
    打包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));
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    在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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    运行结果:

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

    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和坑,让后来人可以有些参考。
  • 相关阅读:
    Python学习笔记 - 面向对象编程
    枚举(enum)/共用体(union)/结构体(struct)---详解
    基础数学知识
    JVM 引用的分类
    程序员级别分析,看看你是哪个级别
    Android 13.0 Launcher3定制之双层改单层(去掉抽屉式二)
    Unity的UI管理器
    Kafka Stream 学习笔记-5 process api
    Linux防火墙之firewalld
    在有序数组中插入一个数
  • 原文地址:https://blog.csdn.net/q764424567/article/details/127125078