外配系列文章(按需取用):
Unity 读取外配-第一集-网络请求UnityWebRequest读取txt内容_unity获取外部文本文件中文字-CSDN博客Unity 读取外配-第二集-IO.File形式读写txt内容_unity 怎么读取有个txt文件的-CSDN博客Unity 读取外配-第一集-网络请求UnityWebRequest读取txt内容_unity获取外部文本文件中文字-CSDN博客
Unity 读取外配-第三集-网络下载形式读取外部图片(简单但详细版)_unity读取外部文件-CSDN博客
Unity 读取外配-第四集-本地读取(IO.FileStream)形式读取图片_unity filestream-CSDN博客
目录
一、前言
需求:我有一个文件夹,里面有好多好多图片,我想软件自己读出来
我们先学习读取一个图片然后放入Image,再学习读取多个图片。
二、读取单个图片步骤
读取一个图片然后放入Image,拆分出来有以下几步:
1.写出你希望读取的文件夹的地址
2.读取这个文件夹里所有的文件名称
3.把这个文件夹里名称中和图片有关的文件名找出来
4.在unity里创建一个图片
5.用加载的图片替换掉创建的这个图片,并调整大小
三、单个图片逻辑实现
1.写出地址
假设我们希望读取"streamingAssetsPath/0"文件夹下的图片,则,我们的地址为:
Application.streamingAssetsPath + "/0"
2.读取文件夹下所有文件
读取某地址下的所有文件方法为:Directory.GetFiles(地址);
备注:
Directory的中文意思是目录,在Unity里是个类,这个类里有很多功能。
存储文件、组织文件(就是移动文件)、控制访问权限、搜索和导航等。
//获取应用里"streamingAssetsPath/0"文件夹下得文件名称
fileName = Directory.GetFiles(Application.streamingAssetsPath + "/0");
3. 筛选图片
把这个文件夹里名称中和图片有关的文件名找出来,我们常用的图片文件格式有:jpg、png、gif、bmp,我们通过后缀名筛选出来。
void Start()
{
string[] fileName ; //建一个string存所有的名字
//获取应用里"streamingAssetsPath/0"文件夹下得文件名称
fileName = Directory.GetFiles((Application.streamingAssetsPath + "/0"));
//如果获取到了,把和图片有关的挑出来
if (fileName.Length != 0)
{
for (int i = 0; i < fileName.Length; i++)
{
//获取文件的后缀,把是图片的挑出来并加载出来
string tmp = Path.GetExtension(fileName[i]);
if (tmp == ".jpg" || tmp == ".png" || tmp == ".gif" || tmp == ".bmp")
{
StartCoroutine(ReadPictureName(fileName[i])); //加载的方法,在下文
}
}
}
}
4.创建Image
先创建一个Image(如图1所示)
![](https://i-blog.csdnimg.cn/blog_migrate/2adb70708d3b870d0533512b27a50510.png)
3.将图片放入Image中
用加载的图片替换掉创建的这个图片,并调整大小
//加载图片
public Image image;//在外面创建的图片拖进来
IEnumerator ReadPictureName(string url) {
//“在url这个地址下有个图片,请下载下来”这件事写成一个要求
UnityWebRequest request = UnityWebRequestTexture.GetTexture(url);
yield return request.SendWebRequest(); //把上面这个要求发出去,并等待结果
//如果下载已经完成
if (request.isDone) {
if (request.isNetworkError || request.isHttpError) //如果网络错误,或者地址错误
{
Debug.Log(request.error); //输出这个错误
}
else //如果没错
{
//建一个2D图片,把request里的图片下载下来放进去
Texture2D texture2d = DownloadHandlerTexture.GetContent(request);
//建一个sprite格式的图片,把下载下来的图片转换格式,放进去;
括号里分别是(转换的对象,转换出来的图片的坐标,和宽高,
设置物体自身的坐标原点位置,00就是左下角,0.5,0.5就是中间,1,1就是右上角)
Sprite sprite = Sprite.Create(texture2d, new Rect(0, 0, texture2d.width, texture2d.height), new Vector2(0.5f, 0.5f));
//把Image里的图片替换掉
image.sprite = sprite;
}
}
}
四、多个文件夹中的图片读取
需求:我有一个文件夹,文件夹里有很多文件夹,我希望把每一个文件夹里的图片都读出来
重点语法:获取地址下所有文件夹的地址
//获取文件夹下文件夹的地址
string[] p = Directory.GetDirectories(path);
1.读取步骤
在之前的基础上增加逻辑:
1.获取文件夹内所有的地址
2.如果这些地址的后缀是图片格式
3.读取这些图片
2.补充需求代码
using System.IO;
using UnityEngine;
using UnityEngine.Networking;
public class Tool_ReadPics : MonoBehaviour
{
string path;
//建立一个图片List,放入所有读取到的图片
public List<Sprite> sprites;
void Start()
{
path = Application.streamingAssetsPath + "/photos";
StartCoroutine(ReadFolders(path));
}
IEnumerator ReadFolders(string path) {
//获取path下的所有地址
string[] allPath = Directory.GetFiles(path);
//判断这些地址是否是图片格式
foreach (string singlePath in allPath)
{
if(Path.GetExtension(singlePath)==".jpg"
|| Path.GetExtension(singlePath) == ".png")
{
yield return StartCoroutine(GetImageFromIO(singlePath));
}
}
//获取地址下所有文件夹的地址
string[] p = Directory.GetDirectories(path);
if (p.Length == 0)
{
}
else
{
foreach (string p0 in p)
{
yield return StartCoroutine(ReadFolders(p0));
}
}
}
//读取图片
IEnumerator GetImageFromIO(string path) {
UnityWebRequest request = UnityWebRequestTexture.GetTexture(path);
yield return request.SendWebRequest();
if (request.isDone)
{
if (request.isNetworkError || request.isHttpError)
{
Debug.Log(request.error);
}
else
{
Texture2D texture2d = DownloadHandlerTexture.GetContent(request);
//把Texture2D格式转换成sprite格式
Sprite sprite = Sprite.Create(texture2d, new Rect(0, 0, texture2d.width, texture2d.height), new Vector2(0.5f, 0.5f));
//把图片加入到sprites的List中
sprites.Add(sprite);
}
}
}
}