推荐阅读
大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新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读取本地文件的方法吧。
将要读取的文件放到Resources文件夹下:
代码:
using UnityEngine;
public class LoadFile : MonoBehaviour
{
void Start()
{
TextAsset data = Resources.Load("TextRead") as TextAsset;
Debug.Log(data);
}
}
运行结果:
注意:这种方式只能读取文本文件,比如txt、XML、Json,特殊文本文件csv也可以读取。
Excel文件不支持。
还有一种方案是使用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
,那视频跟图片
以及特殊格式
该怎么加载呢?
以图片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拖入卡槽中:
运行结果:
其实代码都大同小异,参考如下:
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();
}
}
运行结果:
可以听到声音,没有问题。
没有办法。。。
你的点赞就是对博主的支持,有问题记得留言:
博主主页有联系方式。
博主还有跟多宝藏文章等待你的发掘哦:
专栏 | 方向 | 简介 |
---|---|---|
Unity3D开发小游戏 | 小游戏开发教程 | 分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。 |
Unity3D从入门到进阶 | 入门 | 从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。 |
Unity3D之UGUI | UGUI | Unity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。 |
Unity3D之读取数据 | 文件读取 | 使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。 |
Unity3D之数据集合 | 数据集合 | 数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。 |
Unity3D之VR/AR(虚拟仿真)开发 | 虚拟仿真 | 总结博主工作常见的虚拟仿真需求进行案例讲解。 |
Unity3D之插件 | 插件 | 主要分享在Unity开发中用到的一些插件使用方法,插件介绍等 |
Unity3D之日常开发 | 日常记录 | 主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等 |
Unity3D之日常BUG | 日常记录 | 记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。 |